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循环中修改脉宽,即修改占空比。
参考资料: