在淘寶賣的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;