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