天天看點

STM32對HAL庫的PWM控制

要實作的是用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二極管的定時器及通道,

STM32對HAL庫的PWM控制

 在定時器設定中設定通道1為PWM,

STM32對HAL庫的PWM控制

設定分頻和計數

STM32對HAL庫的PWM控制

 以及通道有效的高低電平,我這是低電平二極管點亮,是以設為low,這個不能錯,不然不亮。

STM32對HAL庫的PWM控制
STM32對HAL庫的PWM控制

1、Mode(PWM的模式)

該選項中有PWM Mode 1和PWM Mode 2兩個選項

PWM Mode 1 :正常了解的PWM波

結果為:

STM32對HAL庫的PWM控制

PWM Mode 2 :與PWM1模式互補的波(PWM模式1為高電平時PWM2為低電平,反之亦然)

結果為:

STM32對HAL庫的PWM控制

2、Pulse(脈沖寬度)

Pulse16位二進制數,可以輸入範圍為0-2^16等于 0-65535的10進制數

改變Pulse就是改變PWM的初始脈沖寬度。

3、FastMode(快速模式【ENABLE/DISABLE】)

不用理。

4、CH Polarity(頻道有效電平【High/Low】)

顧名思義,這個參數就是控制有效電平的,因為有一些晶片的處理需要的是高電平有效,一些是需要低電平有效,為了在提高STM32适應性的同時不把我們程式猿的腦子搞亂,就有了這個設定,以下是實驗效果

當CH Polarity為High時,結果為:

STM32對HAL庫的PWM控制

當CH Polarity為Low時,結果為:

STM32對HAL庫的PWM控制

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的功能。即

STM32對HAL庫的PWM控制

還需要用到一個設定占空比的函數

STM32對HAL庫的PWM控制

 改變第三個參數的值,可以設定對應的占空比。

占空比 = Pulse / Period,這裡Period設的1000,Pulse 可以通過上面函數設定,也可以在PWM初始化函數設定。

呼吸燈的話可以寫成如下算法:

  

STM32對HAL庫的PWM控制

 即完成PWM在HAL庫中的應用。

同樣顧名思義,CH Idle State為該頻道PWM不輸出時的狀态

繼續閱讀