玩轉單片機之智能車小露——七彩LED呼吸燈
如果LED閃爍(玩轉單片機之智能車小露——LED閃爍實戰)不能滿足你,那么七彩LED呼吸燈絕對可以給你帶來足夠的樂趣。
七彩LED呼吸燈一般都需要PWM進行調光,所以編程有無限的靈活性。本文七彩呼吸燈可以實現彩虹單色顯示、RGB任意顏色顯示、單色亮度呼吸、七彩顏色轉換呼吸:
//呼吸燈模式:關閉呼吸、單色呼吸、七彩轉換呼吸
#define BLED_MODE_OFF 0X00
#define BLED_MODE_SINGLE 0X01
#define BLED_MODE_COLOR 0X02
//顏色:關閉及RGB組合彩虹顏色
#define BLED_COLOR_OFF 0X00
#define BLED_COLOR_RED 0X01
#define BLED_COLOR_ORANGE 0X02
#define BLED_COLOR_YELLOW 0X03
#define BLED_COLOR_GREEN 0X04
#define BLED_COLOR_CYAN 0X05
#define BLED_COLOR_BLUE 0X06
#define BLED_COLOR_PURPLE 0X07
#define BLED_COLOR_WHITE 0X08
//亮度:0x0100~0x1000;
#define BLED_BRIGHT 0x0fff
void BLEDTurnOn(unsigned char color);
void BLEDDisplayColor(unsigned char red,unsigned char green,unsigned char blue);
void BLEDBreath(unsigned char mode,unsigned char color);
void BLEDTurnOff(void);
STC32G單片機PWM初始化
控制七彩LED前先要初始化PWM(GPIO設置、PWM設置、端口切換):
void BLEDInit(void){
GPIO_InitTypeDef gpio;
PWMx_InitDefine pwm;
gpio.Mode = GPIO_OUT_PP;
gpio.Pin = GPIO_Pin_LOW;
GPIO_Inilize(GPIO_P2,&gpio);
pwm.PWM_Mode = CCMRn_PWM_MODE1;
pwm.PWM_Duty = 0x0000;
pwm.PWM_EnoSelect = ENO5P;
PWM_Configuration(PWM5, &pwm);
pwm.PWM_EnoSelect = ENO6P;
PWM_Configuration(PWM6, &pwm);
pwm.PWM_EnoSelect = ENO7P;
PWM_Configuration(PWM7, &pwm);
pwm.PWM_Period = 0x1000;
pwm.PWM_DeadTime = 0;
pwm.PWM_MainOutEnable= ENABLE;
pwm.PWM_CEN_Enable = ENABLE;
PWM_Configuration(PWMB, &pwm);
PWM5_SW(PWM5_SW_P20);
PWM6_SW(PWM6_SW_P21);
PWM7_SW(PWM7_SW_P22);
NVIC_PWM_Init(PWMB,DISABLE,Priority_0);
}
彩虹單色顯示
為簡化代碼,彩虹顏色的顯示使用二維數組記錄RGB占空比,通過color參數直接定位到ColorRaw數組中對應顏色的占空比。
unsigned char BLEDBreathMode;
unsigned char BLEDColor;
unsigned int BLEDScanCycle;
unsigned int code ColorRaw[9][3] = {
{0x0000,0x0000,0x0000}, //OFF
{BLED_BRIGHT,0x0000,0x0000}, //RED
{BLED_BRIGHT,BLED_BRIGHT >> 2,0x0000}, //ORANGE
{BLED_BRIGHT,BLED_BRIGHT,0x0000}, //YELLOW
{0x0000,BLED_BRIGHT,0x0000}, //GREEN
{0x0000,BLED_BRIGHT,BLED_BRIGHT}, //CYAN
{0x0000,0x0000,BLED_BRIGHT}, //BLUE
{BLED_BRIGHT,0x0000,BLED_BRIGHT}, //PURPLE
{BLED_BRIGHT,BLED_BRIGHT,BLED_BRIGHT}}; //WHITE
void BLEDTurnOn(unsigned char color){
unsigned int *pDuty;
BLEDColor = color;
BLEDBreathMode = BLED_MODE_OFF;
pDuty = ColorRaw[color];
PWMB_Duty5(pDuty[0]);
PWMB_Duty6(pDuty[1]);
PWMB_Duty7(pDuty[2]);
}
RGB任意顏色顯示
RGB任意顏色顯示也很簡單,將RGB顏色三個分量參數(0x00~0xFF)縮放到占空比量程后直接輸出:
void BLEDDisplayColor(unsigned char red,unsigned char green,unsigned char blue){
BLEDBreathMode = BLED_MODE_OFF;
PWMB_Duty5((unsigned int)red << 4);
PWMB_Duty6((unsigned int)green << 4);
PWMB_Duty7((unsigned int)blue << 4);
}
單色亮度呼吸和七彩顏色轉換呼吸
呼吸思路仍然是在定時中斷中按呼吸相應的呼吸規律更新RGB三種顏色的PWM占空比。
單色亮度呼吸熄滅效果不佳所以呼吸周期內只降低到最低亮度(0x0100)不會全熄。
七彩顏色轉換呼吸按紅->黃->綠->青->藍->紫->紅...依次循環轉換。
void BLEDBreath(uint8 mode,uint8 color){
BLEDColor = color;
BLEDBreathMode = mode;
BLEDScanCycle = 0;
}
//Systick callback(20ms)
void SystickCallbackBLED(void){
unsigned int *pDuty;
if(BLEDBreathMode == BLED_MODE_SINGLE){ //單色亮度呼吸
pDuty = ColorRaw[BLEDColor];
if(++BLEDScanCycle > 128)
BLEDScanCycle = 0;
if(BLEDScanCycle < 64){
PWMB_Duty5(pDuty[0] - min(pDuty[0],(((BLED_BRIGHT - 0x0100) >> 6) * BLEDScanCycle)));
PWMB_Duty6(pDuty[1] - min(pDuty[1],(((BLED_BRIGHT - 0x0100) >> 6) * BLEDScanCycle)));
PWMB_Duty7(pDuty[2] - min(pDuty[2],(((BLED_BRIGHT - 0x0100) >> 6) * BLEDScanCycle)));
}
else{
PWMB_Duty5(pDuty[0] - min(pDuty[0],(((BLED_BRIGHT - 0x0100) >> 6) * (128 - BLEDScanCycle))));
PWMB_Duty6(pDuty[1] - min(pDuty[1],(((BLED_BRIGHT - 0x0100) >> 6) * (128 - BLEDScanCycle))));
PWMB_Duty7(pDuty[2] - min(pDuty[2],(((BLED_BRIGHT - 0x0100) >> 6) * (128 - BLEDScanCycle))));
}
}
else if(BLEDBreathMode == BLED_MODE_COLOR){ //七彩顏色轉換呼吸
if(++BLEDScanCycle > 448)
BLEDScanCycle = 0;
if(BLEDScanCycle < 64){
PWMB_Duty5(BLED_BRIGHT);
PWMB_Duty6((BLED_BRIGHT >> 6) * BLEDScanCycle);
PWMB_Duty7(0x0000);
}
else if(BLEDScanCycle < 128){
PWMB_Duty5(BLED_BRIGHT - (BLED_BRIGHT >> 6) * (BLEDScanCycle-64));
PWMB_Duty6(BLED_BRIGHT);
PWMB_Duty7(0x0000);
}
else if(BLEDScanCycle < 192){
PWMB_Duty5(0x0000);
PWMB_Duty6(BLED_BRIGHT);
PWMB_Duty7((BLED_BRIGHT >> 6) * (BLEDScanCycle-128));
}
else if(BLEDScanCycle < 256){
PWMB_Duty5(0x0000);
PWMB_Duty6(BLED_BRIGHT - (BLED_BRIGHT >> 6) * (BLEDScanCycle-192));
PWMB_Duty7(BLED_BRIGHT);
}
else if(BLEDScanCycle < 320){
PWMB_Duty5((BLED_BRIGHT >> 6) * (BLEDScanCycle-256));
PWMB_Duty6(0x0000);
PWMB_Duty7(BLED_BRIGHT);
}
else if(BLEDScanCycle < 384){
PWMB_Duty5(BLED_BRIGHT);
PWMB_Duty6(0x0000);
PWMB_Duty7(BLED_BRIGHT - (BLED_BRIGHT >> 6) * (BLEDScanCycle-320));
}
}
else
BLEDScanCycle = 0;
}
- 本文采用的單片機為STC32G系列,感興趣的朋友可以參考測試,或去Gitee上下載例程。
- 下載地址:https://gitee.com/loganxiang/lgxsmartcar ,參考breathled.h/breathled.c。

浙公網安備 33010602011771號