之前在我們設計的DIY電子時鐘里面,有一項需求就是數碼管顯示的亮度要隨環境亮度的改變而自動調節。這幾天在群里也有人問到這個問題,在群里說了大體思路后,還是不能理解,程序部分還是沒有是成功,今天小代就寫此文來說說數碼管亮度怎么調節?文后會附上源碼。
在我們硬件電路做好之后,再要去調節數碼管的亮度,那就只能從軟件入手,也就是編程來實現它。正常情況下,我們的程序都是給數碼管全亮,就像電機全速運行一樣,需要調速了,我們就采用PWM信號去控制,PWM信號的原理其實就是在相同的頻率下,減小了驅動電平的時間,這里調節亮度的原理也是差不多,就是在保持刷新頻率不變得情況下,減少每一位數碼管點亮的時間。
下面我們簡單說說正常的數碼管顯示程序怎么寫。全亮時,我們是現給數碼送段選數據,再送位選數據,然后延時一小會時間,再重復以上內容顯示下一位。現在我們有四位數碼管,我們讓每位點亮6ms,這樣4位數碼管顯示完一次(掃描一次)大約25ms,那1秒就可以掃描40次(40幀/秒),這樣我們人眼看到的就是同時顯示(視頻一般為25幀/秒)。具體過程如下(4位數碼管分別計為A、B、C、D):
開始: A 選通 延時6ms ,關閉A
B 選通 延時6ms ,關閉B
C 選通 延時6ms ,關閉C
D選通 延時6ms ,關閉 D
結束一幀掃描
(注:此處的選通包含段碼和位碼)
詳細程序如下:
正常顯示程序
如上圖就是正常的顯示代碼段(共陰數碼管),以上程序運行后可以在數碼管上看到顯示1234全亮度。這里說的延時一小會,這個時間是在毫秒級別的,調節這個時間,是可以調節亮度,但是時間稍微大一點,就會出現閃爍的情況了。我們要的是既要亮度可以調節,又要不閃爍,那就要用到我們說的PWM信號了。
現在要在不改變掃描速率的情況下,降低每一位點亮的時間,這樣我們看到的效果就是亮度的降低了。比如上圖中的程序,我們延時時間是6ms,這6ms時間都是點亮數碼管的,現在要減少點亮時間,那我們就點亮3ms,關閉3ms,這樣一來,掃描一位的時間還是6ms,但是這6ms時間內只有3ms時間是點亮的,自然亮度就降低了,而沒有改變掃描時間,自然不會出現閃爍的情況。具體過程如下:
開始: A 選通 延時3ms ,關閉A 延時3ms
B 選通 延時3ms ,關閉B 延時3ms
C 選通 延時3ms ,關閉C 延時3ms
D選通 延時3ms ,關閉 D 延時3ms
結束一幀掃描
(注:此處的選通包含段碼和位碼)
具體代碼如下:
如上圖所示,每一位點亮的時間只有3ms,但是掃描每一位數碼管的時間還是原來的6ms,這樣就實現了在不改變刷新頻率的情況下減少了每一位點亮的時間,從而減低了亮度,上圖中的亮度已經是全亮的一半了。
好了,到這要調節亮度的任務就已經完成了,但是我們還想拓展一下,如何讓這個亮度可以通過程序自動來調節而不是我們認為的修改程序呢?辦法很簡單,我們在程序中設一個變量為點亮的時間參數(比如設為on_time),每一位還是點亮6ms,那關閉的時間就是6ms-on_time。
那過程就變為如下:
開始: A 選通 延時on_time ,關閉A延時6ms-on_time
B 選通 延時on_time ,關閉B延時6ms-on_time
C 選通 延時on_time ,關閉C延時6ms-on_time
D選通 延時on_time ,關閉 D延時6ms-on_time
結束一幀掃描
要讓程序自動調節這個變量on_time,就需要來調節的參數,比如時間參數,在幾點到幾點之間亮度為多少,可以多少幾個檔次。更高級別的可以通過光敏電阻來實現檢測環境光照度來調節這個現實的時間參數on_time,這樣就可以實現正真的隨環境的變化而變化。我們做的DIY電子時鐘就是采用最后說的方式,通過光敏電阻分壓后單片機ADC轉換得到電壓值,再根據這個電壓值來自動的調節點亮的時間。通過修改延時函數,可以做到真正的無極調光。
-
單片機
+關注
關注
6035文章
44554瀏覽量
634653 -
數碼管
+關注
關注
32文章
1882瀏覽量
91064 -
光敏電阻
+關注
關注
4文章
293瀏覽量
48972 -
PWM信號
+關注
關注
3文章
95瀏覽量
20142 -
ADC采樣
+關注
關注
0文章
134瀏覽量
12840
發布評論請先 登錄
相關推薦
評論