要實現的是用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庫中的應用。
