熱門(mén): 51單片機(jī) | 24小時(shí)必答區(qū) | 單片機(jī)教程 | 單片機(jī)DIY制作 | STM32 | Cortex M3 | 模數(shù)電子 | 電子DIY制作 | 音響/功放 | 拆機(jī)樂(lè)園 | Arduino | 嵌入式OS | 程序設(shè)計(jì)
![]() |
發(fā)布時(shí)間: 2024-8-29 20:10
正文摘要:STC用鋰電池供電并讀取電壓時(shí)會(huì)出現(xiàn)AD數(shù)據(jù)偏差大或不穩(wěn)定,根本識(shí)別不了,如果用5V供電就沒(méi)問(wèn)題,不知道各位大佬有沒(méi)遇到過(guò)?是否有方法解決?請(qǐng)看下面硬件線路是否合理? |
如果只能測(cè)量15通道VDD電壓而不能測(cè)量其它通道電壓,那就不合適這個(gè)項(xiàng)目,只能轉(zhuǎn)其它芯片了,多謝各位了! |
VDDA = (unsigned int)(1023L*(*BGV/res));改成VDDA = (unsigned int)(1023L*(1190/res));可以了。8H不支持內(nèi)存讀內(nèi)部參考電壓參 |
這個(gè)代碼測(cè)試出來(lái)的電壓是3069,錯(cuò)在哪里? |
#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á·ü } |
你好,我看到你STC 1.19V基準(zhǔn)電壓?jiǎn)栴},后面解決了嗎?我也碰到這個(gè)問(wèn)題了,能否向你請(qǐng)教 一下,我輸入5V,測(cè)試出來(lái)輸出 為什么只有3.0V |
你好,我看到你STC 1.19V基準(zhǔn)電壓?jiǎn)栴},后面解決了嗎?我也碰到這個(gè)問(wèn)題了,能否向你請(qǐng)教 一下, 我的VX 13757468658 |
可能是封裝問(wèn)題 |
15通道除了測(cè)量VCC外,不知能不能測(cè)其它通道的電壓? |
不好意思小弟不才,忘記自己是初學(xué)者亂回復(fù).15就是1111![]() |
亮出你封裝的Get_Adc(15)函數(shù)就一目了然了,15通道ADc好像是二進(jìn)過(guò)制1111,你搞個(gè)15上去是什么意思呢 |
LAW1100 發(fā)表于 2024-8-31 15:36 unigned int Temp=0;這個(gè)聲明看一下 你就知道怎么回事了 12位數(shù)據(jù)累加32次,會(huì)不會(huì)溢出呢? |
LAW1100 發(fā)表于 2024-8-31 15:36 除非你的供電電池 真的是2.4V 電池,不然,你的代碼100%有問(wèn)題,正常鋰電池供電 讀取15通道,瀆值應(yīng)當(dāng)是 1200左右的, 你能讀出 2040 那么代碼肯定不對(duì),就好像你之前說(shuō) 讀出來(lái)17440 一樣,你還是仔細(xì)檢查你的代碼吧,不用折騰那些有的沒(méi)有的所謂濾波,你先確保你 ADC_Value 讀出來(lái)的東西 是對(duì)的。 |
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)試打印出來(lái)的數(shù)值) voltage=(float)(1.19*4095)/Temp; voltage結(jié)果等于2.38875V;如果這是VCC電壓那就相差太遠(yuǎn)了,不知是不是算法問(wèn)題還是其它問(wèn)題? |
感謝各位大佬的意見(jiàn)! |
188610329 發(fā)表于 2024-8-31 09:26 我是用串口打印出來(lái)的(17440),8H系列AD有兩種,10位和12位,網(wǎng)上有的算法是分開(kāi)算的(如AD10位就讀1024,12位的讀4096),不知能不能測(cè)量其它通道的電壓?如果不行就轉(zhuǎn)芯片了。多謝! |
LAW1100 發(fā)表于 2024-8-31 08:40 STC8H 系列是 12位ADC ADC讀值應(yīng)該是在 0~4095 之間,你17440是怎么來(lái)的? 正常情況下,讀取15通道,根據(jù)你電池供電電壓的不同,應(yīng)該得到 1100~1300左右的值,讀取 BGV 記錄得到 15通道電壓為:1193mv 左右的出廠測(cè)定的電壓值, 按 ADCValue 1300 為 1193mv 就可以逆算出 滿量程 4095 對(duì)應(yīng)的電源電壓為:3758mv |
ADC15通道能測(cè)量VCC電壓,那測(cè)量其它通道(如電流取樣電壓)是否可以測(cè)量? |
188610329 發(fā)表于 2024-8-30 21:45 沒(méi)用過(guò)這功能, unigned int Temp=0; unigned int sum=0; float voltage=0.0; Temp=Get_Adc(15);//此數(shù)值17440(這是在5V供電下調(diào)試打印出來(lái)的數(shù)值) voltage=(float)(1.19*1024)/Temp*100;放大100倍 voltage結(jié)果等于0.846V;這是VCC電壓?? |
電池供電的話,直接讀15通道,就能算出電池電壓了. |
用5V供電ADC讀出來(lái)沒(méi)問(wèn)題,用電池供電讀出來(lái)卻是0 |
LAW1100 發(fā)表于 2024-8-30 13:56 圖片上的是STC8H1K08,這款是有內(nèi)部穩(wěn)定的參考電壓的 |
從外面建立比較電路作為開(kāi)關(guān)量送給單片機(jī)或是光耦信號(hào)給單片機(jī)可參https://blog.csdn.net/xianfajush ... 1018.2226.3001.4450 |
這個(gè)型號(hào)的芯片讀內(nèi)部基準(zhǔn)電壓沒(méi)有15通道 ,只能讀ROM,RAM和CHIPID這3種方式,真麻煩。 |
哪個(gè)系列的單片機(jī) 電路中其他的外設(shè)有多大影響 等等因素 |
如果電池是接在單片機(jī)的VCC上,則讀ADC的15通道得到adc15,計(jì)算得到VCC電壓: VCC = 1.19*1024/adc15,不需要外部電路,非常方便,準(zhǔn)確度高。如果你的VCC波動(dòng)大,加數(shù)字濾波即可穩(wěn)定。 |
因?yàn)镾TC沒(méi)有內(nèi)部參考,當(dāng)負(fù)載變化,ADC也會(huì)變化,最簡(jiǎn)單的是供電2.5V LDO 不加也可以同時(shí)間讀取15通道,計(jì)算轉(zhuǎn)化一下 |
Powered by 單片機(jī)教程網(wǎng)