STM32Cube的PWM控制基礎篇(一)一路PWM設置
STM32Cube的PWM控制基礎篇(二)多路佔空比不同的PWM
STM32Cube的PWM控制基礎篇(三)定時器的PWM設置詳解
今天來點乾貨!!
以下說明要建立在以上基礎篇知識已經搞清楚的情況下來操作!!!!!
通過之前的學習,我們可以基本上操作我們需要的PWM波形,今天就在這個基礎上做一些衍生,個人見解,不喜一定要在評論區噴我。
今日目標:用一個定時器控制另一個定時器下的三路PWM波
一、實驗原理
問題:我們在之前的學習中可以通過STM32Cube來設置好定時器,但是我們在改變定時器下PWM的佔空比時只能在代碼中改變其佔空比值,PWM波就按照該佔空比一直運行,但是我們如果需要佔空比隨時間變化呢?
(解決方案是在不佔用main.c主循環來處理的,以便於大家在使用操作系統或者想在main.c主循環寫一些其他東西的時候不影響PWM的輸出)
解決方案:我們通過另一個定時器中斷來改變當前定時器下的PWM波的佔空比,寫好計算方法之後就可以按照我們的計算方法來處理PWM。
總而言之就是用一個定時器去改變另一個定時器PWM的參數
二、操作步驟
要求:用定時器TIM1構建三個500Hz,脈衝寬度爲50%的PWM波,用定時器TIM2中斷以50Hz的頻率使三個PWM在佔空比爲50%和80%之間來回變化
1、根據自己的stm32的芯片型號來選擇,我這裏是STM32F103RBTx
2、選好芯片之後照舊設置RCC爲外部時鐘
3、設置定時器TIM1爲三路PWM模式,並設置時鐘源位內部時鐘,定時器TIM2啓動即可,如圖:
4、配置時鐘樹
時鐘源選擇外部時鐘,外部時鐘爲8MHz倍頻9倍後變爲72MHz後導入系統時鐘,通過AHB分頻後得到硬件時鐘HCLK後分配給各個部件,圖中標識了時鐘頻率最大值,根據後邊的分頻來保證各個部件不超過最大頻率(按照需求配置,不要小於PWM的頻率即可。PS:頻率越低越節能,越高性能越好)
5、定時器設置(設置PWM頻率)
點擊TIM1進入配置界面
我現在需要使PWM頻率達到500Hz,此時時鐘樹APB2設置爲72MHz,所以存在以下計算公式:
目的定時器頻率=時鐘源/(預分頻係數*自動重載值)
時鐘源:72MHz
目的定時器頻率:500Hz
所以我們可以自己設置自動重載值和預分頻係數使等式成立:
預分頻係數:144
自動重載值:1000
由於計數是從0開始,所以需要在設置量上減1得到以下設置圖
之後下拉滑動條,根據下圖設置進行更改,原理看博客頂部基礎篇(三)
以上設置效果爲PWM低電平有效,PWM關閉時引腳爲高電平
點擊ok保存,點擊TIM2進入配置界面
我現在需要使TIM2頻率達到50Hz,此時時鐘樹APB2設置爲72MHz,所以存在以下計算公式:
目的定時器頻率=時鐘源/(預分頻係數*自動重載值)
時鐘源:72MHz
目的定時器頻率:50Hz
所以我們可以自己設置自動重載值和預分頻係數使等式成立:
所以我們可以自己設置自動重載值和預分頻係數使等式成立:
預分頻係數:1440
自動重載值:1000
由於計數是從0開始,所以需要在設置量上減1得到以下設置圖
完成之後設置完畢,點擊菜單欄
按照以上設置生成項目(會玩的根據自己的習慣搞)
6、代碼部分(設置PWM佔空比)
由於本次應用不佔用main.c主循環,我們大多代碼是在tim.c中添加的
首先第一步,一定要在main.c中啓動定時器TIM2中斷
/* USER CODE BEGIN 2 */
HAL_TIM_Base_Start_IT(&htim2); \\啓動TIM2中斷
HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1);\\啓動TIM1的PWM1
HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_2);\\啓動TIM1的PWM2
HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_3);\\啓動TIM1的PWM3
/* USER CODE END 2 */
之後再在main.c中的/* USER CODE BEGIN PV */部分定義全局變量stat,中斷需要使用
/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/
uint8_t stat=0;
/* USER CODE END PV */
改完main.c文件後打開tim.c,在最下方的用戶代碼1部分添加如下TIM2中斷回調函數:
/* USER CODE BEGIN 1 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
extern uint8_t stat;
if (htim->Instance == TIM2)
{
if (stat==0) stat=1; \\改變狀態
else stat=0;
if(stat==0) \\判斷狀態,狀態爲0時設定佔空比爲50%
{
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 500);
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_2, 500);
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_3, 500);
}
else \\判斷狀態,狀態爲1時設定佔空比爲80%
{
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 800);
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_2, 800);
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_3, 800);
}
}
}
/* USER CODE END 1 */
工作結束,編譯下載!!
7、測試部分
用邏輯分析儀三個頻道夾子夾到對應PWM引腳,底線接板子底線,進行分析得到結果:
眼神不好的同學放大看!!!!!
本次實驗爲低電平有效,所以週期內有效部分是低電平部分
本次實驗PWM頻率爲500Hz,控制定時器TIM2頻率爲50Hz,所以應該是10個PWM週期進行一次變化、
由圖可知,10個佔空比爲50%的波形結束後變爲10個80%佔空比的波形,之後又變爲50%佔空比
由圖可知,一個週期爲2.0ms,10個週期改變一次
fpwm=1/Tpwm=1/0.02s=500Hz
fpwm:PWM頻率
Tpwm:PWM週期
fc=1/Tc=1/(0.02s*10)=50Hz
fc:控制頻率
Tc:控制週期
由此可知,PWM頻率500Hz,佔空比每0.2秒變化一次,控制頻率爲50Hz,佔空比變化爲50%-80%-50%-80%循環,實驗目標達成!
Good Game!!!!!!
接下來會推出一系列的關於PWM控制電機的分享,有需要的猿們敬請關注!!!!!
以上內容歡迎大家轉載引用,標明出處即可!!!!!