前言
买了亚博科技的树莓派智能贴身管家,自带固件使用i2c通信控制风扇和RGB灯,上电不能自扇热,需要树莓派i2c控制。RGB官方也只提供三个颜色变化根本就不酷炫。所以决定自己重写固件。(RGB代码在最后)
一、风扇扇热
static void TIM2_Config(void)
{
/* Time base configuration */
TIM2_TimeBaseInit(TIM2_PRESCALER_1, 999);
/* PWM1 Mode configuration: Channel1 */
TIM2_OC1Init(TIM2_OCMODE_PWM1, TIM2_OUTPUTSTATE_ENABLE,CCR1_Val, TIM2_OCPOLARITY_HIGH);
TIM2_OC1PreloadConfig(ENABLE);
TIM2_ARRPreloadConfig(ENABLE);
/* TIM2 enable counter */
TIM2_Cmd(ENABLE);
}
没啥可说的使用PWM,需要找到对应引脚的对应PWM通道,使用CCR1_Val设置占空比控制转速。
二、WS2812
下面是从数据手册提取的重要信息
查资料时发现6引脚RGBLED资料比较多,四引脚WS2812较少。
上面是数据发送时序,以及三个级联LED电路和数据传输方法。第一个灯的数据输入接单片机引脚,第一个灯的数据输出引脚接下一个灯的数据输入端,以此类推。下面是代码实现:
1.定义数据引脚拉高拉低的宏
#define RGB_PIN_H() GPIO_WriteHigh(GPIOC, (GPIO_Pin_TypeDef) GPIO_PIN_4);
#define RGB_PIN_L() GPIO_WriteLow(GPIOC, (GPIO_Pin_TypeDef) GPIO_PIN_4);
2.mian函数中引脚初始化
GPIO_Init(GPIOC, (GPIO_Pin_TypeDef) GPIO_PIN_4, GPIO_MODE_OUT_PP_LOW_FAST);
RGB_PIN_L();
3.引脚发送数据
延时根据系统定义
发送 数据1:
RGB_PIN_H();
(延时 ) ; //系统采用16Mhz 需要10到25个_asm(“nop”)
RGB_PIN_L();
(延时 ) ; //系统采用16Mhz 需要4到6个_asm(“nop”)
发送 数据0:
RGB_PIN_H();
(延时 ) //系统采用16Mhz 需要4到6个_asm(“nop”)
RGB_PIN_L();
(延时 ) //系统采用16Mhz 需要10到25个_asm(“nop”)
4.判断24位每一位是1还是0
因为一般颜色RGB与发送数据的GRB顺序不同,八位数据顺序需要注意。
附 完整工程 及RGB颜色网站https://www.sioe.cn/yingyong/yanse-rgb-16/
main函数主要是颜色的移位
//FF0000到ffff00 红变黄
for(RGB_i = 0;RGB_i<0xff;RGB_i++){
color = color + 0x100;set_color_3(color);
DelyMs(20);
}
//ffff00到00ff00 黄变绿
for(RGB_i = 0;RGB_i<0xff;RGB_i++){
color = color - 0x10000;set_color_3(color);
DelyMs(20);
}
//00ff00 到00ffff 绿变青
for(RGB_i = 0;RGB_i<0xff;RGB_i++){
color++;set_color_3(color);
DelyMs(20);
}
//00ffff 到0000ff 青变蓝
for(RGB_i = 0;RGB_i<0xff;RGB_i++){
color = color - 0x100;set_color_3(color);
DelyMs(20);
}
//0000ff 到ff00ff 蓝变紫
for(RGB_i = 0;RGB_i<0xff;RGB_i++){
color = color + 0x10000;set_color_3(color);
DelyMs(20);
}
//ff00ff 到0000ff 紫变红
for(RGB_i = 0;RGB_i<0xff;RGB_i++){
color--;set_color_3(color);
DelyMs(20);
}
```
完整工程https://github.com/XiHuanMY/STM8S003-ws2812.git