51单片机-实现ADC模数转换(电位器、光敏电阻、热敏电阻)模块教程
本章详细讲解:ADC模式转换原理、XPT2046芯片、实现电位器、光敏电阻传感器、热敏电阻传感器ADC模数转换实验;
本章概述思维导图:

51单片机实现ADC模数转换(电位器、光敏电阻、热敏电阻)教程
ADC简介
ADC(Analog-to-Digital Converter,模数转换器)是连接模拟信号与数字信号的桥梁,其核心功能是将连续变化的模拟信号(如电压、电流)转换为离散的数字信号。其转换过程通常分为四个步骤:
采样:以固定时间间隔对模拟信号进行“快照”,就是连续变换的模拟量经过时间间隔分 解成离散的模拟量。
保持:在采样瞬间锁定信号值,确保转换期间信号不变。就是将采样结果存储起来。直 到下次采样
量化:将连续信号幅度划分为离散电平,量化电平数由分辨率决定。
编码:将量化后的电平转换为二进制数字码。
ADC应用

第一步:各个类型的传感器采集到的物理量(温度值、亮度值、压力值等)转换输出电压传输给ADC(模数转换器);
第二步:ADC(模数转换器)将电压转换为数字量提供给单片机处理;
第三步:单片机根据数据会实现某些控制或者显示;
ADC核心参数
一、ADC分辨率(刻度划分)
定义:分辨率指ADC能区分的最小电压变化,通常用位数(bit)表示。比如:8、10、12、16位等。n位ADC可输出2ⁿ个离散值,将输入电压范围划分为2ⁿ个等份。
计算公式:
最小可分辨电压 = 满量程电压FSR/ 2ⁿ
示例:12位ADC,FSR=5V时,最小分辨电压为5V/4096≈1.22mV。
二、ADC转换误差
误差来源:
量化误差:用数字量近似表示模拟量。采用四舍五入原则,此过程产生的误差为量化误差。
原理:量化过程将连续信号离散化,必然存在最小分辨间隔的误差。
示例:12位ADC在3.3V参考电压下,量化误差约为0.8mV。
特点:无法消除,但可通过提高分辨率降低影响。
偏移误差:
表现:零输入时输出非零值(如STM32 ADC典型偏移误差±2LSB)。
校准:通过软件补偿(如两点校准法)可压缩至±0.5LSB。
增益误差:
表现:转换曲线斜率偏离理想值。
校准:通过测量零点和满量程点建立线性补偿模型。
非线性误差:
积分非线性(INL):反映传输函数与理想直线的最大偏差。
微分非线性(DNL):相邻码宽离散程度(DNL>1LSB会引发丢码现象)。
环境干扰:
温度漂移:参考电压随温度变化。
电源噪声:纹波耦合导致有效位数下降。
三、精度(物理量的精准程度)
定义:最小刻度基础上叠加各种误差的参数,精度受ADC性能、温度和气压影响
四、转换时间
定义:表示完成一次A/D转换所需要的时间,转换时间越短,采样率就可以越高。
五、ADC转换速率
定义:转换速率指ADC每秒能完成的完整转换次数,单位为SPS(Samples Per Second)。例如,100kSPS表示每秒最多转换100,000次。完成一次A/D转换所需的时间,则是转换速率的倒数。
ADC类型
在将采样电平(模拟值)转换为数字值时,直接比较型和间接比较型是两类核心方法,它们通过不同的机制实现模数转换(ADC),适用于不同的应用场景。
一、直接比较型
直接比较型ADC通过实时比较输入电压与参考电压,直接生成数字码,无需中间转换步骤。其典型代表是逐次逼近型ADC(SAR ADC)和并行比较型ADC(Flash ADC)。
1、逐次逼近型ADC(SAR ADC)

工作原理:
采用二分搜索法,通过逐位比较确定输入电压对应的数字码。
步骤:
1、采样保持电路锁定输入电压 Vin。
2、SAR寄存器从最高位(MSB)开始,依次置1,DAC生成对应模拟电压 VDAC。
3、比较器判断 Vin与 VDAC的大小,更新SAR寄存器位。
4、重复上述过程,直到最低位(LSB)确定,输出最终数字码。
2、并行比较行ADC(Flash ADC)
工作原理:
通过电阻分压网络生成多个参考电压,同时使用多个比较器并行比较输入电压与各参 考电压,直接输出温度计码,再经编码器转换为二进制码。
步骤:
1、电阻网络将参考电压 Vref 分压为 2N−1 个等间隔电压。
2、2N−1 个比较器同时比较 Vin 与各分压点电压。
3、编码器将比较器输出(温度计码)转换为二进制码。
二、简介比较型ADC
间接比较型ADC通过中间变量(如时间、频率、电荷)间接推导输入电压对应的数字码,典型代表是双积分型ADC和Σ-Δ调制型ADC。
1、双积分型ADC

工作原理:
通过两次积分将输入电压转换为时间间隔,再利用计数器测量时间间隔实现转换。
步骤:
1、复零阶段:积分器输出归零,计数器清零。
2、定时积分阶段:积分器对输入电压 Vin积分,输出线性下降电压
3、定值积分阶段:积分器对参考电压 −Vref反向积分,输出线性上升电压
4、当 Vo回升至零时,计数器停止,计数值 N2与 Vin成正比:
2、Σ-Δ调制型ADC
工作原理:
通过过采样和噪声整形技术,将输入电压转换为高频脉冲密度,再经数字滤波器降 采样得到高分辨率数字码。
步骤:
1、Σ-Δ调制器:
积分器对输入电压与反馈电压的差值积分。
比较器将积分结果转换为1位数字输出(0或1)。
反馈环路通过DAC将数字输出转换为模拟电压,形成负反馈。
2、数字滤波器:对高频脉冲流进行降采样和滤波,提高信噪比(SNR)
XPT2046芯片简介
XPT2046是一款专为四线制电阻触摸屏设计的控制器芯片,内含12位分辨率、125kHz转换速率的逐步逼近型模数转换器(SAR ADC)。其核心功能是通过两次A/D转换确定触摸点的坐标,同时支持触摸压力测量、温度监测和电池电压检测(0V~6V)。该芯片采用低功耗设计,在2.7V电压下功耗仅750μW,适合电池供电设备,如PDA、手机、便携式仪器等。如图所示:

XPT2046芯片核心特性
1、高精度与高速转换
12位分辨率,支持可编程8位或12位模式,满足不同精度需求。
125kHz转换速率,快速响应触摸操作。
2、低功耗设计
工作电压范围1.5V~5.25V,支持1.5V~5.25V数字I/O接口。
内置自动掉电功能,在空闲时降低功耗至微瓦级
3、多功能集成
触摸屏接口:支持四线制电阻触摸屏,通过XP、XN、YP、YN引脚连接。
辅助输入:1路AUX通道,可用于外部模拟信号采集。
温度传感器:内置温度检测电路,可监测环境或芯片温度。
电池监测:直接测量电池电压(0V~6V),无需额外电路。
4、灵活的参考电压
内置2.5V参考电压源,也可外接1V~VCC范围的参考电压(需低输出阻抗)。
5、多种工作模式
单端模式:适用于VBAT、Temp、AUX等非触摸信号测量,功耗较低。(ADC模数转换)
差分模式:用于X/Y坐标和触摸压力测量。(检测屏幕X/Y坐标)
XPT2046芯片引脚定义



|
引脚序号 |
引脚名称 |
类型 |
功能描述 |
|
1 |
XP |
输入 |
X轴正极电极接口,连接触摸屏X+电极 |
|
2 |
XN |
输入 |
X轴负极电极接口,连接触摸屏X-电极 |
|
3 |
YP |
输入 |
Y轴正极电极接口,连接触摸屏Y+电极 |
|
4 |
YN |
输入 |
Y轴负极电极接口,连接触摸屏Y-电极 |
|
5 |
VBAT |
输入 |
电池电压监测输入(0V~6V) |
|
6 |
AUX |
输入 |
辅助模拟量输入(单端/差分模式) |
|
7 |
VREF |
输入 |
参考电压输入(1V~VCC,或内部2.5V) |
|
8 |
VCC |
电源 |
芯片主电源输入(2.7V~5.5V) |
|
9 |
GND |
电源 |
芯片接地端 |
|
10 |
DIN |
输入 |
SPI数据输入(控制命令传输) |
|
11 |
DOUT |
输出 |
SPI数据输出(转换结果传输) |
|
12 |
DCLK |
输入 |
SPI时钟信号(同步数据传输) |
|
13 |
CS |
输入 |
SPI片选信号(低电平有效) |
|
14 |
PENIRQ |
输出 |
笔触中断信号(低电平表示触摸发生) |
|
15 |
BUSY |
输出 |
忙状态指示(高电平表示转换中) |
|
16 |
IOVDD |
电源 |
数字电源输入端 |
1、触摸屏接口引脚(XP、XN、YP、YN)
功能:四线制电阻触摸屏的电极连接端,用于测量触摸点的X/Y坐标。
工作原理:
测量X坐标时,XP引脚施加VCC,XN接地,通过YP或YN引脚采集电压值,计算 X轴 电阻比例。
测量Y坐标时,YP引脚施加VCC,YN接地,通过XP或XN引脚采集电压值,计算 Y轴电阻比例。
2、辅助功能引脚(VBAT、AUX、VREF)
VBAT:
用于监测电池电压(0V~6V),通过内部ADC转换为数字值,适用于便携设备电池管理。
需注意输入电压不超过6V,避免损坏芯片。
AUX:
辅助模拟量输入通道,支持单端或差分模式,可连接外部传感器(如光敏、热敏电阻)。
差分模式可抑制共模噪声,提高测量精度。
VREF:
提供ADC转换的参考电压,范围1V~VCC。若使用内部2.5V参考电压,此引脚需悬空。
外部参考电压需低输出阻抗,确保ADC精度。
3、电源与接地引脚(VCC、GND、IOVDD)
VCC:芯片主电源输入,工作电压2.7V~5.5V,需稳定供电以避免测量误差。
GND:芯片接地端,需与系统地良好连接,降低噪声干扰。
IOVDD:数字电源输入端:为芯片内部数字电路提供电源。
4、SPI接口引脚(DIN、DOUT、DCLK、CS)
DIN:SPI数据输入引脚MOSI脚,接收主机发送的8位控制字节,配置通道选择、分辨率、工作 模式等参数。
DOUT:SPI数据输出引脚MISO脚,传输12位或8位A/D转换结果。
DCLK:SPI时钟信号引脚,上升沿输入数据,下降沿输出数据,同步数据传输。
CS:SPI片选信号,低电平有效,启动SPI通信,结束后拉高以结束时序。
5、控制与状态引脚(PENIRQ、BUSY)
PENIRQ(笔触中断):
低电平有效,当检测到触摸动作时输出中断信号,用于唤醒主机或触发中断处理。
可配置为持续低电平或脉冲模式,适应不同应用需求。
BUSY(忙状态):
高电平表示芯片正在进行A/D转换,转换完成后恢复低电平。
主机可通过检测此引脚状态避免在转换过程中发送新命令。
XPT2046芯片工作原理
1、坐标测量流程
X坐标测量:
1、在X+电极施加VCC,X-接地。
2、通过Y+或y-电极测量电压值,计算RX+、RX-阻值关系。
Y坐标测量:
1、在Y+电极施加VCC,Y-接地。
2、通过X+或x-电极测量电压值,计算RY+、RY-阻值关系。
两次测量组成一个周期,得到一组(X,Y)坐标。
2、ADC转换控制(模数转换)
通过SPI接口发送8位控制字节,配置通道选择、分辨率、工作模式等。
转换过程需24个时钟周期(DCLK):
1、前8个时钟输入控制字节。
2、后续12个时钟完成模数转换。
3、最后4个时钟输出结果(高12位有效)。
3、差分模式优势
在X/Y坐标测量中,差分模式将+REF和-REF分别连接到YP、YN,消除驱动开关导通电 阻引入的误差,提高测量精度。
XPT芯片应用(两种应用1.触摸屏坐标测量;2.ADC模数转换)
作为ADC功能时可以配置为单端或差分模式,但是选择VBAT、Temp和AUX时应该配置为单端模式;作为触摸屏应用时,应该配置为差分模式,这可有效消除由于驱动开关的寄生电阻及外部的干扰带来的测量误差,提高转换精度。
一、触摸屏坐标测量
差分模式(SER/DFR=0):
测量X坐标:XP与XN作为差分输入,YP/YN提供驱动电压。
测量Y坐标:YP与YN作为差分输入,XP/XN提供驱动电压。
优势:消除驱动开关寄生电阻误差,提高精度。
流程:
1、发送控制字(如0x90测量X坐标)。
2、芯片自动完成采样、保持、转换。
3、通过DOUT读取12位数字结果(高位在前)。
二、ADC模数转换(辅助输入测量)
单端模式(SER/DFR=1):
支持VBAT(电池电压)、TEMP(温度)、AUX(外部信号)测量。
参考电压:可使用内部2.5V或外部1V~VCC电压。
使用XPT2046芯片前,要先发送一字节控制指令字节;控制指令字节格式如图所示:


|
位序 |
名称 |
功能描述 |
|
7 |
S |
起始位,必须为1(用于同步) |
|
6-4 |
A2-A0 |
通道选择,决定测量对象(X/Y坐标、电池电压、温度等) |
|
3 |
MODE |
分辨率选择位:1为:8为转换分辨率、0为:12位转换分辨率 |
|
2 |
SER/DFR |
模式选择:0=差分模式(触摸屏坐标测量),1=单端模式(电池/温度/AUX输入) |
|
1 |
PD1 |
内部参考电压控制:0=关闭(省电),1=开启 |
|
0 |
PD0 |
保留位(通常置0) |
选择那个引脚作为ADC转换通道由控制字节的A2~A1位选择如图:

发送一字节控制指令时序如图所示(传输方向:高位->低位):

XPT2046芯片硬件电路原理分析:

分析原理图:因为本次实验实现ADC模数转换,所以XPT2046的部分引脚并没有使用到
第一部分:SPI通信引脚
DIN引脚连接了单片机的P34管脚用作SPI的MOSI主机输出从机输入功能
CS引脚连接了单片机的P35管脚用作SPI的片选功能
DCLK引脚连接了单片机的P36管脚用作SPI的时钟线功能
DOUT引脚连接了单片机的P37管脚用作SPI的MISO主机输入从机输出功能
第二部分:电源电压部分
VCC引脚连接开发板电源电压
IOVDD引脚连接开发板电源电压
VREF引脚连接开发板电源电压,参考电压并没有选择XPT2046芯片的内部电压2.5V,而是选择开发板电源电压5V
GND引脚连接开发板地
第三部分:ADC模数转换通道选择
X+引脚连接AIN0(网络编号),AIN0是连接电位器
Y+引脚连接AIN1(网络编号),AIN1是连接热敏电阻
VBAT引脚连接AIN2(网络编号),AIN2是连接光敏电阻
AUX引脚连接AIN3(网络编号),AIN3连接端子引出来,方便其他模块采集模拟电压值
XPT2046芯片软件编程设计
本次软件设计实现电位器、光敏传感器、热敏电阻模数转换实验

实现步骤:
1、使用XPT2046芯片ADC模数转换前,要输入一个控制指令;所以我们要实现XPT2046芯片写入一字节函数;
sbit XPT2046_MOSI=P3^4;
sbit XPT2046_MISO=P3^7;
sbit XPT2046_CS=P3^5;
sbit XPT2046_SCLK=P3^6;
void XPT2046_write_byte(u8 dat) //XPT2046写入一字节数据函数
{
u8 i=0;
XPT2046_SCLK=0; //时钟线低电平
_nop_(); //延时一点时间
for(i=0;i<8;i++) //发送一字节数据:高位->低位
{
XPT2046_MOSI=dat>>7;
dat<<=1;
XPT2046_SCLK=1; //上升沿发送
_nop_(); //延时一点时间
XPT2046_SCLK=0;
}
}
2、ADC转换完成后,会传输12位ADC值;所以我们要是实现读取XPT2046芯片传输的12位数据值函数;
u16 XPT2046_read_data(void) //XPT2046芯片读取12位数据函数
{
u8 i=0;
u16 dat=0;
XPT2046_SCLK=0; //时钟线低电平
_nop_(); //延时一点时间
for(i=0;i<12;i++)
{
dat<<=1;
XPT2046_SCLK=1; //时钟线高电平
_nop_(); //延时一点时间,下降沿
XPT2046_SCLK=0; //时钟线低电平
_nop_();
dat|=XPT2046_MISO; //读取数据
}
return dat;
}
3、实现发送控制指令读取XPT2046芯片模数转换ADC值函数,形参为:XPT2046芯片控制指令
u16 XPT2046_read_ADC_data(u8 cmd) //读取XPT2046芯片模数转换电压值,形参为:XPT2046芯片控制指令
{
u16 ADC_data=0;
XPT2046_CS=0; //片选信号拉低占用总线
XPT2046_SCLK=0; //时钟线空闲电平低电平
XPT2046_write_byte(cmd); //发送控制指令
XPT2046_SCLK=0; //一个时钟周期代表BUSY忙信号
_nop_();
XPT2046_SCLK=1;
_nop_();
ADC_data=XPT2046_read_data(); //读取ADC模数转换值
XPT2046_CS=1; //片选信号拉高释放总线
XPT2046_SCLK=0; //时钟线空闲电平为低电平
return ADC_data;
}
4、主函数联合XPT2046芯片读取数据函数和数码管显示函数(实现电位器ADC转换)
int main()
{
u16 temp_ADC; //ADC值
float temp_value; //电压值
u8 ADC_buffer[3]=0;
while(1)
{
temp_ADC=XPT2046_read_ADC_data(0x94); //配置电位器转换ADC通道
temp_value=temp_ADC*5.0/4096; //电压转换公式为:电压值=ADC值*参考电压/(2的n次方);n为分辨率位数
temp_ADC=temp_value*10;
ADC_buffer[0]=Display[temp_ADC/10]|0x80;
ADC_buffer[1]=Display[temp_ADC%10];
ADC_buffer[2]=0x3E;
DIGITALTUBE_EEPROM_Display2(ADC_buffer,6);
}
}
主函数联合XPT2046芯片读取数据函数和数码管显示函数(实现光敏电阻ADC转换)
void main()
{
u16 adc_value=0;
float adc_data=0;
u8 adc_buf[3];
while(1)
{
adc_value=xpt2046_read_adc_value(0xA4);//测量光敏电阻
adc_data=adc_value*5.0/4096;
adc_value=adc_data*10;
adc_buf[0]=gsmg_code[adc_value/10]|0x80;
adc_buf[1]=gsmg_code[adc_value%10];
adc_buf[2]=0x3e;
smg_display(adc_buf,6);
}
}
主函数联合XPT2046芯片读取数据函数和数码管显示函数(实现热敏电阻ADC转换)
void main()
{
u16 adc_value=0;
float adc_data=0;
u8 adc_buf[3];
while(1)
{
adc_value=xpt2046_read_adc_value(0xD4);//测量热敏电阻
adc_data=adc_value*5.0/4096;
adc_value=adc_data*10;
adc_buf[0]=gsmg_code[adc_value/10]|0x80;
adc_buf[1]=gsmg_code[adc_value%10];
adc_buf[2]=0x3e;
smg_display(adc_buf,6);
}
}
细节:
电压值转换公式为:电压值=ADC值*参考电压 / (2的n次方);n为ADC的分辨率参数;
效果展示:(如图是电位器的效果展示,光敏电阻和热敏电阻都跟展示图相识就不一一展示)

制作不易!喜欢的小伙伴给个小赞赞!喜欢我的小伙伴点个关注!有不懂的地方和需要的资源随时问我哟!
更多推荐



所有评论(0)