STC8H单片机PWM模式驱动WS2812(一)

之前曾用STC8H1K17T的PWM成功驱动WS2812,当时使用的是P34即PWM8。PWMB配置如下 :
void PWMB_config(void)
{
P_SW2 |= 0x80;
PWMB_PSCR = 0;
PWMB_CCMR4 = 0x60;
PWMB_CCER2 = 0x30;
PWMB_ENO |= 0x40;
PWMB_PS |= (1<<6);
PWMB_ARR = 30;
PWMB_CCR4 = 8;
PWMB_BKR = 0x80;
PWMB_CR1 = 0x88;
}
向WS2812发送8位数据函数如下:
void WS2812_WriteByte(u8 dat)
{
u8 i;
for(i=0;i<8;i++)
{
if(dat & 0x80)
PWMB_CCR4 = 8;
else
PWMB_CCR4 = 22;
PWMB_CR1 |= 0x01;
dat = dat<<1;
while(PWMB_CR1 &0x01);
}
}
点亮WS2812就直接发送24位数据即可:
void WS2812_Rand_color(u8 R,u8 G,u8 B)
{
WS2812_WriteByte(R);
WS2812_WriteByte(G);
WS2812_WriteByte(B);
}

近期的一项制作中使用的芯片是STC8H8K64U,连接WS2812的IO也改为P10。结果改了PWM配置,但无论如何修改都无法正常驱动WS2812。
于是,拿出之前使用的STC8H1K17T板子,对其重新测试!下载程序后,WS2812没有点亮,这可是之前测试正常的,现在怎么不亮了?于是检查线路,结果发现,原板子WS2812接的是P35,于是将P34 P35连接起来,WS2812终于点亮!
现在,用逻辑仪分析在执行WS2812_Rand_color(1,1,1)时,P34输出的波形如下:

000
这个说来也怪,‌按ws2812的驱动要求,0 码要求高电平约 0.35-0.45 微秒,1 码要求高电平约 0.65-0.95 微秒‌,总周期约 1.25 微秒,现在总周期比起正常的要长得多,为何还能正常点亮ws2812?难道ws2812区别0码与1码只是看高电平的脉冲长短吗?
2026.7.14

image

欢迎关注本人公众号,了解更多。

posted @ 2026-07-14 13:44  lmn2005  阅读(25)  评论(0)    收藏  举报