神农鼎 发表于 2023-6-24 15:38:47

ADC的转换参考电压永远是ADC_VRef+ 和 1.19V 辅助固定信号源无关,如何接 ?

ADC 的 转换参考电压:
永远是 ADC_VRef+,
和 1.19V 辅助固定信号源 无任何关系

======================================================================

ADC_VREF+ 如何接 ?MCU_VCC, 2.5V/3.0V/3.3V/4.096V/5V
1,无追求,可以直接接到 MCU的VCC电源管脚 ADC_VREF+ =【ADC_AVCC = MCU_VCC】
   用ADC15通道接的1.19V固定信号源来反推当时的变化中的MCU_VCC/ADC_AVCC,
   【对ADC15通道采样转换各1次,对实际要采样转换的 ADCx通道采样转换1次】
   假定2次ADC采样转换时间内,MCU_VCC/ADC_AVCC不变或忽略不计,实际计算是,
   2个通道比较计算1次就可以得到 ADCx的输入模拟量值

2,一般要求,接外部普通的的参考源,须满足 2.4V <= ADC_VREF+ <=【ADC_AVCC = MCU_VCC】
      2.5V的超简易参考源 TL431/CD431, 价格<RMB0.1附近

3,不计代价的高要求,接欧美的外部专门的参考源, 须满足 2.4V <= ADC_VREF+ <=【ADC_AVCC = MCU_VCC】
   2.5V专业参考源 / 3.0V / 3.3V / 4.096V / 5.0V专业参考源
   ===最近REF3025AIDBZR已降价到RMB0.85以下,有高要求的可以考虑使用
   ===最近REF3030 已降价到RMB0.85以下,有高要求的可以考虑使用
   ===最近REF3033 已降价到RMB0.85以下,有高要求的可以考虑使用
   ===最近REF3040 已降价到RMB0.85以下,有高要求的可以考虑使用
STC内部校准用的都是这些专业级的参考源,普通用户没必要如此奢华
====== ADCx输入通道的外部输入电压 <= ADC_VREF+ ================

1,无追求,可以直接接到 MCU的VCC电源管脚 ADC_VREF+ =【ADC_AVCC = MCU_VCC】
   ADC输入通道接个 0.1uF / 0.01uF / 0.001uF的电容到模拟地

============================================================================

2,一般要求,接外部普通的的参考源,须满足 2.4V <= ADC_VREF+ <=【ADC_AVCC = MCU_VCC】
      2.5V的超简易参考源 TL431/CD431, RMB0.1附近
      ADC输入通道接个 0.1uF / 0.01uF / 0.001uF的电容到模拟地





============================================================================

3,不计代价的高要求,接外部专门的参考源,
   须满足 2.4V <= ADC_VREF+ <=【ADC_AVCC = MCU_VCC】
   2.5V专业参考源 / 3.0V专业参考源 / 3.3V专业参考源
   4.096V专业参考源 / 5.0V专业参考源
      ADC输入通道接个 0.1uF / 0.01uF / 0.001uF的电容到模拟地

===最近REF3025AIDBZR已降价到RMB0.85以下,有高要求的可以考虑使用
STC内部校准用的都是这些专业级的参考源,普通用户没必要如此奢华





神农鼎 发表于 2023-6-24 16:36:10

19.6.4               利用ADC第15通道测量外部电压或电池电压
STC8H系列ADC的第15通道用于测量内部固定信号源1.19V,由于内部固定信号源很稳定,约为1.19V,且不会随芯片的工作电压的改变而变化,所以可以通过测量内部固定信号源1.19V,然后通过ADC的值便可反推出外部电压或外部电池电压。===也可以使用ADC的第15通道固定接的内部固定信号源1.19V,反推外部ADCx通道输入电压C语言代码
//测试工作频率为11.0592MHz#include "stc8h.h"#include "intrins.h"#define       FOSC               11059200UL#define       BRT                  (65536-(FOSC / 115200+2) / 4)//加2操作是为了让Keil编译器                                                                                                                //自动实现四舍五入运算int            *BGV;                                                                                  //内部参考信号源值存放在idata中//idata的EFH地址存放高字节//idata的F0H地址存放低字节//电压单位为毫伏(mV)bit               busy;void UartIsr() interrupt 4 {         if(TI)         {                  TI = 0;                  busy = 0;         }         if(RI)         {                  RI = 0;         }}void UartInit(){         SCON= 0x50;         TMOD= 0x00;         TL1= BRT;         TH1= BRT >> 8;         TR1= 1;         AUXR= 0x40;         busy= 0;}void UartSend(char dat){         while(busy);         busy= 1;         SBUF= dat;}void ADCInit(){         ADCTIM= 0x3f;                                                                        //设置ADC内部时序         ADCCFG= 0x2f;                                                                         //设置ADC时钟为系统时钟/2/16         ADC_CONTR= 0x8f;                                                                  //使能ADC模块,并选择第15通道}int   ADCRead(){         intres;         ADC_CONTR|= 0x40;                                                                //启动AD转换         _nop_();         _nop_();         while(!(ADC_CONTR & 0x20));                                                //查询ADC完成标志         ADC_CONTR&= ~0x20;                                                            //清完成标志         res= (ADC_RES << 8) | ADC_RESL;                                        //读取ADC结果         returnres;}void main(){         intres;         intvcc;         inti;         P_SW2|= 0x80;                                                                            //使能访问XFR         P0M0= 0x00;         P0M1= 0x00;         P1M0= 0x00;         P1M1= 0x00;         P2M0= 0x00;         P2M1= 0x00;         P3M0= 0x00;         P3M1= 0x00;         P4M0= 0x00;         P4M1= 0x00;         P5M0= 0x00;         P5M1= 0x00;         BGV= (int idata *)0xef;         ADCInit();                                                                                     //ADC初始化         UartInit();                                                                                     //串口初始化         ES= 1;         EA= 1;//       ADCRead();//       ADCRead();                                                                                  //前两个数据建议丢弃         res= 0;         for(i=0; i<8; i++)         {                  res += ADCRead();                                                             //读取8次数据         }         res>>= 3;                                                                                    //取平均值         vcc= (int)(4096L * *BGV / res);                                                 //(12位ADC算法)计算VREF管脚电压,即电池电压//       vcc= (int)(1024L * *BGV / res);                                                 //(10位ADC算法)计算VREF管脚电压,即电池电压//注意,此电压的单位为毫伏(mV)         UartSend(vcc>> 8);                                                                     //输出电压值到串口         UartSend(vcc);         while(1);}
上面方法是使用ADC的第15通道反推外部电池电压的。在ADC测量范围内,ADC外部待测量电压与ADC的测量值是成正比例的,所以也可以使用ADC的第15通道反推外部通道输入电压,假设当前已获取了内部固定信号源电压为BGV,内部固定信号源的ADC测量值为resbg,外部ADCx通道输入电压的ADC测量值为resx,则外部通道输入电压Vx=BGV / resbg * resx;

llyymm 发表于 2023-6-25 13:33:22

路过,学习了解了更专业的知识{:4_250:}

刘佑红 发表于 2023-7-5 16:14:23

2,一般要求,接外部普通的的参考源,须满足 2.4V <= ADC_VREF+         .
这句提示使我知道了STC8H1KO8使用VREF引脚作输入端子时(为的想节省一个IO口),
电压低于2v的误差大,低于1.2v无法测量的原因了。

ghn717 发表于 2023-9-19 16:05:20

须满足 2.4V <= ADC_VREF+ <=【ADC_AVCC = MCU_VCC】?
我ADC_VREF用1.24V行不行?

daybeen 发表于 2023-10-11 11:54:35

ghn717 发表于 2023-9-19 16:05
须满足 2.4V

不行,要大于2.4V

有你才恋家 发表于 2023-11-27 10:42:09

感谢分享,学习了{:4_166:}

xxkj2010 发表于 2023-12-2 16:26:55

太详细了,先收藏。

QQ624353765 发表于 2023-12-3 16:55:00

测电池电压是不是就是在测ADC_VREF引脚上的电压

神农鼎 发表于 2023-12-3 16:59:07

QQ624353765 发表于 2023-12-3 16:55
测电池电压是不是就是在测ADC_VREF引脚上的电压

反推出 ADC-VRef+ 的电压,
如 ADC-VRef+接到哪了,
那那个点的电压也是ADC-VRef+ 的电压
页: [1] 2 3 4 5
查看完整版本: ADC的转换参考电压永远是ADC_VRef+ 和 1.19V 辅助固定信号源无关,如何接 ?