找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 841|回復(fù): 3
打印 上一主題 下一主題
收起左側(cè)

怎么利用內(nèi)部電壓作為ADC輸入,實時獲取電池電量

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:1125252 發(fā)表于 2024-7-10 10:46 | 只看該作者 回帖獎勵 |正序瀏覽 |閱讀模式
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

地板
ID:1034262 發(fā)表于 2024-7-12 17:38 | 只看該作者
是不是STC的單片機?如果是STC8系列、STC32系列,讀15通道ADC就可以計算出AVREF的電壓,將AVREF與VCC連接計算的就是單片機的工作電壓。
回復(fù)

使用道具 舉報

板凳
ID:777254 發(fā)表于 2024-7-12 14:52 | 只看該作者
看看手冊,或者百度對應(yīng)的MCU型號再問,不同MCU的配置不一樣。一般32位的都是有個庫函數(shù)配置,8位單片機要自己配置寄存器了
回復(fù)

使用道具 舉報

沙發(fā)
ID:712097 發(fā)表于 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;                                       //內(nèi)部1.19V參考信號源值存放在idata中
  25.                                                 //idata的EFH地址存放高字節(jié)
  26.                                                 //idata的F0H地址存放低字節(jié)
  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;                              //設(shè)置ADC內(nèi)部時序
  61.     P_SW2 &= 0x7f;

  62.     ADCCFG = 0x2f;                              //設(shè)置ADC時鐘為系統(tǒng)時鐘/2/16
  63.     ADC_CONTR = 0x8f;                           //使能ADC模塊,并選擇第15通道
  64. }

  65. int ADCRead()
  66. {
  67.     int res;

  68.     ADC_CONTR |= 0x40;                          //啟動AD轉(zhuǎn)換
  69.     _nop_();
  70.     _nop_();
  71.     while (!(ADC_CONTR & 0x20));                //查詢ADC完成標(biāo)志
  72.     ADC_CONTR &= ~0x20;                         //清完成標(biāo)志
  73.     res = (ADC_RES << 8) | ADC_RESL;            //讀取ADC結(jié)果

  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();                                  //前兩個數(shù)據(jù)建議丟棄

  100.     res = 0;
  101.     for (i=0; i<8; i++)
  102.     {
  103.         res += ADCRead();                       //讀取8次數(shù)據(jù)
  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. }

復(fù)制代碼
以上是STC8系列帶ADC功能的單片機利用內(nèi)部ADC第15通道測量電源電壓的范例程序,供參考。
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表