在淘宝卖的ws2812b rgb灯虽然都是同一名称,但是各家的数据格式都有有微小的不同,参考各家数据手册会发现高低电平的时间有许多不同。
如在淘宝“南方光电”买的ws2812b数据手册如下:
再如“糊糊蝶照明”RGB灯条的数据手册:
网上还有其他版本的数据手册,时间也不一样,有兴趣可以搜一搜。
以上时间差距会让颜色不准,在使用的时候要注意。
除了手册差异(数据差异)导致的问题,还有不同写法io反转速度差异引起的时间不准。
如:
1.用库函数
GPIO_SetBits(GPIOB,GPIO_Pin_5);
GPIO_ResetBits(GPIOB,GPIO_Pin_5);
这样写的反转频率大约为2.7MHz,周期361ns
2.用寄存器GPIOx_ODR
GPIOB->ODR |= GPIO_Pin_5;
GPIOB->ODR &=~ GPIO_Pin_5;
这样写的反转频率小于18MHz,周期大于55.55ns
3、用寄存器 GPIOB->BRR和GPIOB->BSRR
GPIOB->BRR = GPIO_Pin_5;
GPIOB->BSRR = GPIO_Pin_5;
这样写的反转频率大约为18MHz,周期55.55ns
由于我们需要0.3us的延时,所以直接排除库函数,而用寄存器BRR和BSRR应该是最好的选择。
在stm32f103 72MHz主频下,一个__nop();为1/72M=13.9ns。
所以,对于RGB灯条,
T0H=T1L=55.5ns+1813.9ns;
T0L=T1H=55.5ns+6113.9ns;