?????本人新手,此讲解适合新手朋友,大神不喜勿喷。通过实际测试过的,请放心消化。
1:灯的计数配置如下:
?2:七色在模拟PWM程序中的配置,原理:在一个周期中? ? ? 灯亮的时长 /?周期时长? =? 占空比 ,此程序是通过占空比来调节各个灯的亮度,上表的配置参数为三种灯的比例参数,按照此参数配置为最亮。所以在配置橙的灯时,红色灯整个周期都亮,绿色灯只亮周期的一半时长。
七彩渐变是每一种灯由暗变亮,在由亮变暗,然后在切换到另一种灯光的最暗状态继续循环。
代码如下:
/******************************************************************
************************RGB灯使用**********************************
******************************************************************/
bool rgb_over = true; //翻转标志
bool is_qcding = false; //控制灯是否开启
uint8_t rgb_colour = 0; //八种灯色0-7分别对应:白,红,绿,蓝,橙,黄,青,紫
uint8_t duty_num_b = 10; //灯光亮度(0-255)
/************脚位说明*****************
LEDR_GPIO 红色灯控制脚位
LEDG_GPIO 绿色灯控制脚位
LEDB_GPIO 蓝色灯控制脚位
*************************************/
void _close_all_led(){ //关闭所有灯光
user_gpio_set_value(LEDR_GPIO, LEDRGB_CLOSE);
user_gpio_set_value(LEDG_GPIO, LEDRGB_CLOSE);
user_gpio_set_value(LEDB_GPIO, LEDRGB_CLOSE);
}
//此函数在定时器中断中使用,每隔100us进入一次
void _RGB_timer_shade(){ //七彩渐变函数
if(rgb_over){ //暗->亮
duty_num_b += 4;
if(duty_num_b > 251){
rgb_over = false;
duty_num_b = 255;
}
}else{ //亮->暗
duty_num_b -= 4;
if(duty_num_b < 10){
rgb_over = true;
duty_num_b = 10;
rgb_colour++;
if(rgb_colour > 7){
rgb_colour = 1;
}
}
}
}
//此函数可在定时器中断中使用,也可在循环函数中使用,每隔25us进入一次
void _RGB_timer_handle( ){ //单独开启某种灯色的灯光,灯色由rgb_colour控制
static uint8_t count = 0; //计数范围0-255,每隔25us此变量加1
uint8_t dutynum = 255; //临时亮度值
dutynum = duty_num_b; //亮度赋值
if(is_qcding){
if(rgb_colour < 8){ //rgb_colour灯色
//橙色灯和紫色灯由于单个灯的配置比例不同,所以单独配置
if(rgb_colour == 4){ //橙
if(count <= dutynum){
user_gpio_set_value(LEDR_GPIO,LEDRGB_OPEN); //红的灯配置亮
}else{
user_gpio_set_value(LEDR_GPIO,LEDRGB_CLOSE);//红的灯配置灭
}
if(count <= (dutynum/2)){ //绿的灯的亮度为红色灯的一半
user_gpio_set_value(LEDG_GPIO,LEDRGB_OPEN);
}else{
user_gpio_set_value(LEDG_GPIO,LEDRGB_CLOSE);
}
user_gpio_set_value(LEDB_GPIO,LEDRGB_CLOSE);
}else if(rgb_colour == 7){ //紫
if(count <= (dutynum/2)){ //红色灯的亮度为蓝色灯的一半
user_gpio_set_value(LEDR_GPIO,LEDRGB_OPEN);
}else{
user_gpio_set_value(LEDR_GPIO,LEDRGB_CLOSE);
}
if(count <= dutynum){
user_gpio_set_value(LEDB_GPIO,LEDRGB_OPEN);
}else{
user_gpio_set_value(LEDB_GPIO,LEDRGB_CLOSE);
}
user_gpio_set_value(LEDG_GPIO,LEDRGB_CLOSE);
}else{
if(count <= dutynum){
switch(rgb_colour) {
case 0:{ //白
user_gpio_set_value(LEDR_GPIO,LEDRGB_OPEN);
user_gpio_set_value(LEDG_GPIO,LEDRGB_OPEN);
user_gpio_set_value(LEDB_GPIO,LEDRGB_OPEN);
break;
}
case 1:{ //红
user_gpio_set_value(LEDR_GPIO,LEDRGB_OPEN);
user_gpio_set_value(LEDG_GPIO,LEDRGB_CLOSE);
user_gpio_set_value(LEDB_GPIO,LEDRGB_CLOSE);
break;
}
case 2:{ //绿
user_gpio_set_value(LEDG_GPIO,LEDRGB_OPEN);
user_gpio_set_value(LEDR_GPIO,LEDRGB_CLOSE);
user_gpio_set_value(LEDB_GPIO,LEDRGB_CLOSE);
break;
}
case 3:{ //蓝
user_gpio_set_value(LEDB_GPIO,LEDRGB_OPEN);
user_gpio_set_value(LEDR_GPIO,LEDRGB_CLOSE);
user_gpio_set_value(LEDG_GPIO,LEDRGB_CLOSE);
break;
}
case 5:{ //黄
user_gpio_set_value(LEDR_GPIO,LEDRGB_OPEN);
user_gpio_set_value(LEDG_GPIO,LEDRGB_OPEN);
user_gpio_set_value(LEDB_GPIO,LEDRGB_CLOSE);
break;
}
case 6:{ //青
user_gpio_set_value(LEDG_GPIO,LEDRGB_OPEN);
user_gpio_set_value(LEDB_GPIO,LEDRGB_OPEN);
user_gpio_set_value(LEDR_GPIO,LEDRGB_CLOSE);
break;
}
}
}else{
_close_all_led(); //关闭所有灯光
}
}
count++;
if(count >= 255){ //一个周期结束,配置为0进行下一个周期
count = 0;
}
}else{
count = 0;
rgb_colour = 0;
}
}else{
_close_all_led(); //关闭所有灯光
}
}
?????????????????????????????????????????????????????????????????????????????????看完有帮助的话记得点个赞哈,制作不易啊
|