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

目录

一、功能描述

二、ADC介绍

2.1 逐次逼近型ADC转换原理

2.2 ADC的主要技术指标

三、XPT2046芯片介绍

3.1 XPT2046外部引脚

3.2 XPT2046的命令字

3.3 XPT2046时序图

四、测试文件test.c

扫描二维码关注公众号,回复: 16872945 查看本文章

五、实验现象


一、功能描述

        我们使用的 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上。

猜你喜欢

转载自blog.csdn.net/ssssshhbh/article/details/129315742
今日推荐