504 字
3 分钟
STM32 PWM输出
2022-10-23

定时器参数设置#

STM32 中 PWM 的定时器参数设置需要参考如下公式:

PWMf=TIMf(PSC+1)×(ARR+1)PWM_f=\frac{TIM_f}{(PSC+1) \times (ARR+1)}

  • PWMfPWM_f :PWM 的输出频率,1PWMf\frac{1}{PWM_f} 是单个 PWM 信号的脉宽
  • TIMfTIM_f :用于 PWM 输出的定时器(TIM)的时钟频率
  • PSCPSC (Prescaler) :时钟分频
  • ARRARR (AutoReload Register) :自动装载寄存器

PWM 设置案例#

以让 PA8 输出脉宽为 2.5ms 的 PWM 信号为例:

  • 步骤 1:Timers 选择定时器 TIM1 的设置
  • 步骤 2:Clock Sourse 选择 Internal Clock 即 APB2 时钟
  • 步骤 3:Channel1(TIM1_CH1 = PA8) 选择 PWM Generation CH1 输出模式

img

详细参数设置:

步骤 1:根据公式 PWMf=10.0025=400HzPWM_f=\frac{1}{0.0025}=400Hz,时钟频率 TIMf=8MHzTIM_f=8MHz,然后根据精度、脉宽等要求设置 PSC(分频)和 ARR(自动装载值)

步骤 2:使能自动重装载(auto-reload preload),否则满足一次输出需求后,需要手动重装载,才能输出 PWM

步骤 3:设置 Pulse(比较值),PulseARR×PWMf\frac{Pulse}{ARR\times PWM_f} 是 PWM 中高电平的输出时间

img


调整 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);
STM32 PWM输出
https://fuwari.vercel.app/posts/嵌入式/stm32/stm32-pwm输出/
作者
Asuwee
发布于
2022-10-23
许可协议
CC BY-NC-SA 4.0