呼吸燈就是指電子産品上的LED燈的亮度随着時間由暗到亮逐漸增強,再由亮到暗逐漸衰減,有節奏感地一起一伏,就像是在呼吸一樣,因而被廣泛應用于手機、電腦等電子裝置的訓示燈中。在使用MCU開發相關的應用産品中也可以加入呼吸燈功能,增強使用者的體驗感,本篇文章靈動微電子一級代理英尚微将介紹如何使用MM32L0系列産品晶片做呼吸燈功能。
在平時應用中可以知道,MCU的GPIO輸出高低電平變化可以實作LED燈的亮、滅兩個過程,如果GPIO的電平一直維持高電平或者低電平,LED燈就處于長亮或長滅的狀态,呼吸燈就是通過較高頻率的電平變化來實作亮滅的切換,由于人的視覺暫留效應,肉眼無法迅速捕捉快速亮滅變化的過程,是以在視覺中一直出現一直亮或者滅的狀态,通過調整占空比可以控制LED燈的亮度,給人視覺上一種燈光由暗到亮逐漸增強,然後又由亮到暗逐漸衰減。
正常的成年人的吸氣呼氣時間整個過程持續大約3秒時間,即吸氣時間(LED燈亮度逐漸變亮)時間為1.5S,吸、呼氣時間(LED燈亮度逐漸變暗)時間為1.5S。
亮度随着時間逐漸變強再衰減,可以用兩種算數方式實作:半周期的正弦函數曲線和指數上升曲線及對稱的下降沿曲線。

指數方式曲線圖
要控制LED燈達到呼吸燈的效果,實際上就是要控制LED燈的亮度拟合呼吸特性曲線,在本次實驗将采用指數上升曲線及對稱的下降沿曲線方式,使用者如果對正弦方式感興趣也可以進行嘗試。在本次實驗中,我們使用MM32L0輸出較高頻率的PWM信号,通過調制信号的占空比,控制LED燈的亮度。
生成指數方式的曲線圖主要因素:
TIMPeriod:定時器的計數周期,它的值必須與PWM表中的極大值相等(應用中指派需要減1),而PWM表的極大值決定了控制的分辨率。例如極大值為10時,PWM占空比隻有10個等級精确到0.1,當極大值為1000時,PWM占空比1000個等級精确到0.001。在本次實驗中設定定時器的計數周期值為255+1,即PWM表中的極大值也是256。
TIM_Prescaler:定時器時鐘分頻因子,它控制定時器計數器CNT計數加1所需要的時間,它的值太大會導緻輸出的單個PWM波周期過長,影響控制的動态特性。如控制LED燈時,該值太大會導緻LED燈開關時間變長,閃爍明顯。一般來說該值越小越好。在本次實驗中設定定時器時鐘分頻因子為1757+1,即對時鐘1758分頻。
PWM表的點數:PWM表的點數即對拟合曲線的采樣點數,即把LED燈的亮度分為0-255個等級,采樣點越多,能更好地還原拟合曲線,采樣點太少,可能會導緻失真。在本次實驗中設定PWM表的點數為40。
Period_class:周期倍數,即PWM表中每個元素的循環次數,它影響拟合曲線的周期。在本次實驗中設定設定周期倍數為8。
本次實驗程式直接從MM32L073的定時器PWM輸出的例程的基礎上修改得來,TIM3配置成向上計數,PWM通道輸出也被配置成當計數器CNT的值小于輸出比較寄存CCR1的值時,PWM通道輸出低電平點亮LED燈。在函數的最後還使能了定時器中斷,每當定時器的一個計數周期完成時産生中斷,配合中斷服務函數,即可切換CCR1比較寄存器的值。
使用MM32L0系列MCU上述兩種方式都可以實作呼吸燈功能,兩種方法GPIO分别是PB4和PB5,download到MiniBoard中,可以對比測試兩種實作方法的差異性,選擇合适的呼吸燈實作方式。