0%

STM32-HAL折腾杂记(三)

STM32输出PWM,实现LED亮度渐变。

MCU:STM32F103C8T6

HAL:STM32Cube_FW_F1_V1.8.4

高级控制定时器&通用定时器

直接截取ST官方的数据手册说明:

计数器模式

直接截取ST官方的参考手册说明:

PWM输出模式

在PWM输出模式下,可以产生一个由TIMx_ARR寄存器确定频率、TIMx_CCRx寄存器(捕获/比较寄存器)确定占空比的信号。

模式1

在向上计数时,若TIMx_CNT<TIMx_CCRx,则为有效电平,否则为无效电平;在向下计数时,若TIMx_CNT>TIMx_CCRx,则为无效电平,否则为有效电平。

模式2

在向上计数时,若TIMx_CNT<TIMx_CCRx,则为无效电平,否则为有效电平;在向下计数时,若TIMx_CNT>TIMx_CCRx,则为有效电平,否则为无效电平。

有效电平可以是高电平,也可以是低电平,可以在STM32CubeMX中配置。

频率&占空比

频率=定时器时钟源频率/((自动装载值+1)*(预分频值+1))(单位:Hz)

占空比=TIMx_CCRx寄存器值/自动装载值(单位:%)

STM32CubeMX配置

选择TIM2,内部时钟源Internal Clock,选择通道1输出PWM(PWM Generation CH1);

预分频值Prescaler设置为71,计数模式选择Up(向上计数),自动装载值(即Counter Period)设置为499,则PWM输出频率为72M/((71+1)*(499+1))=2K(TIM2时钟源频率:72MHz,单位:Hz);

选择PWM模式1(PWM mode 1),PWM脉宽(Pulse),即为寄存器TIMx_CCRx的值,先设置为0,随后在源码中会自定义增减,有效电平(CH Polarity)设置为低电平(Low),则无效电平为高电平;

其它设置照旧。

程序源码

先在main.c中定义一个表示PWM脉宽的变量;

uint16_t PWM_Duty=0;		//PWM脉宽,即捕获/比较寄存器值

接着在主函数下使能定时器2的通道1输出PWM

HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_1);		//使能定时器2的通道1输出PWM

最后在while循环中修改脉宽,即修改占空比。


参考资料

【STM32】HAL库 STM32CubeMX教程七—PWM输出(呼吸灯)