51单片机——ADC模数转换实验

目录

一、功能描述

二、ADC介绍

2.1 逐次逼近型ADC转换原理

2.2 ADC的主要技术指标

三、XPT2046芯片介绍

3.1 XPT2046外部引脚

3.2 XPT2046的命令字

3.3 XPT2046时序图

四、测试文件test.c

五、实验现象


一、功能描述

        我们使用的 STC89C51单片机内部不含 ADC 接口,所以需要外接一个 ADC 转换芯片将模拟信号转换成数字信号供单片机处理。我们开发板上集成了一个 ADC 模数转换电路,选用的 ADC 芯片是 12 位的 AD 芯片-XPT2046。本次实验通过ADC转换电路,采集电位器AD的电压值、热敏电阻NTC电路的电压值、光敏电阻GR电路的电压值,并将转换后的数字量显示在LCD1602上。

二、ADC介绍

        我们知道 51 单片机系统内部运算时用的全部是数字量,即 0 和 1,因此对单片机系统而言,无法直接操作模拟量,必须将模拟量转换成数字量。所谓数字量,就是用一系列 0 和 1 组成的二进制代码表示某个信号大小的量。用数字量表示同一个模拟量时,数字位数可以多也可以少,位数越多则表示的精度越高, 位数越少表示的精度就越低。

2.1 逐次逼近型ADC转换原理

        采用逐次逼近法的 AD 转换器是有一个比较器、DA 转换器、缓冲寄存器和控 制逻辑电路组成,如下图所示:

        逐次逼近法的转换过程是:初始化时将逐次逼近寄存器各位清零,转换开始时,先将逐次逼近寄存器最高位置 1,送入 DA 转换器,经 DA 转换后生成的模拟量送入比较器,称为 U0,与送入比较器的待转换的模拟量 Ux 进行比较,若U0<Ux,该位1保留,否则清除。然后再将逐次逼近寄存器次高位置 1,将寄存器中新的数字量送 DA 转换器,输出的 U0 再与 Ux 比较,若 U0<Ux,该位1保留,否则清除。重复此过程,直至逼近寄存器最低位。转换结束后,将逐次逼近寄存器中的数字量送入缓冲寄存器,得到数字量的输出。逐次逼近的操作过程是在一个控制电路的控制下进行的。

2.2 ADC的主要技术指标

  1. 分辨率:是指对于允许范围内的模拟信号,它能输出离散数字信号值的个数。12位ADC的分辨率就是12位,一个 10V满刻度的 12位 ADC能分辨输入电压变化最小值是:10Vx(1÷12)=2.4mv。
  2. 转换速率:是能够重复进行数据转换的速度,即每秒转换的次数。而完成一次 A/D转换所需的时间(包括稳定时间),则是转换速率的倒数。

三、XPT2046芯片介绍

        XPT2046是一种典型的逐次逼近型模数转换器(SAR ADC),包含了采样/保持、模数转换、串口数据输出等功能。 XPT2046的通信方式是SPI。

3.1 XPT2046外部引脚

  • CS:片选端。
  • DIN:串行数据输入端
  • DCLK:外部时钟输入端
  • DOUT:串行数据输出端
  • X+、Y+、X-、Y-:位置选择端
  • VBAT:电池监视输入端
  • AUX:ADC辅助输入通道
  • CS、DIN、DCLK和DOUT分别接单片机的对应引脚,X+、Y+、VBAT分别输入要转换的模拟信号。

    3.2 XPT2046的命令字

      其中选择通道位A2-A0,如下图所示:

    3.3 XPT2046时序图

    1. 主机通过DIN,发送命令字给XPT2046,XPT2046在DCLK高电平时读取数据。
    2. XPT2046将转换好的数字量通过DOUT发送给主机,主机在DCLK高电平时读取数据。

    程序如下:

    #include <REGX52.H>
    sbit XPT2064_DIN=P3^4;
    sbit XPT2064_CS=P3^5;
    sbit XPT2064_DCLK=P3^6;
    sbit XPT2064_DOUT=P3^7;
    /*
         *函数名:	 XPT2064_ReadAD(unsigned char command)
         *函数功能: 主机发送命令字给XPT2046,XPT2046将转换的数字量发送给主机
         *输入:	 command:命令字
         *输出:	 D_num:转换好的数字量
    */
    unsigned int XPT2064_ReadAD(unsigned char command)
    {
    	unsigned int D_num=0;
    	unsigned char i=0;
    	XPT2064_CS=0;
    	for(i=0;i<8;i++)
    	{	
    		XPT2064_DIN=command&(0x80>>i);
    		XPT2064_DCLK=1;
    		XPT2064_DCLK=0;
    	}
    	for(i=0;i<16;i++)
    	{
    		XPT2064_DCLK=1;
    		if(XPT2064_DOUT==1)D_num|=0x8000>>i;
    		XPT2064_DCLK=0;
    	}
    	return D_num/128;
    }
    

    四、测试文件test.c

    #include <REGX52.H>
    #include "Delay.h"
    #include "LCD1602.h"
    #include "XPT2046.h"
    #define XPT2046_XP   0x9c
    #define XPT2046_YP   0xdc
    #define XPT2046_VBAT 0xac
    #define XPT2046_AUX  0xec
    int main()
    {
    	unsigned int AD,NTC,GR=0;
    	LCD_Init();
    	while(1)
    	{
    		AD=XPT2064_ReadAD(XPT2046_XP);
    		NTC=XPT2064_ReadAD(XPT2046_YP);
    		GR=XPT2064_ReadAD(XPT2046_VBAT);
    		LCD_ShowString(1,1,"AD");
    		LCD_ShowString(1,5,"NTC");
    		LCD_ShowString(1,9,"GR");
    		LCD_ShowNum(2,1,AD,3);
    		LCD_ShowNum(2,5,NTC,3);
    		LCD_ShowNum(2,9,GR,3);
    		Delay(10);
    	}
    }

    五、实验现象

            当转动电位器、传递热量给热敏电阻NTC或者改变环境的光照,也就是改变电压模拟量,通过ADC转换后得到对应的数字量,并把它们显示在LCD1602上。

    物联沃分享整理
    物联沃-IOTWORD物联网 » 51单片机——ADC模数转换实验

    发表评论