问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

STM32CubeMX PWM配置与Keil5代码实现详解

创作时间:
作者:
@小白创作中心

STM32CubeMX PWM配置与Keil5代码实现详解

引用
CSDN
1.
https://m.blog.csdn.net/2403_87830841/article/details/143116910

本文将详细介绍如何在STM32CubeMX中配置PWM(脉冲宽度调制)信号,并通过Keil5编写代码实现PWM占空比的动态调整。PWM是嵌入式系统中常用的一种信号输出方式,广泛应用于电机控制、LED调光等领域。

一、基本配置

首先进行基本的配置设置:

  1. 将调试模式改为模拟输出
  2. 在RCC时钟配置中选择内部晶振(根据需要也可以选择外部晶振)

  1. 开始配置引脚
  2. 配置时钟树(此处省略具体步骤)
    这里将时钟频率设置为72MHz

正式开始PWM的配置

  1. PWM的设置需要定时器的时钟来控制频率(具体原理可以参考相关文章)
    这里以TIM3的Channel1为例进行介绍。

  2. 先开启内部时钟,然后选择PWM的工作模式一
    可以看到PA6被设置为TIM_CH1

  3. 接着配置参数
    前面提到时钟树设置为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,虽然它实际上还是在不断闪烁,但由于时间间隔太短,人眼无法分辨,就会看起来像是常亮状态。

  1. 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的输出口。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号