51 单片机AD采集电压值的坑

博主在低功耗项目中遇到电压检测问题,使用分压电路后AD采集到的电压不正确。通过理论分析与实测,发现1M欧姆电阻造成的电流过小导致AD无法准确采集。更换为5K欧姆电阻后,电流增大,AD采集恢复正常。问题解决关键在于确保AD采集端点的电流大小。

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

1.引言

最近又在忙低功耗相关项目,需要对设备电池进行电压进行检测,ad采集的例程原厂都有给到,相关的文件说明都有,但是理想和现实还是比较骨感的,采集的电压总是不对,调了两天,赶在周末前终于发现了问题。完美!!可能稍微不完美的就是原厂的技术支持,根本就不支持,发了微信都不回复,态度不太行。。。。。不过最后还是自己发现了问题,真解气!

2.现象

电压检测使用的是单片机的引脚,但电池电压一般为4.2v,大于GPIO的承受电压3.3v,所以需要一个分压电路,分压电路原理图如下图所示。

 上图中R7和R8是分压电阻,使用的阻值都是1M的电阻,通过理论分析,测量端点应该是2.5V,但是ad采集出来的内容却不是,甚至是0.几V,真是瞎了,跟所学的理论知识完全对不上,然后问原厂的人,原厂的人说肯定是分压电阻有问题,让我们看看,然后。。。。。就没有然后了,都不知道看什么,他们啥都不说,真的气人。

然后我们拿开发板用同样的代码去测试,直接将测量点接到一个较高电压值得端点,比如:3.3v的位置,然后是正常的。但是接到上图的测量端点,却是不行,但问题在于:我用电压表去测量上图的测量端点是正常的2.5V

所以真的...无语.....

3.发现问题

在测试的过程中,使用了一个小的电阻进行分压测试,然后突然就真的可以了,显示了测量端点理论的电压值,经分析。一开始我们用的是1M+1M的电阻,通过测量端点的电流只有大约0.5ua,真的太小了,导致无法测量出端点的电压值,换了小电阻5K+5K之后,经过测量端点的电流0.5mA,这时AD就可以正常采集电压值了。

总结:ad在采集电压的时候,采集端点允许通过的电流不能太小???但是电压表可以测量出来,奇了怪了,但问题解决就是减小分压电路的电阻,让通过测量端点的电流大一点。

### 使用AT89C51单片机进行AD(模数转换)电压采集 由于AT89C51单片机本身并不具备内置的AD转换功能,因此通常需要外接AD转换芯片来实现模拟信号到数字信号的转换。常用的外部AD转换芯片有ADC0809等。 #### 外部AD转换芯片的选择 对于简单的应用,可以选择使用ADC0809作为外部AD转换器。ADC0809是一个8通道8位逐次逼近型A/D转换器,能够满足大多数低精度的应用需求[^2]。 #### 连接方式 为了使AT89C51ADC0809正常工作,两者之间需通过特定的方式连接起来。具体来说,可以将P0口设置为双向I/O端口用于传输数据;START引脚用来启动一次转换过程;EOC表示转换结束标志;OE控制输出三态门开关状态;INTR中断请求线可选连至单片机INT0或定时计数器T0触发源之一以便及时响应完成后的通知[^3]。 #### 示例代码 下面给出一段利用Keil C编写的简单程序示例,展示了如何配置并读取来自ADC0809的数据: ```c #include <reg51.h> sbit START = P2^7; // 定义ADC0809 的 START 控制信号 sbit EOC = P2^6; // 定义 ADC0809 的 EOC (End Of Conversion) 信号 sbit OE = P2^5; // 定义 ADC0809 输出允许信号 void delay(unsigned int time){ while (--time); } unsigned char GetAdValue(){ unsigned char i, dat; START=1; // 发送开始命令 delay(1); // 短暂延时等待稳定 START=0; while(!EOC); // 等待转换完毕 OE=1; // 打开输出锁存器 for(i=0;i<8;i++){ // 移位接收8位数据 dat <<= 1; if(P1.0)dat++; } OE=0; // 关闭输出锁存器 return(dat); } ``` 此函数`GetAdValue()`实现了从ADC0809获取一个字节长度的结果的功能,在实际项目开发过程中可以根据具体的硬件平台调整参数以及优化性能[^4]。
评论 26
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值