STM32使用PWM制作呼吸灯
STM32使用PWM制作呼吸灯
文章目录
一、定时器理论知识
PWM介绍
1. 定义
PWM(Pulse Width Modulation,脉宽调制)是一种通过控制脉冲的宽度来调节功率输送的技术。简单来说,PWM是通过改变信号的“开”时间(高电平时间)和“关”时间(低电平时间)来实现对输出功率的控制。常用于控制电机转速、调节亮度、音频信号合成等场景。
2. 基本原理
PWM通过固定的时间周期内改变信号的“高电平”与“低电平”的比例(即占空比)来控制功率的传递。通过改变占空比,可以控制电流的平均值,从而实现对电动机、LED亮度等设备的调节。PWM的频率保持不变,而占空比则在0到100%之间变化:
3. 优点及应用范围
优点:
应用范围:
4. 主要参数
5. PWM的产生
PWM信号的产生一般有两种方式:
6. PWM工作原理
PWM的工作原理基于一个固定频率的时钟,通过调节高电平的持续时间(占空比)来实现对功率的调控。信号的周期由时钟产生器设定,信号的高电平和低电平通过占空比控制,常见的PWM波形是矩形波。
7. PWM输出的模式区别
PWM输出有多种工作模式,主要包括:
8. PWM的计数模式
PWM的计数模式主要有两种:
9. 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;
(2)开启PWM信道
开始TIM3的通道3,输出PWM。
开始TIM4的通道4,输出PWM。
在main函数中添加:
HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_1);
(3)具体应用
这里我们设置为每隔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的定时器中断或者延时函数来控制渐变的速度,使得效果更加自然、流畅。
六、仓库地址
https://gitee.com/shxingyu/s-t-m
七、参考博客
http://www.mcublog.cn/stm32/2021_01/stm32cubemx-pwm-huxideng/
https://blog.csdn.net/weixin_64559251/article/details/127581276
作者:bibido_