利用PWM实现呼吸灯
一、PWM理论知识
1、PWM概念
脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是一种利用脉冲宽度对模拟信号进行控制的技术,也就是对模拟信号电平进行数字表示的方法
2、占空比的概念
pwm的频率是指1秒钟内信号从高电平到低电平再回到高电平的次数(一个周期);占空比是一个脉冲周期内,高电平的时间(脉宽时间)与整个周期时间的比例。
3、PWM输出呼吸灯
PWM输出呼吸灯实质上就是通过对占空比的调节实现的。
频率很高时,看不到闪烁,占空比越大,LED越亮;
频率很低时,可看到闪烁,占空比越大,LED越亮。
二、工程创建
1、设计要求
使用TIM3和TIM4,分别输出一个PWM波形,PWM的占空比随时间变化,去驱动外接的一个LED以及最小开发板上已焊接的LED(固定接在 PC13 GPIO端口),实现2个 LED呼吸灯的效果。
2、使用STM32CubeMX配置
创建一个新项目
选择STM32F103C8T6芯片
配置RCC
配置SYS
配置定时器
设置TIM3预分频系数为72-1,自动重装值ARR为500-1,则PWM的输出频率为72000000/72/500=2000Hz。
设置TIM4预分频系数为72-1,自动重装值ARR为1000-1,则PWM的输出频率为72000000/72/800=1250Hz。
配置时钟
项目管理
生成项目
三、代码编写
设置占空比
/* USER CODE BEGIN Includes */
uint16_t duty_num3 = 10;
uint16_t duty_num4 = 10;
/* USER CODE END Includes */
开启PWM通道
/* USER CODE BEGIN 2 */
HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_1);
/* USER CODE END 2 */
循环代码
while (1)
{
HAL_Delay(50);
duty_num3 = duty_num3 + 10;
duty_num4 = duty_num4 + 10;
if(duty_num3 > 600)
{
duty_num3 = 0;
}
__HAL_TIM_SetCompare(&htim3,TIM_CHANNEL_1,duty_num3);
if(duty_num4 > 600)
{
duty_num4 = 0;
}
__HAL_TIM_SetCompare(&htim4,TIM_CHANNEL_1,duty_num4);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
四、结果演示
TIM3的通道1对应的引脚为PA6,TIM4的通道1对应的引脚为PB6。因此可以将LED灯的正极接到3.3v电源上,负极接到PB6上,即可观察到LED实现了呼吸灯的效果。由于设计要求中还要驱动最小开发板上已焊接的LED(固定接在 PC13 GPIO端口),所以将PA6与PC13连接起来。
呼吸灯
五、总结
通过本次实验,我深入理解了 TIM3 和 TIM4 定时器的配置流程,包括设置时钟源、预分频系数、自动重装载值等参数以得到合适的 PWM 频率,以及通过改变比较值来调整占空比实现呼吸灯的亮度渐变。掌握了在代码中如何灵活地控制两个定时器的启动、停止与参数更新,使两个 LED 能呈现出呼吸灯效果。
参考链接:
PWM原理 PWM频率与占空比详解
STM32输出PWM完成呼吸灯