STM32使用PWM制作呼吸灯
STM32使用PWM制作呼吸灯
STM32使用PWM制作呼吸灯
一、定时器理论知识
PWM介绍
定义
PWM(Pulse Width Modulation,脉宽调制)是一种通过控制脉冲的宽度来调节功率输送的技术。简单来说,PWM是通过改变信号的“开”时间(高电平时间)和“关”时间(低电平时间)来实现对输出功率的控制。常用于控制电机转速、调节亮度、音频信号合成等场景。基本原理
PWM通过固定的时间周期内改变信号的“高电平”与“低电平”的比例(即占空比)来控制功率的传递。通过改变占空比,可以控制电流的平均值,从而实现对电动机、LED亮度等设备的调节。PWM的频率保持不变,而占空比则在0到100%之间变化:
- 占空比(Duty Cycle):即高电平占总周期的时间比例。例如,占空比为50%的PWM波表示高电平持续50%的时间,低电平持续50%的时间。
- 频率(Frequency):PWM波的周期时间,也就是信号变化的频率。
- 优点及应用范围
优点:
高效能:PWM能有效控制功率传输,并且电源开关工作时几乎没有能量损耗。
精确控制:可以精确地控制功率输出,通过调节占空比来实现精确调节。
热量低:相比传统的线性调节方式,PWM的开关特性能够大大减少因电流流过元件而产生的热量。
应用范围:
电机控制:控制电机转速。
亮度调节:在LED灯光调节中广泛应用。
音频合成:生成模拟音频信号。
电源调节:例如在电源转换中,使用PWM控制输出电压。
马达驱动:如机器人、风扇等设备的调速。
- 主要参数
- 频率(Frequency):PWM信号的周期性变化速率,单位为Hz。频率高则调节更细腻,低则响应较慢。
- 占空比(Duty Cycle):高电平时间与总周期时间的比例,通常以百分比表示。
- 周期(Period):一个PWM信号从开始到结束的时间总长度,等于1/频率。
- 电压幅度(Amplitude):高电平时的电压值,一般由驱动电路提供。
- PWM的产生
PWM信号的产生一般有两种方式:
- 硬件PWM:由微控制器内部的定时器和计数器自动生成。STM32等微控制器通过配置定时器来输出PWM信号。硬件PWM稳定可靠,效率高,适用于大多数应用。
- 软件PWM:通过软件控制GPIO引脚的高低电平输出,虽然实现简单,但通常需要较高的计算资源,效率较低,不适合高精度控制。
- PWM工作原理
PWM的工作原理基于一个固定频率的时钟,通过调节高电平的持续时间(占空比)来实现对功率的调控。信号的周期由时钟产生器设定,信号的高电平和低电平通过占空比控制,常见的PWM波形是矩形波。
- 占空比:例如占空比50%意味着PWM波在一个周期内,高电平和低电平的时间相等。若占空比为25%,则高电平持续四分之一的周期,低电平占据剩余的部分。
- PWM输出的模式区别
PWM输出有多种工作模式,主要包括:
- 正常模式(Up Mode):定时器计数从0计数到自动重载值(ARR),然后重载并继续。
- 向下计数模式(Down Mode):定时器从ARR计数到0,再反向计数。
- 中心对称模式(Center-aligned Mode):定时器计数到ARR值后会反向计数,这样PWM波形会相对于中心对称,常用于减小噪音和振动。
- 边沿对齐模式(Edge-aligned Mode):PWM波的上升沿或下降沿与计数器的某些边缘对齐。
- PWM的计数模式
PWM的计数模式主要有两种:
- 向上计数(Up-counting):计数器从0开始递增到设定的ARR(Auto-Reload Register)值,当计数器达到ARR值时,它会重新从0开始。
- 向下计数(Down-counting):计数器从ARR开始递减到0,当计数器为0时,会重新从ARR开始。
- 向上/向下计数(Up/Down-counting):这种模式结合了上升和下降计数,计数器在ARR值和0值之间交替进行计数。此模式下,PWM波形具有更对称的特性。
- PWM相关配置寄存器
在STM32微控制器等基于定时器的PWM生成过程中,涉及到多个寄存器的配置,以下是常见的几个配置寄存器:
捕获/比较模式寄存器(TIMx_CCMR1)
该寄存器用于配置定时器的捕获/比较模式,决定定时器输出的波形类型、PWM的占空比、计数模式等。主要控制PWM信号的输出模式,比如PWM的极性、输出的比较输出模式等。捕获/比较使能寄存器(TIMx_CCER)
该寄存器用于使能定时器的通道输出。通过设置该寄存器,定时器的捕获/比较输出可以发送到外部引脚。控制PWM输出信号的开关、极性等。确保PWM信号能够正确地输出到GPIO引脚。捕获/比较寄存器(TIMx_CCRx)
该寄存器用于存储捕获/比较的值,控制PWM信号的高电平持续时间(即占空比)。通过写入CCR寄存器,可以设置PWM信号的占空比,从而实现对输出信号的调节。
总结
PWM是通过改变脉冲的宽度来控制功率的一种技术,具有高效、精确、低热量的优点,广泛应用于电机调速、LED亮度控制等领域。通过定时器配置寄存器,用户可以灵活控制PWM的输出模式、占空比和频率,从而实现对电气设备的精确调控。
二、工程建立
创建新项目
RCC配置
SYS配置
配置定时器
这里我们选择定时器3和定时器4来实现定时的功位置3,分频系数为71,向上计数模式,计数周期为500,使能自动重载模式。通道1选择:PWM Generation CH1(PWM输出通道1)
设置分频系数为71,计数周期为500,其它默认。
定时器四我们也选择PWM Generation CH1(PWM输出通道1),计数周期根据自己需要进行设置,这里我设置的跟定时器三一样配置时钟树
配置项目设置
设置项目名称、路径(不能有中文)、编译器及版本
三、代码完善
- 设置占空比
在main.c中,添加变量,用以存储占空比,且初始值设置为10.
uint16_t duty_num3 = 10;
uint16_t duty_num4 = 10;
- 开启PWM信道
开始TIM3的通道3,输出PWM。
开始TIM4的通道4,输出PWM。
在main函数中添加:
HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_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的定时器中断或者延时函数来控制渐变的速度,使得效果更加自然、流畅。