文章目錄
- 一. 前言
- 二. CubeMX 配置
-
- 1. 定時器配置
- 2. 時鐘配置
- 三. 主要代碼
-
- 1. 定義定時器控制類,及相關宏定義
- 2. 建立定時器控制類對象,并聲明需要實作的方法
- 3. 實作具體方法
- 4. 聲明全局變量,以及方法
- 四. 測試
-
- 1. 正反通道同時輸出測試
-
- 1.1 測試代碼
- 1.2 測試效果
- 2. 正反通道單獨輸出測試
-
- 2.1 測試代碼
- 2.2 測試效果
一. 前言
- 測試時所使用的 MCU 是:STM32F103C8TX
- 測試時所使用的 CubeMX 版本是:6.1
- 測試代碼下載下傳位址是:測試例程
二. CubeMX 配置
1. 定時器配置
2. 時鐘配置
三. 主要代碼
1. 定義定時器控制類,及相關宏定義
/* code begin data type */
typedef struct
{
TIM_HandleTypeDef* htim;// 需要綁定的定時器句柄,如 htim1。
void (*startPWM_Output)(uint32_t channel); // 讓定時器正向通道開始輸出 PWM 的方法。
void (*stopPWM_Output)(uint32_t channel); // 讓定時器正向通道停止輸出 PWM 的方法。
void (*startPWMN_Output)(uint32_t channel);// 讓定時器反向通道開始輸出 PWM 的方法。
void (*stopPWMN_Output)(uint32_t channel); // 讓定時器反向通道停止輸出 PWM 的方法。
void (*changePWM_DutyCycle)(uint16_t pause, uint32_t channel);// 改變定時器指定通道的 PWM 占空比。
}obj_tim_1;// 定時器 1 的控制類
/* code end data type */
2. 建立定時器控制類對象,并聲明需要實作的方法
/* code begin variable definition */
obj_tim_1 user_tim_1;// 建立定時器 1 的控制類對象
/* code end variable definition */
/* code begin function statement */
static void user_tim_1_startPWM_Output(uint32_t channel); // 讓定時器正向通道開始輸出 PWM 的方法。
static void user_tim_1_stopPWM_Output(uint32_t channel); // 讓定時器正向通道停止輸出 PWM 的方法。
static void user_tim_1_startPWMN_Output(uint32_t channel);// 讓定時器反向通道開始輸出 PWM 的方法。
static void user_tim_1_stopPWMN_Output(uint32_t channel); // 讓定時器反向通道停止輸出 PWM 的方法。
static void user_tim_1_changePWM_DutyCycle(uint16_t pause, uint32_t channel);// 改變定時器指定通道的 PWM 占空比。
void init_user_tim_1(void);
/* code end function statement */
3. 實作具體方法
/* code begin function body */
static void user_tim_1_startPWM_Output(uint32_t channel)
{
HAL_TIM_PWM_Start(user_tim_1.htim, channel);
}
static void user_tim_1_stopPWM_Output(uint32_t channel)
{
HAL_TIM_PWM_Stop(user_tim_1.htim, channel);
}
static void user_tim_1_startPWMN_Output(uint32_t channel)
{
HAL_TIMEx_PWMN_Start(user_tim_1.htim, channel);
}
static void user_tim_1_stopPWMN_Output(uint32_t channel)
{
HAL_TIMEx_PWMN_Stop(user_tim_1.htim, channel);
}
static void user_tim_1_changePWM_DutyCycle(uint16_t pause, uint32_t channel)
{
__HAL_TIM_SET_COMPARE(user_tim_1.htim, channel, pause);
}
void init_user_tim_1(void)
{
user_tim_1.htim = &htim1;
user_tim_1.startPWM_Output = user_tim_1_startPWM_Output;
user_tim_1.stopPWM_Output = user_tim_1_stopPWM_Output;
user_tim_1.startPWMN_Output = user_tim_1_startPWMN_Output;
user_tim_1.stopPWMN_Output = user_tim_1_stopPWMN_Output;
user_tim_1.changePWM_DutyCycle = user_tim_1_changePWM_DutyCycle;
}
/* code end function body */
4. 聲明全局變量,以及方法
/* code begin variable statement */
extern obj_tim_1 user_tim_1;// 定時器 1 的控制類執行個體。
/* code end variable statement */
/* code begin function statement */
void init_user_tim_1(void);// 初始化定時器 1,需要在使用 user_tim_1 前調用。
/* code end function statement */
四. 測試
1. 正反通道同時輸出測試
1.1 測試代碼
int main(void)
{
...
init_user_tim_1();
...
while (1)
{
user_tim_1.startPWM_Output(TIM_CHANNEL_1);
user_tim_1.startPWMN_Output(TIM_CHANNEL_1);
user_tim_1.changePWM_DutyCycle(900, TIM_CHANNEL_1);
HAL_Delay(10);
user_tim_1.stopPWM_Output(TIM_CHANNEL_1);
user_tim_1.stopPWMN_Output(TIM_CHANNEL_1);
}
}
1.2 測試效果
同時輸出時,兩個通道的波形是互補的
2. 正反通道單獨輸出測試
2.1 測試代碼
int main(void)
{
...
init_user_tim_1();
...
while (1)
{
...
user_tim_1.startPWM_Output(TIM_CHANNEL_1);
user_tim_1.changePWM_DutyCycle(900, TIM_CHANNEL_1);
HAL_Delay(10);
user_tim_1.stopPWM_Output(TIM_CHANNEL_1);
user_tim_1.startPWMN_Output(TIM_CHANNEL_1);
user_tim_1.changePWM_DutyCycle(2700, TIM_CHANNEL_1);
HAL_Delay(10);
user_tim_1.stopPWMN_Output(TIM_CHANNEL_1);
}
}
2.2 測試效果
單獨輸出時,反向通道的輸出波形與正向通道的輸出波形一緻。