找回密码
 立即注册
楼主: 神农鼎

利用ADC15通道在内部固定接的1.19V辅助固定信号源,反推其他通道的输入电压或VCC

  [复制链接]
  • 打卡等级:以坛为家III
  • 打卡总天数:637
  • 最近打卡:2025-09-16 08:31:40
已绑定手机

1

主题

831

回帖

2157

积分

金牌会员

积分
2157
发表于 2025-3-15 08:43:20 | 显示全部楼层
用来反推锂电池电压,挺方便的
靡不有初,鲜克有终
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:646
  • 最近打卡:2025-09-16 08:02:08

124

主题

2068

回帖

6270

积分

论坛元老

积分
6270
发表于 2025-4-7 13:47:27 | 显示全部楼层
我读出来的怎么是00 00,芯片用STC8H8K64U-SOP16,究竟是哪里错了

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

000.jpg


回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2025-05-12 11:41:26
已绑定手机

1

主题

2

回帖

17

积分

新手上路

积分
17
发表于 2025-5-8 14:21:39 来自手机 | 显示全部楼层
ADC_VREF+/ADC_AVCC/MCU_VCC 这3条可以直接连一起吗

点评

可以  详情 回复 发表于 2025-5-8 14:29
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2025-05-12 11:41:26
已绑定手机

1

主题

2

回帖

17

积分

新手上路

积分
17
发表于 2025-5-8 14:22:43 来自手机 | 显示全部楼层
ADC_VREF+/ADC_AVCC/MCU_VCC
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:183
  • 最近打卡:2025-09-15 10:20:19

780

主题

1万

回帖

1万

积分

管理员

积分
19108
发表于 2025-5-8 14:29:24 | 显示全部楼层
wyp*** 发表于 2025-5-8 14:21
ADC_VREF+/ADC_AVCC/MCU_VCC 这3条可以直接连一起吗

可以
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:486
  • 最近打卡:2025-09-16 00:02:22
已绑定手机

153

主题

1872

回帖

2424

积分

金牌会员

积分
2424
发表于 2025-5-16 17:36:14 | 显示全部楼层
比如我的电压读出来是1193
那我直接用1193代替 BGV就行了吧
应该也是精准的

点评

是的,可以。  详情 回复 发表于 2025-5-17 13:46
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:181
  • 最近打卡:2025-09-15 11:00:40

76

主题

6717

回帖

1万

积分

超级版主

积分
14125
发表于 2025-5-17 13:46:04 | 显示全部楼层
vb2*** 发表于 2025-5-16 17:36
比如我的电压读出来是1193
那我直接用1193代替 BGV就行了吧
应该也是精准的 ...

是的,可以。
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:553
  • 最近打卡:2025-09-16 07:04:53

25

主题

111

回帖

237

积分

中级会员

积分
237
发表于 2025-5-20 08:55:50 | 显示全部楼层
“STC8H系列的ADC最快速度:12位ADC为800K(每秒进行80万次ADC转换),10位ADC为500K(每秒进行50万次ADC转换)”
ADC位数越多越精确,转换消耗资源越多,那么12位ADC每秒80万次,10位ADC每秒50万次,神雕大佬,这个怎么理解?

点评

10位ADC, 速度低些,成本也会低些,牺牲速度,换来成本降低  详情 回复 发表于 2025-5-20 09:06
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:183
  • 最近打卡:2025-09-15 10:20:19

780

主题

1万

回帖

1万

积分

管理员

积分
19108
发表于 2025-5-20 09:06:34 | 显示全部楼层
垂柳*** 发表于 2025-5-20 08:55
“STC8H系列的ADC最快速度:12位ADC为800K(每秒进行80万次ADC转换),10位ADC为500K(每秒进行50万次ADC转 ...
成本:
10位ADC, 成本低些,再牺牲下速度,换来成本更低;
12位ADC, 本来成本就高,再少许提升点成本,将速度也提升了下,成本而已
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:10
  • 最近打卡:2025-07-05 10:36:05
已绑定手机

7

主题

11

回帖

101

积分

注册会员

积分
101
发表于 2025-6-25 16:09:29 | 显示全部楼层

这样不能用于量产,最好在程序中读取,不然生产几十万件产品,你个个去改代码吗?

点评

用户只是问是否可以,并没有说要量产,我当然回答说可以,难道回答不可以?明显不对。 量产都是再治具上自动校准的。  详情 回复 发表于 2025-6-25 16:33
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-9-16 09:04 , Processed in 0.199090 second(s), 118 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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