關於OELD屏顯示電池電量的簡易方法


如何采集電源電壓大家可能都熟悉,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濾波算法。

到此,就可以在顯示屏上面顯示不同的電池圖標了


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM