504 字
3 分钟
STM32 PWM输出
定时器参数设置
STM32 中 PWM 的定时器参数设置需要参考如下公式:
- :PWM 的输出频率, 是单个 PWM 信号的脉宽
- :用于 PWM 输出的定时器(TIM)的时钟频率
- (Prescaler) :时钟分频
- (AutoReload Register) :自动装载寄存器
PWM 设置案例
以让 PA8 输出脉宽为 2.5ms 的 PWM 信号为例:
- 步骤 1:Timers 选择定时器 TIM1 的设置
- 步骤 2:Clock Sourse 选择 Internal Clock 即 APB2 时钟
- 步骤 3:Channel1(TIM1_CH1 = PA8) 选择 PWM Generation CH1 输出模式
详细参数设置:
步骤 1:根据公式 ,时钟频率 ,然后根据精度、脉宽等要求设置 PSC(分频)和 ARR(自动装载值)
步骤 2:使能自动重装载(auto-reload preload),否则满足一次输出需求后,需要手动重装载,才能输出 PWM
步骤 3:设置 Pulse(比较值), 是 PWM 中高电平的输出时间
调整 PWM 占空比
__HAL_TIM_SET_COMPARE()
/** * @brief Set the TIM Capture Compare Register value on runtime without calling another time ConfigChannel function. * @param __HANDLE__ TIM handle. * @param __CHANNEL__ TIM Channels to be configured. * This parameter can be one of the following values: * @arg TIM_CHANNEL_1: TIM Channel 1 selected * @arg TIM_CHANNEL_2: TIM Channel 2 selected * @arg TIM_CHANNEL_3: TIM Channel 3 selected * @arg TIM_CHANNEL_4: TIM Channel 4 selected * @param __COMPARE__ specifies the Capture Compare register new value. * @retval None */#define __HAL_TIM_SET_COMPARE(__HANDLE__, __CHANNEL__, __COMPARE__) \ (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCR1 = (__COMPARE__)) :\ ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCR2 = (__COMPARE__)) :\ ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCR3 = (__COMPARE__)) :\ ((__HANDLE__)->Instance->CCR4 = (__COMPARE__)))
案例
//使能PWM输出HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);//调整PWM占空比(比较值)__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 2000);
调整 PWM 脉宽
__HAL_TIM_SET_AUTORELOAD()
/** * @brief Set the TIM Autoreload Register value on runtime without calling another time any Init function. * @param __HANDLE__ TIM handle. * @param __AUTORELOAD__ specifies the Counter register new value. * @retval None */#define __HAL_TIM_SET_AUTORELOAD(__HANDLE__, __AUTORELOAD__) \ do{ \ (__HANDLE__)->Instance->ARR = (__AUTORELOAD__); \ (__HANDLE__)->Init.Period = (__AUTORELOAD__); \ } while(0)
案例
//调整PWM的脉宽计数为0~4999(5000次)__HAL_TIM_SET_AUTORELOAD(&htim1, 5000-1);
设置时钟分频
__HAL_TIM_SET_PRESCALER()
/** * @brief Set the TIM Prescaler on runtime. * @param __HANDLE__ TIM handle. * @param __PRESC__ specifies the Prescaler new value. * @retval None */#define __HAL_TIM_SET_PRESCALER(__HANDLE__, __PRESC__) ((__HANDLE__)->Instance->PSC = (__PRESC__))
案例
//设置时钟分频为1/16__HAL_TIM_SET_PRESCALER(&htim1, 16-1);