STM32F103VET6开发板实现呼吸灯
文章目录
前言
在本章中,演示如何使用计算法得到的呼吸曲线 PWM 波和 SPWM 波,并使用 STM32定时器 TIM的 PWM功能输出波形控制 LED 灯,实现三色LED的呼吸效果。
一、相关知识介绍
1.呼吸灯简介
呼吸灯,就是指灯光设备的亮度随着时间由暗到亮逐渐增强,再由亮到暗逐渐衰减,
很有节奏感地一起一伏,就像是在呼吸一样,因而被广泛应用于手机、电脑等电子设备的指示灯中
要控制 LED 灯达到呼吸灯的效果,实际上就是要控制 LED 灯的亮度拟合呼吸特性曲线。前面控制全彩 LED 灯时,通过控制脉冲的占空比来调整各个通道 LED 灯的亮度,从而达到混色的效果。若控制脉冲的占空比在 3 秒的时间周期内按呼吸特性曲线变化,那么就可以实现呼吸灯的效果了。
这种使用脉冲占空比拟合不同波形的方式称为 PWM(脉冲宽度调制)控制技术—— 通过对一系列脉冲的宽度进行调制,来等效地获得所需要波形(含形状和幅值)。
PWM 控制的基本原理为:冲量相等而开头不同的窄脉冲加在具有惯性的环节上时,其效果基本相同。其中冲量指窄脉冲的面积;效果相同指环节输出响应波形基本相同。
SPWM 波形——脉冲宽度按正弦规律变化而和正弦波等效的PWM 波形。SPWM 是一种非常典型的 PWM 波形,它在数字电路控制中应用非常广泛,如果使用低通滤波器,可以由 SPWM 波得到其等效的连续正弦半波。
若把拟合的波形改成呼吸特性曲线,即可得到控制呼吸灯使用的 PWM 波形,要生成拟合的 PWM 波形,通常使用计算法和调制法:
(1) 计算法:根据拟合波形的频率、幅值和半周期脉冲数,准确计算 PWM 波各脉冲宽度和间隔,据此控制开关器件的通断,就可得到所需 PWM 波形;
(2) 调制法:拟合波形作调制信号,进行调制得到期望的 PWM 波;该方法一般采用等腰三角波为载波,其任一点水平宽度和高度成线性关系且左右对称。载波(等腰三角波)与平缓变化的调制信号波(即要拟合的波形)相交,在载波与信号波的交点控制器件通断,就得宽度正比于信号波幅值的脉冲,符合 PWM 的要求 。相对于计算法,其处理过程计算简单。
2. 硬件简介
- TIM—单色呼吸灯 使用呼吸曲线 PWM 波控制 LED 灯,可实现红、绿、蓝三种
颜色的单色呼吸灯。
RGB 灯,里面由红蓝绿三个小灯构成, 使用 PWM控制时可以混合成 256 不同的颜色
本开发板中设计的 RGB 灯控制引脚是经过仔细选择的,因为使用STM32 的定时器控制输出 PWM脉冲,然而并不是任意 GPIO都具有 STM32 定时器的输出通道功能,所以 在设计硬件时,需要根据《STM32 中文数据手册》中的说明,选择具有定时器输出通道功能的引脚来控制 RGB 灯,如图
本实训中的 RGB 灯使用阴极分别连接到了 PB5、PB0 及 PB1,它们分别是定时器
TIM3 的通道 2、3、4,其中 PB5用于定时器输出通道时,需要使用重定义功能。
二、实现呼吸灯
1.单色呼吸灯
要点
- 初始化 PWM 输出通道,初始化 PWM 工作模式;
- 计算获取 PWM数据表;
- 编写中断服务函数,在中断服务函数根据 PWM 数据表切换比较寄存器的值;
LED灯硬件相关宏定义
breathing.h
#define RED_LIGHT
#define GREEN_LIGHT
#define BLUE_LIGHT
/*要使用什么颜色的呼吸灯,可选RED_LIGHT、GREEN_LIGHT、BLOE_LIGHT*/
#define LIGHT_COLOR_RED_LIGHT
/********定时器通道*******/
#if LIGHT_COLOR == RED_LIGHT
/************红灯***********/
#define BRE_TIMx TIM3
#define BRE_TIM_APBxClock_FUN RCC_APB1PeriphClockCmd
#define BRE_TIM_CLK RCC_APB1Periph_TIM3
#define BRE_TIM_GPIO_APBxClock_FUN RCC_APB2PeriphClockCmd
#define BRE_TIM_GPIO_CLK (RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO)
//红灯的引脚需要重映射
#define BRE_GPIO_REMAP_FUN() GPIO_PinRemapConfig(GPI0_PartialRemap_TIM3,ENABLE);
#define BRE_TIM_LED_PORT GPIOB
#define BRE_TIM_LED_PIN GPIO_Pin_5
#define BRE_TIM_OCxInit TIM_0C2Init //通道选择,1~4
#define BRE_TIM_OCxPreloadconfig TIM_OC2Preloadconfig
#define BRE_CCRx CCR2
#define BRE_TIMx_IRQn TIM3_IRQn //中断
#define BRE_TIMx_IROHandler TIM3_IRQHandler