1. 程式人生 > >關於OELD屏顯示電池電量的簡易方法

關於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濾波演算法。

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