全彩LED灯的实现
文章目录
前言
利用PWM控制实现全彩LED灯
一、相关知识
1.全彩 LED 灯简介
全彩 LED 灯,实质上是一种把红、绿、蓝单色发光体集成到小面积区域中的 LED 灯,控制时对这三种颜色的灯管输出不同的光照强度,即可混合得到不同的颜色,其混色原理与光的三原色混合原理一致。
本工程配套开发板中的 RGB 灯就是一种全彩 LED 灯,实现LED 基本控制时候,只能控制 RGB 三色灯的亮灭,即 RGB 每盏灯有[0:1]两种等级,因此只能组合出 8种颜色。要使用 STM32 控制 LED 灯输出多种亮度等级,可以通过控制输出脉冲的占空比来实现
图中列出了周期相同而占空比分别为 100%、80%、50%和 20%的脉冲波形,假如利用这样的脉冲控制 LED 灯,即可控制 LED 灯亮灭时间长度的比例。若提高脉冲的频率,LED 灯将会高频率进行开关切换,由于视觉暂留效应,人眼看不到 LED 灯的开关导致的闪烁现象,而是感觉到使用不同占空比的脉冲控制 LED 灯时的亮度差别。即单个控制周期内,LED 灯亮的平均时间越长,亮度就越高,反之越暗。
把脉冲信号占空比分成 256 个等级,即可用于控制 LED 灯输出 256 种亮度,使用三种这样的信号控制 RGB 灯即可得到 256256256 种颜色混合的效果。而要控制占空比直接使用 STM32定时器的 PWM 功能即可。
2.硬件简介
LED 硬件原理图
RGB 灯使用阴极分别连接到了 PB5、PB0 及 PB1,它们分别是定时器
TIM3 的通道 2、3、4,其中 PB5用于定时器输出通道时,需要使用重定义功能。
二、代码实现
1.编程要点
- 初始化 RGB灯使用的 GPIO;
- 配置定时器输出 PWM 脉冲;
- 编写修改 PWM脉冲占空比大小的函数;
- 测试配置的定时器脉冲控制周期是否会导致 LED 灯明显闪烁;
2.LED灯硬件相关宏定义
color_led.h文件:
/********定时器通道*******/
#define COLOR_TIMx TIM3
#define COLOR_TIM_APBxClock_FUN RCC_APB1PeriphClockCmd
#define COLOR_TIM_CLK RCC_APB1Periph_TIM3
#define COLOR_TIM_GPIO_CLK (RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO)
//红灯的引脚需要重映射
#define COLOR_GPIO_REMAP_FUN() GPIO_PinRemapConfig(GPI0_PartialRemap_TIM3,ENABLE);
/********红灯*********/
#define COLOR_RED_TIM_LED_PORT GPIOB
#define COLOR_RED_TIM_LED_PIN GPIO_Pin_5
#define COLOR_RED_TIM_OCxInit TIM_0C2Init //初始化通道函数
#define COLOR_RED_TIM_OCxPreloadconfig TIM_OC2Preloadconfig//通道重载配置函数
//通道比较寄存器,以TIMx->CCRx方式可访问该寄存器,设置新的比较值,控制占空比
//以宏封装后,使用这种形式: COLOR_TIMx->COLOR_RED_CCRx ,可访问该通道的比较寄存器
#define COLOR_RED_CCRx CCR2
/************绿灯***********/
#define COLOR_GREEN_TIM_LED_PORT GPIOB
#define COLOR_GREEN_TIM_LED_PIN G