天天看点

STM32 笔记 05:如何使用 CubeMX 配置 Timer 输出可变 PWM(正向,反向同时或独自)一. 前言二. CubeMX 配置三. 主要代码四. 测试

文章目录

  • 一. 前言
  • 二. CubeMX 配置
    • 1. 定时器配置
    • 2. 时钟配置
  • 三. 主要代码
    • 1. 定义定时器控制类,及相关宏定义
    • 2. 新建定时器控制类对象,并声明需要实现的方法
    • 3. 实现具体方法
    • 4. 声明全局变量,以及方法
  • 四. 测试
    • 1. 正反通道同时输出测试
      • 1.1 测试代码
      • 1.2 测试效果
    • 2. 正反通道单独输出测试
      • 2.1 测试代码
      • 2.2 测试效果

一. 前言

  • 测试时所使用的 MCU 是:STM32F103C8TX
  • 测试时所使用的 CubeMX 版本是:6.1
  • 测试代码下载地址是:测试例程

二. CubeMX 配置

1. 定时器配置

STM32 笔记 05:如何使用 CubeMX 配置 Timer 输出可变 PWM(正向,反向同时或独自)一. 前言二. CubeMX 配置三. 主要代码四. 测试
STM32 笔记 05:如何使用 CubeMX 配置 Timer 输出可变 PWM(正向,反向同时或独自)一. 前言二. CubeMX 配置三. 主要代码四. 测试

2. 时钟配置

STM32 笔记 05:如何使用 CubeMX 配置 Timer 输出可变 PWM(正向,反向同时或独自)一. 前言二. CubeMX 配置三. 主要代码四. 测试

三. 主要代码

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 测试效果

单独输出时,反向通道的输出波形与正向通道的输出波形一致。

继续阅读