STM32CubeMX PWM配置与Keil5代码实现详解
STM32CubeMX PWM配置与Keil5代码实现详解
本文将详细介绍如何在STM32CubeMX中配置PWM(脉冲宽度调制)信号,并通过Keil5编写代码实现PWM占空比的动态调整。PWM是嵌入式系统中常用的一种信号输出方式,广泛应用于电机控制、LED调光等领域。
一、基本配置
首先进行基本的配置设置:
- 将调试模式改为模拟输出
- 在RCC时钟配置中选择内部晶振(根据需要也可以选择外部晶振)
- 开始配置引脚
- 配置时钟树(此处省略具体步骤)
这里将时钟频率设置为72MHz
正式开始PWM的配置
PWM的设置需要定时器的时钟来控制频率(具体原理可以参考相关文章)
这里以TIM3的Channel1为例进行介绍。先开启内部时钟,然后选择PWM的工作模式一
可以看到PA6被设置为TIM_CH1接着配置参数
前面提到时钟树设置为72MHz,即每秒7200万脉冲。为了方便计算,可以将时钟进行72分频,这样定时器每秒计数1000000次。
可以将自动重装载值设置为100,这样每秒就会有一万次从0数到99的过程,也就是说一秒钟就会输出1万组PWM波形,这就是PWM的频率,10000Hz。
从0数到99这一过程所用的时间也就是PWM的周期,即0.1ms。
由于自动重装值设置为100-1,所以比较寄存器的值只能在0-99之间赋值。
比如这里给50。那么初始的占空比,就是50/100=50%。
之后写代码改变比较寄存器的值时,改的就是这个50。
如果ARR设置为2000-1,那么比较寄存器的值就是在0-1999之间设置。占空比计算方法相同。
注意事项
PWM本质上是模拟电压输出。如果你设置周期为1秒,它就会每秒输出一个电压,这样LED看起来就会是一闪一闪的。
但是如果你将时间设置得很短,比如0.1ms,虽然它实际上还是在不断闪烁,但由于时间间隔太短,人眼无法分辨,就会看起来像是常亮状态。
- NVIC中断使能(图略)
至此基本配置结束,接下来可以生成代码。
二、在Keil5中编写代码 改变PWM的占空比
关于如何找到中断服务函数和回调函数的过程,前面的定时器中断部分已有详细说明。这里同样使用定时器内部中断的方式来控制PWM的占空比。
下面是具体的代码实现:
int i = 0;
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim -> Instance == TIM3)
{
__HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_3,i+=20);
if(i == 100)
{
i = 0;
}
}
}
这段代码实现了通过定时器产生中断,每秒触发一次中断,在中断服务程序中动态改变PWM的占空比,从而实现LED亮度的周期性变化。
这里需要特别注意,LED的连接方式应该是负极接地,正极连接到PWM的输出口。