STM32Cube的PWM控制應用篇(一)用一個定時器改變另一個定時器下的三個PWM波佔空比

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爲外部時鐘

設置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得到以下設置圖
TIM2設置
完成之後設置完畢,點擊菜單欄
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
按照以上設置生成項目(會玩的根據自己的習慣搞)

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控制電機的分享,有需要的猿們敬請關注!!!!!

以上內容歡迎大家轉載引用,標明出處即可!!!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章