如何采集電源電壓大家可能都熟悉,stm32的ADC+DMA能很方便迅速的幫我們采集到自己想要的電壓數據。使用DMA進行數據搬運也能很好的減輕CPU的一部分壓力。但是這樣只是第一步——數據。
用戶想看到的有時候並不是數據,他們想要更直觀方便的看到自己設備的電量。這就要求我們能在顯示屏上通過更直觀的方法顯示電量。(怎么樣,下面這樣夠直觀吧。)

這也是現在嵌入式設備中常用的方法,用一個小電池圖標表示,不同的電量里面就是不同的填充度。這樣可以很直觀的看到設備的剩余電量。
其實說是電量,實際就是用采樣來的電壓除以總電壓,得到一個百分比,然后根據這個百分比顯示不同的電池模式,就可以實現不同電量的刷新。一開始看到有人用一個小框框,然后框框里面用一個百分數表示當前的電量百分比,但我覺得那種方法不是很好。還是電池的飽和度更直觀一點。
關於stm32的ADC采集電源電壓可以看我的上一篇博客,或者網上也有很多優秀的文章,這里暫且假設我們已經獲取了電源電壓了。而獲取電源電壓只是第一步,還需要對電源電壓進行一下簡單的均值濾波。這里我每次在DMA中斷里面每30個數取一個平均,得到較為穩定的電源電壓。
static void ADC_filter(void) { int sum = 0; u8 i = 0; for(i = 0;i < N;i++) { sum+= AD_value[i]; } after_filter = sum / N; //每一次調用這個函數after_filter就更新一次; }
上面得到的實際上是ADC的16位原始數據,需要進一步處理成我們需要的實際電壓值:
float ADC_cal_aveg(void) { float temp = 0; temp = (float)(after_filter) * (3.3 / 4096);//計算電壓 return temp; }
這樣就完成了第一階段。后面就是利用OLED的顯示操作把數字顯示成更直觀的電池圖標。
我的OLED屏是128*64分辨率的,我想在右上角顯示一個電池小圖標,用PCtoLCD2002取模軟件進行圖片取模。我選取電池規格為8*16的像素,(我不會告訴你上面這些點都是我一點點點上去的。。)

然后在這個電池里面進行填充,每填充一格就取一次模,所以一共可以取14個模型出來,也就是說電池可以14級電量顯示。
這是取出來的部分模型:

3.3V的電壓用14級顯示出來,那么每3.3/14 = 0.24V就可以刷新一次電池。
所以我就想了可以這樣處理,就是把采集來的電壓,先除以0.24,得數的整數部分就是他的級數,
3.3V / 0.24 = 13 級,也就是滿電量。
2.8V / 0.24 = 11 級
這個級數正好可以被顯示函數使用,顯示函數就是根據不同的電量級數顯示不同的電池模型的。
void OLED_Show_RealTime_Battery(u8 x,u8 y) { float ADC_Val = 0; unsigned int ADC_Int = 0; ADC_Val = ADC_cal_aveg(); ADC_Int = (int)(ADC_Val / 0.24); //這個0.24為 3.3/14 得來的數,就是每一級的步長,然后采樣電壓值除以步長就是級數 OLED_Show_Battery(x,y,ADC_Int); //上面的級數直接在這里面使用,配合電池模型順序即可。 }
最后一個函數為OLED的顯示函數,可以在屏上顯示自己取出的字模。
最后吧這個函數放在主函數的while循環里,不斷采樣電池電壓,不斷根據電壓刷新電池模型的顯示。目前的問題就是不知道這個方法獲得的電壓是不是穩定。可能還是需要更精確的ADC濾波算法。
到此,就可以在顯示屏上面顯示不同的電池圖標了

