標(biāo)題: STC單片機(jī)用鋰電池供電讀電壓問題? [打印本頁]

作者: LAW1100    時間: 2024-8-29 20:10
標(biāo)題: STC單片機(jī)用鋰電池供電讀電壓問題?
STC用鋰電池供電并讀取電壓時會出現(xiàn)AD數(shù)據(jù)偏差大或不穩(wěn)定,根本識別不了,如果用5V供電就沒問題,不知道各位大佬有沒遇到過?是否有方法解決?請看下面硬件線路是否合理?

df16ed809e02dfd8efd657e088b5cc4.jpg (447.33 KB, 下載次數(shù): 15)

df16ed809e02dfd8efd657e088b5cc4.jpg

作者: wufa1986    時間: 2024-8-30 08:13
因?yàn)镾TC沒有內(nèi)部參考,當(dāng)負(fù)載變化,ADC也會變化,最簡單的是供電2.5V LDO
不加也可以同時間讀取15通道,計(jì)算轉(zhuǎn)化一下
作者: coody_sz    時間: 2024-8-30 09:50
如果電池是接在單片機(jī)的VCC上,則讀ADC的15通道得到adc15,計(jì)算得到VCC電壓:
VCC = 1.19*1024/adc15,不需要外部電路,非常方便,準(zhǔn)確度高。如果你的VCC波動大,加數(shù)字濾波即可穩(wěn)定。
作者: devcang    時間: 2024-8-30 09:57
哪個系列的單片機(jī)  
電路中其他的外設(shè)有多大影響

等等因素
作者: LAW1100    時間: 2024-8-30 13:56
這個型號的芯片讀內(nèi)部基準(zhǔn)電壓沒有15通道 ,只能讀ROM,RAM和CHIPID這3種方式,真麻煩。
作者: xianfajushi    時間: 2024-8-30 14:03
從外面建立比較電路作為開關(guān)量送給單片機(jī)或是光耦信號給單片機(jī)可參https://blog.csdn.net/xianfajush ... 1018.2226.3001.4450
作者: Y_G_G    時間: 2024-8-30 14:32
LAW1100 發(fā)表于 2024-8-30 13:56
這個型號的芯片讀內(nèi)部基準(zhǔn)電壓沒有15通道 ,只能讀ROM,RAM和CHIPID這3種方式,真麻煩。

圖片上的是STC8H1K08,這款是有內(nèi)部穩(wěn)定的參考電壓的
作者: LAW1100    時間: 2024-8-30 14:54

8H的是讀內(nèi)存里的電壓

51hei圖片_20240830145341.jpg (678.7 KB, 下載次數(shù): 15)

51hei圖片_20240830145341.jpg

作者: LAW1100    時間: 2024-8-30 16:07
用5V供電ADC讀出來沒問題,用電池供電讀出來卻是0
作者: 188610329    時間: 2024-8-30 21:45
電池供電的話,直接讀15通道,就能算出電池電壓了.
作者: LAW1100    時間: 2024-8-31 08:40
188610329 發(fā)表于 2024-8-30 21:45
電池供電的話,直接讀15通道,就能算出電池電壓了.

沒用過這功能,
unigned int Temp=0;
unigned int  sum=0;
float voltage=0.0;
Temp=Get_Adc(15);//此數(shù)值17440(這是在5V供電下調(diào)試打印出來的數(shù)值)
voltage=(float)(1.19*1024)/Temp*100;放大100倍
voltage結(jié)果等于0.846V;這是VCC電壓??
作者: LAW1100    時間: 2024-8-31 08:41
ADC15通道能測量VCC電壓,那測量其它通道(如電流取樣電壓)是否可以測量?
作者: 188610329    時間: 2024-8-31 09:26
LAW1100 發(fā)表于 2024-8-31 08:40
沒用過這功能,
unigned int Temp=0;
unigned int  sum=0;

STC8H 系列是 12位ADC  ADC讀值應(yīng)該是在 0~4095 之間,你17440是怎么來的?
正常情況下,讀取15通道,根據(jù)你電池供電電壓的不同,應(yīng)該得到 1100~1300左右的值,讀取 BGV 記錄得到 15通道電壓為:1193mv 左右的出廠測定的電壓值, 按 ADCValue 1300 為 1193mv 就可以逆算出 滿量程 4095 對應(yīng)的電源電壓為:3758mv

作者: LAW1100    時間: 2024-8-31 15:17
188610329 發(fā)表于 2024-8-31 09:26
STC8H 系列是 12位ADC  ADC讀值應(yīng)該是在 0~4095 之間,你17440是怎么來的?
正常情況下,讀取15通道,根 ...

我是用串口打印出來的(17440),8H系列AD有兩種,10位和12位,網(wǎng)上有的算法是分開算的(如AD10位就讀1024,12位的讀4096),不知能不能測量其它通道的電壓?如果不行就轉(zhuǎn)芯片了。多謝!
作者: LAW1100    時間: 2024-8-31 15:18
感謝各位大佬的意見!
作者: LAW1100    時間: 2024-8-31 15:36
unigned int Temp=0;
unigned int  sum=0;
float voltage=0.0;
unigned chai  i;
for(i=0;i<32;i++)
{
Temp+=Get_Adc(15);//
}
Temp= Temp>>5;//此數(shù)值濾波后2040(這是在5V供電下調(diào)試打印出來的數(shù)值)
voltage=(float)(1.19*4095)/Temp;
voltage結(jié)果等于2.38875V;如果這是VCC電壓那就相差太遠(yuǎn)了,不知是不是算法問題還是其它問題?
作者: 188610329    時間: 2024-9-1 19:31
LAW1100 發(fā)表于 2024-8-31 15:36
unigned int Temp=0;
unigned int  sum=0;
float voltage=0.0;

除非你的供電電池 真的是2.4V 電池,不然,你的代碼100%有問題,正常鋰電池供電 讀取15通道,瀆值應(yīng)當(dāng)是 1200左右的, 你能讀出 2040 那么代碼肯定不對,就好像你之前說 讀出來17440 一樣,你還是仔細(xì)檢查你的代碼吧,不用折騰那些有的沒有的所謂濾波,你先確保你 ADC_Value 讀出來的東西 是對的。
作者: Y_G_G    時間: 2024-9-2 00:13
LAW1100 發(fā)表于 2024-8-31 15:36
unigned int Temp=0;
unigned int  sum=0;
float voltage=0.0;

unigned int Temp=0;這個聲明看一下
你就知道怎么回事了
12位數(shù)據(jù)累加32次,會不會溢出呢?

作者: uid71955    時間: 2024-9-2 22:02
亮出你封裝的Get_Adc(15)函數(shù)就一目了然了,15通道ADc好像是二進(jìn)過制1111,你搞個15上去是什么意思呢
作者: uid71955    時間: 2024-9-2 22:34
不好意思小弟不才,忘記自己是初學(xué)者亂回復(fù).15就是1111
作者: LAW1100    時間: 2024-9-3 14:42
15通道除了測量VCC外,不知能不能測其它通道的電壓?
作者: chchking    時間: 2024-9-3 19:21
可能是封裝問題
作者: sbpfi123    時間: 2024-9-4 11:12
你好,我看到你STC 1.19V基準(zhǔn)電壓問題,后面解決了嗎?我也碰到這個問題了,能否向你請教 一下, 我的VX  13757468658
作者: sbpfi123    時間: 2024-9-4 11:13
你好,我看到你STC 1.19V基準(zhǔn)電壓問題,后面解決了嗎?我也碰到這個問題了,能否向你請教 一下,我輸入5V,測試出來輸出 為什么只有3.0V
作者: sbpfi123    時間: 2024-9-4 12:22
#define ADC_Power 0x8f        //ê1ÄüADCÄ£¿é                ′ò¿aADC                ½«ADCòy½ÅéèÖÃμ½P55
#define ADC_Start 0x40        //¿aê¼ADC×a»»
#define ADC_Flag 0x20        //×a»»íê3é±ê־λ
#define ADC_SYS 0x2f        //½«ADCÏμí3ê±Öóé趨ÎaSYSclk/2/16  óò¶ÔÆë

unsigned int VDDA; // VDDAμÄμçÑ1Öμ μ¥λoá·ü
unsigned int *BGV; // Äú2¿2ο¼μçÑ1Öμ μ¥λoá·ü

void AD_Init()
{
//        ADC_RES = 0;
//        ADC_RESL = 0;
        P_SW2|= 0x80;
        ADCTIM=0x3f;
        P_SW2 &= 0x7f;
        ADCCFG=ADC_SYS;
        ADC_CONTR=ADC_Power;
        BGV = (unsigned int idata *)0xef;
        delay_ms(1);       
}

unsigned int ADC_Get()
{       
        unsigned int res;
        ADC_CONTR |= ADC_Start;
//        ADCCFG=ADC_SYS;
    _nop_();
    _nop_();
    _nop_();
    while((ADC_CONTR & ADC_Flag) == 0);   //μè′yíê3é
    ADC_CONTR &= ~ADC_Flag;     //Çå3yíê3é±ê־λ
        res =((unsigned int)ADC_RES << 8) | ADC_RESL;
        return res;

}

void Fetch_VDDA(void)
{
  unsigned int res=0;
  unsigned char i;

  ADC_CONTR = ADC_Power; // ê1ÄüADCÄ£¿é 2¢Ñ¡Ôñμú15í¨μà
  ADC_Get();
  ADC_Get();
  for(i=0;i<8;i++)
  {
    res+=ADC_Get();
  }
  res>>=3; // ¶áè¡8′Î è¡Æ½¾ùÖμ
  VDDA = (unsigned int)(1023L*(*BGV/res)); // μÃ3öμĽá1ûμ¥λêÇoá·ü
}
作者: sbpfi123    時間: 2024-9-4 12:22
這個代碼測試出來的電壓是3069,錯在哪里?
作者: uid71955    時間: 2024-9-4 23:26
VDDA = (unsigned int)(1023L*(*BGV/res));改成VDDA = (unsigned int)(1023L*(1190/res));可以了。8H不支持內(nèi)存讀內(nèi)部參考電壓參
作者: LAW1100    時間: 2024-9-6 09:46
如果只能測量15通道VDD電壓而不能測量其它通道電壓,那就不合適這個項(xiàng)目,只能轉(zhuǎn)其它芯片了,多謝各位了!




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1