ADC VS参考电压在测量时和AD值的大小对应关系

         背景是这样的,用24位的ADC,外接人体电阻,进行电阻AD值采集,当VS = 2.4V时,体电阻的AD值对应值为9.86 * 10 ^ 5量级,当VS = 2.8V时,体电阻的AD值对应值为7.01 * 10 ^ 5量级。

        问题在为什么AD值不一样,且测量同一个外接电阻,VS = 2.4V时AD值比VS = 2.8V大?本文做一个较为深入的整理和分析。

分析如下:

VS:为ADC的正参考电压,架构如下:

        LDO模块产生的VS信号,经片外电容滤波和稳压后产生信号REFP,作为ADC的正参考电压.FEFP接地,此差分电压经过ķ值的比例缩放之后,作为ADC的参考电压输入;

           当进行信号测量时,被测电压由AIN1,AIN0输入,此差分电压在某一瞬间是一个固定值。

 

        综合上述情况,外接人体电阻可以近似看成是一个500ohm的电阻,换句话说,此电阻在信号测量时AIN1,AIN0形成的差分电压是一个固定值。当VS = 2.4V时,24bit的ADC相当于将2.4V分成2 ^ 24个电压单位,当VS = 2.8V时,24位的ADC相当于将2.8V分成2 ^ 24个电压单位,当AIN1,AIN2差分电压为一个固定电压时,2.4V对应的微观电压单位会比2.8V对应的微观电压单位多.2.4V的ADC值是会比2.8V的ADC值大,因此也就解释了上述现象。

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
好的,这里提供一种基于单片机控制的ADC0809实现电压测量和显示的方法,具体步骤如下: 1. 连接ADC0809和单片机,具体连接方式可以参考ADC0809的数据手册。这里以使用单片机的8个IO口作为ADC0809的控制信号和数据信号,其中P1口连接ADC0809的地址信号A0~A2,P3.4口作为ADC0809的转换启动信号,P3.5~P3.7口作为ADC0809的数据信号D0~D2。 2. 连接变阻器电路,并将变阻器输出电压连接到ADC0809的第三个通道输入端。 3. 在单片机程序中初始化ADC0809的控制信号和数据信号,并设置ADC0809的转换模式为单次转换模式。 4. 循环执行以下操作:设置ADC0809的通道选择信号为通道3,启动ADC0809的转换,等待转换完成,读取ADC0809的转换结果,并进行数字处理将其转换为电压,最后将电压通过液晶显示器进行显示。 下面是一份示例代码,供参考: ``` #include <reg52.h> #include <stdio.h> // 定义ADC0809的控制信号和数据信号端口 sbit ADDR0 = P1^0; sbit ADDR1 = P1^1; sbit ADDR2 = P1^2; sbit START = P3^4; sbit D0 = P3^5; sbit D1 = P3^6; sbit D2 = P3^7; // 定义LCD1602的控制信号和数据信号端口 sbit RS = P2^0; sbit EN = P2^1; sbit D4 = P2^2; sbit D5 = P2^3; sbit D6 = P2^4; sbit D7 = P2^5; // 声明函数 void init_lcd(); void write_command(unsigned char com); void write_data(unsigned char dat); void delay_ms(unsigned int ms); float get_voltage(); // 主函数 void main() { float voltage = 0.0; char str[16]; init_lcd(); while(1) { voltage = get_voltage(); sprintf(str, "Voltage: %.2fV", voltage); write_command(0x80); // 光标移动到第一行第一列 for(int i=0; i<16; i++) { if(str[i] != '\0') { write_data(str[i]); } else { break; } } delay_ms(1000); // 延1秒 } } // 初始化LCD1602 void init_lcd() { write_command(0x38); // 8位数据总线,2行显示,5x7点阵字符 write_command(0x0c); // 显示开,光标关,光标闪烁关 write_command(0x06); // 光标移动,整体移动,不移动光标 write_command(0x01); // 清屏 delay_ms(10); // 延10ms } // 向LCD1602写入指令 void write_command(unsigned char com) { RS = 0; EN = 1; D7 = (com>>7) & 0x01; D6 = (com>>6) & 0x01; D5 = (com>>5) & 0x01; D4 = (com>>4) & 0x01; EN = 0; delay_ms(1); EN = 1; D7 = (com>>3) & 0x01; D6 = (com>>2) & 0x01; D5 = (com>>1) & 0x01; D4 = com & 0x01; EN = 0; delay_ms(1); } // 向LCD1602写入数据 void write_data(unsigned char dat) { RS = 1; EN = 1; D7 = (dat>>7) & 0x01; D6 = (dat>>6) & 0x01; D5 = (dat>>5) & 0x01; D4 = (dat>>4) & 0x01; EN = 0; delay_ms(1); EN = 1; D7 = (dat>>3) & 0x01; D6 = (dat>>2) & 0x01; D5 = (dat>>1) & 0x01; D4 = dat & 0x01; EN = 0; delay_ms(1); } // 延函数,延ms毫秒 void delay_ms(unsigned int ms) { unsigned int i, j; for(i=0; i<ms; i++) { for(j=0; j<112; j++); } } // 获取ADC0809转换结果对应电压 float get_voltage() { float voltage = 0.0; unsigned char result = 0; ADDR0 = 1; ADDR1 = 1; ADDR2 = 1; // 通道3 START = 1; // 启动转换 while(START); // 等待转换完成 START = 0; result = (D2<<2) | (D1<<1) | D0; // 读取转换结果 voltage = (float)result / 255.0 * 5.0; // 转换为电压 return voltage; } ``` 这样就可以实现ADC0809实现电压测量和显示了。需要注意的是,液晶显示器的驱动方式和参数需要根据具体的型号进行设置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值