一、什麼是PWM
PWM是脈衝寬度調製,PWM我個人理解爲一個方波信號,其參數有兩個
(1)佔空比:脈衝的有效電平佔整個週期的百分比。
(2)頻率:整個PWM波的頻率,1/一個脈衝週期
由上可知,一個PWM波形我們可以通過調整其頻率和佔空比來達到我們需要的波形或是等效電壓。(3.3V的電壓如果PWM調製的等效電壓爲3.3佔空比【60%佔空比電壓等效爲3.3V60%=1.98V】)具體內容如圖所示:
二、PWM的時鐘來源
由於PWM是一個有頻率有脈衝寬度的方波,所以一定存在一個標準的時鐘信號爲PWM提供基準時鐘,在STM32F1系列中,其中定時器TIM1、TIM8是掛在在APB2上的,而定時器TIM2、3、4是關在在APB1上的。所以我們需要在時鐘樹上調整其時鐘源頻率來滿足PWM波形需要。
三、操作步驟
要求:構建一個500Hz,脈衝寬度爲70%的PWM波
1、根據自己的stm32的芯片型號來選擇,我這裏是STM32F103RBTx
2、選好芯片之後照舊設置RCC爲外部時鐘
3、設置定時器TIM1爲PWM模式,並設置時鐘源位內部時鐘,如圖:
4、配置時鐘樹,由於本次使用TIM1,所以主要配置APB2
時鐘源選擇外部時鐘,外部時鐘爲8MHz倍頻9倍後變爲72MHz後導入系統時鐘,通過AHB分頻後得到硬件時鐘HCLK後分配給各個部件,圖中標識了時鐘頻率最大值,根據後邊的分頻來保證各個部件不超過最大頻率(按照需求配置,不要小於PWM的頻率即可。PS:頻率越低越節能,越高性能越好)
5、定時器設置(設置PWM頻率)
點擊TIM1進入配置界面
我現在需要使PWM頻率達到500Hz,此時時鐘樹APB2設置爲72MHz,所以存在以下計算公式:
目的定時器頻率=時鐘源/(預分頻係數*自動重載值)
時鐘源:72MHz
目的定時器頻率:500Hz
所以我們可以自己設置自動重載值和預分頻係數使等式成立:
預分頻係數:144
自動重載值:1000
由於計數是從0開始,所以需要在設置量上減1得到以下設置圖
定時器設置完成後下拉定時器菜單可見PWM設置部分
PWM Mode爲設置PWM輸出模式
模式1: a、當定時器計數爲向上計數,則計數小於佔空比的部分爲有效電平
b、當定時器計數爲向下計數,則計數大於佔空比的部分爲有效電平
計數方式在下圖第二行
模式2: a、當定時器計數爲向上計數,則計數大於佔空比的部分爲有效電平
b、當定時器計數爲向下計數,則計數小於佔空比的部分爲有效電平
總結:PWM mode 1和PWM mode 2互補
到這步設置完成,點擊菜單欄
按照以上設置生成項目(會玩的根據自己的習慣搞)
6、代碼部分(設置PWM佔空比)
在生成的項目的main.c部分添加如下代碼
/* USER CODE BEGIN 2 */
HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1);
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 700);
/* USER CODE END 2 */
由於我們只設置了一路PWM,就啓動一路就行,第一句是啓動PWM,第二句是設置PWM的佔空比,兩個函數的第一參數都是定時器,第二參數爲頻道,設置佔空比的第三參數爲計數值,存在以下公式:
佔空比=(計數值/自動重載值)*100%
自動重載值:定時器的自動重載值
到此爲止,所有設置工作結束,編譯,下載到板子上。
7、測試部分
正所謂所有不給實驗結果的博客都是流氓博客,所以在此花費幾百大洋買了個邏輯分析儀來給大家展示一下測試結果
由於設置定時器的PWM後自動分配了PWM的輸出引腳,我這裏爲PA8,所以我直接將邏輯分析儀頻道0接到STM32的PA8引腳上,邏輯分析儀底線接地(PS:懶得接地的小夥子不怕分析儀燒了就不用接地了,哈哈哈哈哈嗝!!!!!)
我將邏輯分析儀頻道0設置了對PWM的分析,方便大家查看(邏輯分析儀各人用的不一樣,這裏設置就不上圖了,直接放結果)
以下是頻率爲500Hz,佔空比爲70%的PWM波:
由圖可知,一個週期爲20ms,所以
f=1/T=1/0.02s=500Hz
f:頻率
T:週期
由圖可知,佔空比爲70%達到了一開始的實驗要求。
Good Game!!!!!!
接下來會推出一系列的關於PWM控制電機的分享,有需要的猿們敬請關注!!!!!
以上內容歡迎大家轉載引用,標明出處即可!!!!!