找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 414|回复: 3
打印 上一主题 下一主题
收起左侧

怎么利用内部电压作为ADC输入,实时获取电池电量

[复制链接]
跳转到指定楼层
楼主
ID:1125252 发表于 2024-7-10 10:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:712097 发表于 2024-7-10 20:01 | 只看该作者
  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. }

复制代码
以上是STC8系列带ADC功能的单片机利用内部ADC第15通道测量电源电压的范例程序,供参考。
回复

使用道具 举报

板凳
ID:777254 发表于 2024-7-12 14:52 | 只看该作者
看看手册,或者百度对应的MCU型号再问,不同MCU的配置不一样。一般32位的都是有个库函数配置,8位单片机要自己配置寄存器了
回复

使用道具 举报

地板
ID:1034262 发表于 2024-7-12 17:38 | 只看该作者
是不是STC的单片机?如果是STC8系列、STC32系列,读15通道ADC就可以计算出AVREF的电压,将AVREF与VCC连接计算的就是单片机的工作电压。
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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