要實作的是用PWM實作呼吸燈的效果。
先簡單說一下原理,比如對一個電燈來說,你在1秒内,打開開關0.5秒,再關閉0.5秒,如此反複,那麼電燈就會閃爍,但是如果是1毫秒内,0.5毫秒打開,0.5毫秒關閉,由于視覺暫留作用,也可能由于燈光的亮滅速度趕不上開關速度(還沒全亮就又沒電了),于是人眼不感覺電燈在閃爍,而是感覺燈的亮度少了一半。同理,如果是0.1毫秒開,0.9毫秒滅,感覺燈的亮度就隻有1/10了。
然後我們在cubemx中進行設定,STM32 的定時器除了 TIM6 和 7。其他的定時器都可以用來産生 PWM 輸出。其中進階定時器 TIM1 和 TIM8 可以同時産生多達 7 路的 PWM 輸出。而通用定時器也能同時産生多達 4路的 PWM 輸出,這樣, STM32 最多可以同時産生 30 路 PWM 輸出。
設定一個led二極管的定時器及通道,
在定時器設定中設定通道1為PWM,
設定分頻和計數
以及通道有效的高低電平,我這是低電平二極管點亮,是以設為low,這個不能錯,不然不亮。
1、Mode(PWM的模式)
該選項中有PWM Mode 1和PWM Mode 2兩個選項
PWM Mode 1 :正常了解的PWM波
結果為:
PWM Mode 2 :與PWM1模式互補的波(PWM模式1為高電平時PWM2為低電平,反之亦然)
結果為:
2、Pulse(脈沖寬度)
Pulse16位二進制數,可以輸入範圍為0-2^16等于 0-65535的10進制數
改變Pulse就是改變PWM的初始脈沖寬度。
3、FastMode(快速模式【ENABLE/DISABLE】)
不用理。
4、CH Polarity(頻道有效電平【High/Low】)
顧名思義,這個參數就是控制有效電平的,因為有一些晶片的處理需要的是高電平有效,一些是需要低電平有效,為了在提高STM32适應性的同時不把我們程式猿的腦子搞亂,就有了這個設定,以下是實驗效果
當CH Polarity為High時,結果為:
當CH Polarity為Low時,結果為:
5、CH Idle State(空閑狀态【Set/Reset】)
同樣顧名思義,CH Idle State為該頻道PWM不輸出時的狀态
這裡比較重要的是分頻和計數,上一節定時器中斷的參數設定也可以知道,t為兩者相乘除以對應的時鐘頻率。 頻率是t的倒數。由時鐘樹可以得知時鐘頻率是72Mhz。
這裡涉及到一個點,呼吸燈,當 PWM 周期太慢(低于 50Hz)的時候,我們就會明顯感覺到閃爍了。是以, PWM 周期在這裡不宜設定的太小。
頻率f即PWM周期,即f = 72M /72 * 1000, 至于分頻和計數具體是多少,個人認為是多少都行,隻要他們的乘積符合條件。 一般來說,我會把分頻設定為時鐘頻率的因子,便于計算。 然後計數的大小,大的話,可調節的PWM占空比就更加精細,越小就比較粗糙,一般設1000吧。
初始化完程式後,需要在程式中打開PWM的功能。即
還需要用到一個設定占空比的函數
改變第三個參數的值,可以設定對應的占空比。
占空比 = Pulse / Period,這裡Period設的1000,Pulse 可以通過上面函數設定,也可以在PWM初始化函數設定。
呼吸燈的話可以寫成如下算法:
即完成PWM在HAL庫中的應用。
同樣顧名思義,CH Idle State為該頻道PWM不輸出時的狀态