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

STM32使用PWM制作呼吸灯

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

STM32使用PWM制作呼吸灯

引用
1
来源
1.
https://www.iotword.com/35157.html

STM32使用PWM制作呼吸灯

一、定时器理论知识

PWM介绍
  1. 定义
    PWM(Pulse Width Modulation,脉宽调制)是一种通过控制脉冲的宽度来调节功率输送的技术。简单来说,PWM是通过改变信号的“开”时间(高电平时间)和“关”时间(低电平时间)来实现对输出功率的控制。常用于控制电机转速、调节亮度、音频信号合成等场景。

  2. 基本原理
    PWM通过固定的时间周期内改变信号的“高电平”与“低电平”的比例(即占空比)来控制功率的传递。通过改变占空比,可以控制电流的平均值,从而实现对电动机、LED亮度等设备的调节。PWM的频率保持不变,而占空比则在0到100%之间变化:

  • 占空比(Duty Cycle):即高电平占总周期的时间比例。例如,占空比为50%的PWM波表示高电平持续50%的时间,低电平持续50%的时间。
  • 频率(Frequency):PWM波的周期时间,也就是信号变化的频率。
  1. 优点及应用范围
  • 优点:

  • 高效能:PWM能有效控制功率传输,并且电源开关工作时几乎没有能量损耗。

  • 精确控制:可以精确地控制功率输出,通过调节占空比来实现精确调节。

  • 热量低:相比传统的线性调节方式,PWM的开关特性能够大大减少因电流流过元件而产生的热量。

  • 应用范围:

  • 电机控制:控制电机转速。

  • 亮度调节:在LED灯光调节中广泛应用。

  • 音频合成:生成模拟音频信号。

  • 电源调节:例如在电源转换中,使用PWM控制输出电压。

  • 马达驱动:如机器人、风扇等设备的调速。

  1. 主要参数
  • 频率(Frequency):PWM信号的周期性变化速率,单位为Hz。频率高则调节更细腻,低则响应较慢。
  • 占空比(Duty Cycle):高电平时间与总周期时间的比例,通常以百分比表示。
  • 周期(Period):一个PWM信号从开始到结束的时间总长度,等于1/频率。
  • 电压幅度(Amplitude):高电平时的电压值,一般由驱动电路提供。
  1. PWM的产生
    PWM信号的产生一般有两种方式:
  • 硬件PWM:由微控制器内部的定时器和计数器自动生成。STM32等微控制器通过配置定时器来输出PWM信号。硬件PWM稳定可靠,效率高,适用于大多数应用。
  • 软件PWM:通过软件控制GPIO引脚的高低电平输出,虽然实现简单,但通常需要较高的计算资源,效率较低,不适合高精度控制。
  1. PWM工作原理
    PWM的工作原理基于一个固定频率的时钟,通过调节高电平的持续时间(占空比)来实现对功率的调控。信号的周期由时钟产生器设定,信号的高电平和低电平通过占空比控制,常见的PWM波形是矩形波。
  • 占空比:例如占空比50%意味着PWM波在一个周期内,高电平和低电平的时间相等。若占空比为25%,则高电平持续四分之一的周期,低电平占据剩余的部分。
  1. PWM输出的模式区别
    PWM输出有多种工作模式,主要包括:
  • 正常模式(Up Mode):定时器计数从0计数到自动重载值(ARR),然后重载并继续。
  • 向下计数模式(Down Mode):定时器从ARR计数到0,再反向计数。
  • 中心对称模式(Center-aligned Mode):定时器计数到ARR值后会反向计数,这样PWM波形会相对于中心对称,常用于减小噪音和振动。
  • 边沿对齐模式(Edge-aligned Mode):PWM波的上升沿或下降沿与计数器的某些边缘对齐。
  1. PWM的计数模式
    PWM的计数模式主要有两种:
  • 向上计数(Up-counting):计数器从0开始递增到设定的ARR(Auto-Reload Register)值,当计数器达到ARR值时,它会重新从0开始。
  • 向下计数(Down-counting):计数器从ARR开始递减到0,当计数器为0时,会重新从ARR开始。
  • 向上/向下计数(Up/Down-counting):这种模式结合了上升和下降计数,计数器在ARR值和0值之间交替进行计数。此模式下,PWM波形具有更对称的特性。
  1. PWM相关配置寄存器
    在STM32微控制器等基于定时器的PWM生成过程中,涉及到多个寄存器的配置,以下是常见的几个配置寄存器:
  • 捕获/比较模式寄存器(TIMx_CCMR1)
    该寄存器用于配置定时器的捕获/比较模式,决定定时器输出的波形类型、PWM的占空比、计数模式等。主要控制PWM信号的输出模式,比如PWM的极性、输出的比较输出模式等。

  • 捕获/比较使能寄存器(TIMx_CCER)
    该寄存器用于使能定时器的通道输出。通过设置该寄存器,定时器的捕获/比较输出可以发送到外部引脚。控制PWM输出信号的开关、极性等。确保PWM信号能够正确地输出到GPIO引脚。

  • 捕获/比较寄存器(TIMx_CCRx)
    该寄存器用于存储捕获/比较的值,控制PWM信号的高电平持续时间(即占空比)。通过写入CCR寄存器,可以设置PWM信号的占空比,从而实现对输出信号的调节。

总结

PWM是通过改变脉冲的宽度来控制功率的一种技术,具有高效、精确、低热量的优点,广泛应用于电机调速、LED亮度控制等领域。通过定时器配置寄存器,用户可以灵活控制PWM的输出模式、占空比和频率,从而实现对电气设备的精确调控。

二、工程建立

  1. 创建新项目

  2. RCC配置

  3. SYS配置

  4. 配置定时器
    这里我们选择定时器3和定时器4来实现定时的功位置3,分频系数为71,向上计数模式,计数周期为500,使能自动重载模式。通道1选择:PWM Generation CH1(PWM输出通道1)
    设置分频系数为71,计数周期为500,其它默认。

    定时器四我们也选择PWM Generation CH1(PWM输出通道1),计数周期根据自己需要进行设置,这里我设置的跟定时器三一样

  5. 配置时钟树

  6. 配置项目设置
    设置项目名称、路径(不能有中文)、编译器及版本

三、代码完善

  1. 设置占空比
    在main.c中,添加变量,用以存储占空比,且初始值设置为10.
uint16_t duty_num3 = 10;
uint16_t duty_num4 = 10;
  1. 开启PWM信道
    开始TIM3的通道3,输出PWM。
    开始TIM4的通道4,输出PWM。
    在main函数中添加:
HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_1);
  1. 具体应用
    这里我们设置为每隔50毫秒,占空比加10,如果超过400(也就是PWM周期),又逐渐递减,占空比减10。(即灯会从亮到暗,再从暗到亮逐渐变化)
while (1)
{
    /* USER CODE END WHILE */
    HAL_Delay(50);
    duty_num3 = duty_num3 + 10;
    duty_num4 = duty_num4 + 10;
    if(duty_num3 > 400)
    {
        while(duty_num3!=0)
        { 	
            HAL_Delay(50);
            duty_num3 = duty_num3 - 10;
            __HAL_TIM_SetCompare(&htim3,TIM_CHANNEL_1,duty_num3);			 
        }
        HAL_Delay(50);
        duty_num3 = 0;
    }
    __HAL_TIM_SetCompare(&htim3,TIM_CHANNEL_1,duty_num3);
        if(duty_num4 > 450)
    {
        while(duty_num4!=0)
        { 	
            HAL_Delay(50);	
            duty_num4 = duty_num4 - 10;
            __HAL_TIM_SetCompare(&htim4,TIM_CHANNEL_1,duty_num4);
        }
        HAL_Delay(50);
        duty_num4 = 0;
    }
    __HAL_TIM_SetCompare(&htim4,TIM_CHANNEL_1,duty_num4);
    /* USER CODE BEGIN 3 */
}

四、硬件连接

根据查询数据手册可发现定时器3,4的一通道分别对应引脚PA6 PB6,然后题目要求还需要直接驱动PC13(最小开发板上已焊接的LED(固定接在 PC13 GPIO端口)),故而我们将对应PWM波作为输入,连接其对应引脚即可实现所需完成功能。
3V3 —> 3V3
GND —> GND
RXD —> A9
TXD —> A10
LED灯短脚 —> A6
LED灯长脚 —> 3V3
PB6 —> PC13
硬件连接图:

五、结果展示

可以看到两个灯有亮到灭,再由灭到亮

六、心得体会

通过实现呼吸灯,我对PWM的基本原理有了更深刻的理解。PWM通过调节占空比来改变电流的平均值,从而控制LED亮度的变化。在STM32中,我们使用定时器产生PWM信号,这让我意识到硬件定时器的精确性以及它们在实时控制中的重要性。
在STM32上实现PWM,最关键的部分是定时器的配置。通过配置定时器的计数周期和捕获/比较寄存器,我能够精确地控制LED的亮度变化。在学习过程中,我对STM32的定时器工作机制有了更深的认识,尤其是如何配置定时器的工作模式(比如向上计数、向下计数模式等),以及如何调整占空比来控制LED的亮度变化。
呼吸灯的核心是亮度的渐变效果,这要求PWM的占空比在一定时间内平滑地变化。在这个过程中,我学习了如何利用STM32的定时器中断或者延时函数来控制渐变的速度,使得效果更加自然、流畅。

参考博客

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