找回密码
 立即注册
查看: 964|回复: 9

STC8H4K的被测试通道用内置1.19V反推计算的问题

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2025-06-08 15:04:41

14

主题

35

回帖

228

积分

中级会员

积分
228
发表于 2024-3-6 16:03:31 | 显示全部楼层 |阅读模式
请问STC8H4K系列用内置1.19V参考电压计算ADC输入电压怎么计算?规格书中只有外部参考电压和MCU工作电压计算公式,没有内部参考1.19V的计算公式,是不是用1.19V替换外部参考电压即可?
111.png
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:328
  • 最近打卡:2025-03-09 19:40:01

9

主题

328

回帖

4501

积分

荣誉版主

积分
4501
发表于 2024-3-6 16:08:25 | 显示全部楼层
不是的,内部1.19V参考电压连接的是ADC15通道,即当选择通道15时,ADC被转换通道的输入电压Vin约等于1.19V。
你可以用这个测量结果反推出ADC外部参考电源的电压,然后再用这个外部参考电源电压得出其它通道的电压。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2025-06-08 15:04:41

14

主题

35

回帖

228

积分

中级会员

积分
228
发表于 2024-3-6 16:18:36 | 显示全部楼层
kk*** 发表于 2024-3-6 16:08
不是的,内部1.19V参考电压连接的是ADC15通道,即当选择通道15时,ADC被转换通道的输入电压Vin约等于1.19V ...

还是没有明白如何反推?有没有反推计算公式?

点评

反推就是已知你公式里面的Vin、转换结果和常数(1024或4096),算出MCU工作电压Vcc或ADC外部参考源的电压。  详情 回复 发表于 2024-3-6 16:37
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:328
  • 最近打卡:2025-03-09 19:40:01

9

主题

328

回帖

4501

积分

荣誉版主

积分
4501
发表于 2024-3-6 16:37:24 | 显示全部楼层
ala*** 发表于 2024-3-6 16:18
还是没有明白如何反推?有没有反推计算公式?

反推就是已知你公式里面的Vin、转换结果和常数(1024或4096),算出MCU工作电压Vcc或ADC外部参考源的电压。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:500
  • 最近打卡:2025-06-18 01:56:03
已绑定手机

14

主题

1312

回帖

3356

积分

论坛元老

积分
3356
发表于 2024-3-6 17:00:40 | 显示全部楼层
ala*** 发表于 2024-3-6 16:18
还是没有明白如何反推?有没有反推计算公式?

被测电压=1.19V*被测电压ADC值/通道15的ADC值
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:569
  • 最近打卡:2025-06-18 00:24:58

11

主题

1198

回帖

5542

积分

论坛元老

积分
5542
发表于 2024-3-6 21:33:29 | 显示全部楼层
利用 ADC 第 15 通道测量外部电压或电池电压


  1. #include "reg51.h"
  2. #include "intrins.h"
  3. #define FOSC            11059200UL
  4. #define BRT             (65536 - FOSC / 115200 / 4)
  5. sfr     AUXR        =   0x8e;
  6. sfr     ADC_CONTR   =   0xbc;
  7. sfr     ADC_RES     =   0xbd;
  8. sfr     ADC_RESL    =   0xbe;
  9. sfr     ADCCFG      =   0xde;
  10. sfr     P_SW2   =   0xba;
  11. #define ADCTIM  (*(unsigned char volatile xdata *)0xfea8)
  12. sfr     P0M1    =   0x93;
  13. sfr     P0M0    =   0x94;
  14. sfr     P1M1    =   0x91;
  15. sfr     P1M0    =   0x92;
  16. sfr     P2M1    =   0x95;
  17. sfr     P2M0    =   0x96;
  18. sfr     P3M1    =   0xb1;
  19. sfr     P3M0    =   0xb2;
  20. sfr     P4M1    =   0xb3;
  21. sfr     P4M0    =   0xb4;
  22. sfr     P5M1    =   0xc9;
  23. sfr     P5M0    =   0xca;
  24. int *BGV;                                       //内部1.19V参考信号源值存放在idata中
  25.                                                 //idata的EFH地址存放高字节
  26.                                                 //idata的F0H地址存放低字节
  27.                                                 //电压单位为毫伏(mV)
  28. bit busy;
  29. void UartIsr() interrupt 4
  30. {
  31.     if (TI)
  32.     {
  33.         TI = 0;
  34.         busy = 0;
  35.     }
  36.     if (RI)
  37.     {
  38.         RI = 0;
  39.     }
  40. }
  41. void UartInit()
  42. {
  43.     SCON = 0x50;
  44.     TMOD = 0x00;
  45.     TL1 = BRT;
  46.     TH1 = BRT >> 8;
  47.     TR1 = 1;
  48.     AUXR = 0x40;
  49.     busy = 0;
  50. }
  51. void UartSend(char dat)
  52. {
  53.     while (busy);
  54.     busy = 1;
  55.     SBUF = dat;
  56. }
  57. void ADCInit()
  58. {
  59.     P_SW2 |= 0x80;
  60.     ADCTIM = 0x3f;                              //设置ADC内部时序
  61.     P_SW2 &= 0x7f;
  62.     ADCCFG = 0x2f;                              //设置ADC时钟为系统时钟/2/16
  63.     ADC_CONTR = 0x8f;                           //使能ADC模块,并选择第15通道
  64. }
  65. int ADCRead()
  66. {
  67.     int res;
  68.     ADC_CONTR |= 0x40;                          //启动AD转换
  69.     _nop_();
  70.     _nop_();
  71.     while (!(ADC_CONTR & 0x20));                //查询ADC完成标志
  72.     ADC_CONTR &= ~0x20;                         //清完成标志
  73.     res = (ADC_RES << 8) | ADC_RESL;            //读取ADC结果
  74.     return res;
  75. }
  76. void main()
  77. {
  78.     int res;
  79.     int vcc;
  80.     int i;
  81.     P0M0 = 0x00;
  82.     P0M1 = 0x00;
  83.     P1M0 = 0x00;
  84.     P1M1 = 0x00;
  85.     P2M0 = 0x00;
  86.     P2M1 = 0x00;
  87.     P3M0 = 0x00;
  88.     P3M1 = 0x00;
  89.     P4M0 = 0x00;
  90.     P4M1 = 0x00;
  91.     P5M0 = 0x00;
  92.     P5M1 = 0x00;
  93.     BGV = (int idata *)0xef;
  94.     ADCInit();                                  //ADC初始化
  95.     UartInit();                                 //串口初始化
  96.     ES = 1;
  97.     EA = 1;
  98. //  ADCRead();
  99. //  ADCRead();                                  //前两个数据建议丢弃
  100.     res = 0;
  101.     for (i=0; i<8; i++)
  102.     {
  103.         res += ADCRead();                       //读取8次数据
  104.     }
  105.     res >>= 3;                                  //取平均值
  106.     vcc = (int)(1024L * *BGV / res);            //(10位ADC算法)计算VREF管脚电压,即电池电压
  107. //  vcc = (int)(4096L * *BGV / res);            //(12位ADC算法)计算VREF管脚电压,即电池电压
  108.                                                 //注意,此电压的单位为毫伏(mV)
  109.     UartSend(vcc >> 8);                         //输出电压值到串口
  110.     UartSend(vcc);
  111.     while (1);
  112. }
复制代码
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:462
  • 最近打卡:2025-06-19 00:46:02
已绑定手机

38

主题

2223

回帖

2677

积分

荣誉版主

积分
2677
发表于 2024-3-6 21:48:36 | 显示全部楼层
VREF脚连接VDD,也就是用外部电源作为ADC的基准,去采集通道15,也就是内部1.19V的这个基准源,采集值/1024 = 1.19/VDD
这就能反推VDD的值了。
睁开眼睛做场梦~~~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2025-06-08 15:04:41

14

主题

35

回帖

228

积分

中级会员

积分
228
发表于 2024-3-6 22:14:51 | 显示全部楼层
21cns*** 发表于 2024-3-6 17:00
被测电压=1.19V*被测电压ADC值/通道15的ADC值

懂了,谢谢
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:501
  • 最近打卡:2025-06-18 10:23:27
已绑定手机
已实名认证

112

主题

2404

回帖

6060

积分

版主

积分
6060
发表于 2024-3-7 08:40:38 | 显示全部楼层
其实就是内部1.19v出厂校准过,所以就当这个电压是准的。

而verf的作用就是提供给adc进行电压比较。
举个例子,12位adc最大值4096,如果verf=5V,adc=2.5V,那么adc读到的就是2048。
如果verf=5V,adc=5V,那么adc读到的就是4096。

所以反推其实就是假定这个1.19V是准的,通过看在整个分辨率宽度内的占比,推测整个分辨率的电压值
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:423
  • 最近打卡:2025-06-18 09:12:21

26

主题

117

回帖

902

积分

高级会员

积分
902
发表于 2024-3-23 21:01:50 来自手机 | 显示全部楼层
我折腾了两天总算搞明白了。内部参考电压1.19V可以都取出来。内部1.19V的adc码可以读出来。1.19V除以 adc码是斜率。是一个固定的数值!!
读取外部的adc码。那么外部电压除以外部adc码等于斜率。这样就求出来了。我现在就用这个还是非常好用!
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-6-19 02:10 , Processed in 0.144324 second(s), 117 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表