STM32Cube的PWM控制應用篇(二)用兩個個定時器生成三個相位差120度的等效正弦波

STM32Cube的PWM控制基礎篇(一)一路PWM設置
STM32Cube的PWM控制基礎篇(二)多路佔空比不同的PWM
STM32Cube的PWM控制基礎篇(三)定時器的PWM設置詳解
STM32Cube的PWM控制應用篇(一)用一個定時器改變另一個定時器下的三個PWM波佔空比
拖更好幾天,所以今天來點乾貨!!
以下說明要建立在以上基礎篇知識已經搞清楚的情況下來操作!!!!!

通過之前的學習,我們可以基本上操作我們需要的PWM波形,今天就在這個基礎上做一些衍生,個人見解,不喜一定要在評論區噴我。

今日目標:用兩個個定時器生成三個相位差120度的正弦波

一、實驗原理

要求:用定時器TIM1構建三個500Hz的等效正弦波,用定時器TIM2中斷三條正弦波的相位
由於三個正弦波相位一個相差120°,三個PWM波形爲500Hz,但是我們需要實現的等效正弦波爲50Hz,所以可以確定爲10個PWM週期爲一個正弦波週期,所以我們改變佔空比的頻率也爲50Hz,每次升高36°,10次爲一個正弦波週期。
結果應該爲每0.02s一個PWM週期,0.1s爲一個正弦波週期,每0.2秒改變次PWM佔空比。

注意:由於STM32只能生成0或3.3V電壓信號,在夢遊外部電路情況下不可以生成負電平信號,
     所以這裏只是闡述正弦波的的半波(正弦波所有部分都在正半軸)的情況。

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

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,首先在包含一下math.h和定義一下π的值,這裏用PI表示

/* USER CODE BEGIN 0 */
#include "math.h"
#define PI 3.14159265358979323846
/* USER CODE END 0 */

在最下方的用戶代碼1部分添加如下TIM2中斷回調函數:

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	extern uint8_t stat;

    if (htim->Instance == TIM2)
		{
		if (stat<10)  stat++;				
		else  stat=0;

		 __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 1000*sin((((float)stat*36)/360)*2*PI));
		 __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_2, 1000* sin(((((float)stat*36)+120)/360)*2*PI));
		 __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_3,  1000*sin(((((float)stat*36)-120)/360)*2*PI));					
		}
}

由於C語言用的是弧度,所以這裏把角度轉換成了弧度

7、測試部分

用邏輯分析儀三個頻道夾子夾到對應PWM引腳,底線接板子底線,進行分析得到結果:

在這裏插入圖片描述
由圖可知,一個正弦波週期大概爲0.2s,之後我們放大來看:
在這裏插入圖片描述
在這裏插入圖片描述
大概10個脈衝改變一次佔空比,所以20ms改變一次佔空比

三個PWM由於正弦計算相差120°且跨步爲36°的原因,下面兩項無法到0°、180°、360°這三個特殊角度,所以佔空比不爲0,看相位的話要把輸出波形加一個RC濾波器變爲電流後觀察,由於本人沒錢、買不起濾波器的原因,這裏大家將就看,主要看三相脈寬寬度較大區域密集的部分和脈寬寬度較小區域密集的部分分別爲波峯和波谷,至此爲止,實驗目的達到,實驗結束!!

										Good Game!!!!!!

					接下來會推出一系列的關於PWM控制電機的分享,有需要的猿們敬請關注!!!!!

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

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