普中科技单片机AD电压数模转换。STC89C52和XPT2046 芯片

这篇博客详细介绍了使用普中科技ES2.0开发板上的STC89C52单片机配合XPT2046芯片进行AD电压数模转换的过程。内容涵盖AD转换原理、XPT2046芯片的功能特性和工作原理,以及具体的代码实现,包括读取和显示转换值。在实践中遇到的AD值跳动问题和数值转换注意事项也进行了讨论。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

普中科技ES2.0开发板学习日记

在这里插入图片描述


前言

使用单片机开发板进行AD电压数模转换。STC89C52和XPT2046 芯片。


一、AD数模转换的原理

数/模定义

模拟量:自然界连续变化的物理量。所谓连续,包含两个方面的含义;一方面从时间上来说,它是随时间连续变化的;另一方面从数值上来说,它的数值也是连续变化的。这种连续变化的物理量通常称为模拟量。

数字量:计算机中处理的是不连续变化的量,离散性的数字量。

AD转换的主要技术指标

1、分辨率
ADC的分辨率是指使输出数字量变化一个相邻数码所需输入模拟电压的变化量。用二进制表示,数值为1/2^n,**即八位分辨率为1/255,12位分辨率为1/4095。**举个例子,如果你的电压最大为5V,分辨率为8位,分辨率为255,那么你ad采样的数值显示为255,此时就是5V的满电压。如果是200,那么实际电压就是5/255*200V。
2、量化误差
ADC把模拟量变为数字量,用数字量近似表示模拟量,这个过程称为量化。量化误差是ADC的有限位数对模拟量进行量化而引起的误差。
3、偏移误差
偏移误差是指输入信号为零时,输出信号不为零的值,所以有时又称为零值误差。
4、满刻度误差
满刻度误差又称为增益误差。ADC的满刻度误差是指满刻度输出数码所对应的实际输入电压与理想输入电压之差。
5、线性度
线性度有时又称为非线性度,它是指转换器实际的转换特性与理想直线的最大偏差。
6、绝对精度
在一个转换器中,任何数码所对应的实际模拟量输入与理论模拟输入之差的最大值,称为绝对精度。
7、转换速率
ADC的转换速率是能够重复进行数据转换的速度,即每秒转换的次数。而完成一次A/D转换所需的时间(包括稳定时间),则是转换速率的倒数。

XPT2046 的介绍

1.功能介绍

XPT2046 是一个内含 12 位分辨率 125KHz 转换速率逐步逼近型 A/D 转换器。XPT2046 支持从 1.5V 到 5.25V 的低电压 I/O 接口。

2.主要特性

工作电压范围为 1.5V~5.25V
支持 1.5V~5.25V 的数字 I/O 口
内建 2.5V 参考电压源
电源电压测量(0V~6V)
内建结温测量功能
触摸压力测量
采用 3 线制 SPI 通信接口
具有自动省电功能

3.工作原理和图表(数据手册)

工作原理

数据手册中有说明,在使用ADC功能的时候配置为单端模式或差分模式;模式配置说明图如下:

在这里插入图片描述
在这里插入图片描述

通过观察开发板上面的ad模块我们可以知道,我们如果测量通道AIN2和3需要用到AUX引脚所以配置选择单端模式。

在这里插入图片描述
                                             控制字节的描述

通过上图和开发板AD模块原理图可以得到,我们如果使用12位分辨率单端模式测量AIN1(可调电阻),那么我们输入DIN端就要控制字命令寄存器值为0x94(1001 1000)或0xB4(1011 1000)。同理如果要检测转换热敏电阻模拟信号,控制字命令寄存器值为0XD4;要检测转换光敏电阻模拟信号,控制字命令寄存器值为0XA4;测转换AIN3通道上模拟信号,控制字命令寄存器值为0XE4.

在这里插入图片描述
                                             XPT2046时序图

二、XPT2046AD转换代码

1.写入部分

在这里插入图片描述

void SPI_Write(uchar dat)
{
   
	uchar i;
	CLK = 0;
	for(i=0; i<8; i++)
	{
   
		DIN = dat >> 7;  	//放置最高位
		dat <<= 1;
		CLK = 0;			//上升沿放置数据

		CLK = 1;

	}
}

2.读取数据

uint SPI_Read(void)
{
   
	uint i, dat=0;
	CLK = 0;
	for(i=0; i<12; i++)		//接收12位数据
	{
   
		dat <<= 1;

		CLK = 1;
		CLK = 0;

		dat |= DOUT;

	}
	return dat;	
}

3.读取通道转换的数据

uint Read_AD_Data(uchar cmd)
{
   
	uchar i;
	uint AD_Value;
	CLK = 0;
	CS  = 0;
	SPI_Write(cmd);
	for(i=6; i>0; i--); 	//延时等待转换结果
	CLK 
<think>嗯,用户现在问的是51单片机AD模块。首先,我需要确认用户的问题到底是什么。AD模块通常指的是模数转换模块,也就是将模拟信号转换成数字信号的部分。51单片机其实指的是Intel的8051系列单片机,但原生的8051是没有内置AD模块的,所以用户可能指的是带有AD功能的增强型51兼容单片机,比如STC89C52的一些变种或者STC12、STC15系列,或者其他厂商的兼容型号。 接下来,我需要考虑用户可能的背景。用户可能刚开始接触单片机,或者在做项目时需要用到AD转换,但不太清楚具体怎么操作。他们可能想知道如何选择带有AD模块的51单片机,或者如何外接AD芯片,以及编程方法。 用户的问题比较广泛,所以回答需要覆盖几个方面:内置AD模块的常见51单片机型号、外置AD转换芯片的方法、以及基本的代码示例。同时,要澄清原生8051没有AD模块,避免混淆。 需要检查用户之前的问题历史,之前他们问过XPT2046,这是一个触摸屏控制器,可能他们现在在做触摸屏或者需要AD转换相关的项目。可能需要关联之前的回答,确保信息的一致性。 另外,用户可能对AD转换的基本原理不太清楚,比如分辨率、采样率、参考电压等参数,所以需要简要解释这些概念。同时,开发注意事项比如参考电压稳定性、抗干扰措施也很重要,避免他们在实际应用中遇到问题。 还要考虑用户可能的误区,比如直接使用原生8051单片机而没有AD模块,导致无法进行模数转换。这时候需要提醒他们选择正确的型号或者外接芯片。 最后,给出示例代码,并注明是伪代码,需要根据具体型号调整,这样用户可以根据自己的硬件进行修改。同时,提供替代方案,比如使用外置AD芯片,如ADC0804、PCF8591,或者集成模块,帮助他们扩展思路。 总结回答的结构:先说明原生51的情况,再介绍内置AD的增强型号,然后讲外置AD的方案,接着是开发要点,最后代码示例替代方案。这样结构清晰,用户能逐步了解如何实现AD转换功能。</think>--- ### 一、51单片机AD模块的关系 **核心结论**: - **原生8051单片机(如AT89C51)无内置AD模块**,需通过外接ADC芯片或选择增强型51内核单片机(如STC12/15系列)。 - **AD模块作用**:将模拟信号(如温度、电压)转换为数字信号,供单片机处理。 --- ### 二、实现AD转换的两种方案 #### 方案1:外接独立ADC芯片(适用于基础51单片机) 1. **常用芯片** - **ADC0804**(8位分辨率,并行输出) - **PCF8591**(8位分辨率,I²C接口) - **XPT2046**(12位分辨率,SPI接口,兼容电阻触摸屏) 2. **典型电路连接** ```c // 以ADC0804为例(51单片机连接) sbit ADC_CS = P2^0; // 片选 sbit ADC_RD = P2^1; // 读信号 sbit ADC_WR = P2^2; // 写信号 sbit ADC_INTR= P2^3; // 转换完成中断 ``` #### 方案2:选择内置AD的增强型51单片机 1. **推荐型号** - **STC12C5A60S2**:8通道10位ADC,速度约$100kHz$ - **STC15W4K32S4**:8通道12位ADC,支持差分输入 - **C8051F系列**:高精度16位ADC(如C8051F350) 2. **关键参数对比** | 型号 | 分辨率 | 采样率 | 接口类型 | |---------------|--------|---------|---------------| | STC12C5A60S2 | 10位 | 100kHz | 并行控制 | | STC15W4K32S4 | 12位 | 500kHz | 寄存器配置 | | C8051F350 | 16位 | 1MHz | SPI/I²C | --- ### 三、AD模块开发要点 1. **硬件设计** - **参考电压**:需稳定(如使用TL431提供$V_{\text{ref}}=2.5V$) - **信号调理**:添加RC滤波电路(如$R=1k\Omega$, $C=0.1\mu F$) - **接地隔离**:模拟地与数字地单点连接 2. **软件流程**(以STC15系列为例) ```c void ADC_Init() { P1ASF = 0x01; // 启用P1.0作为ADC输入 ADC_RES = 0; // 清空结果寄存器 ADC_CONTR = 0x80; // 开启ADC电源 Delay_ms(1); // 等待稳定 } uint16_t ADC_Read(uint8_t ch) { ADC_CONTR = 0x80 | (ch << 3); // 选择通道 _nop_(); _nop_(); // 等待切换 ADC_START = 1; // 启动转换 while (!ADC_FLAG); // 等待完成 return (ADC_RES << 2) | ADC_RESL; // 合并10/12位数据 } ``` --- ### 四、常见问题与优化 1. **精度提升** - 多次采样取平均(如16次采样) - 公式:$$ V_{\text{avg}} = \frac{1}{N} \sum_{i=1}^{N} V_{\text{sample}} $$ 2. **噪声抑制** - 添加屏蔽层(对模拟信号线) - 避免高频数字信号与ADC线路并行走线 --- ### 五、替代方案建议 - **集成模块**:可直接采购ADC模块(如ADS1115,I²C接口,16位精度) - **电压频率转换**:通过LM331将模拟量转为频率信号,用单片机计数器测量 --- 若需特定型号的完整代码或电路图,请提供具体单片机型号(如STC12C5A60S2),将为您补充详细实现方案。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值