Jason 发表于 3 天前

AI8H1K28 用PWMB 驱动WS2812, 单脉冲停止后是否可以自动输出低电平或空闲电平

1. 采用MCU为AI8H1K28-TSSOP20.
2. 因改款原因, 只能使用P1.7、P5.4、P3.3三个引脚里的一个引脚驱动WS2812炫彩灯带,目前采用P1.7引脚, PWM5_2

3. 因WS2812时序要求,0码高电平需要大于0.3us, 1码高电平需要大于0.9us。
4. 目前采用PWM模式1,单脉冲模式。
5. 现在所遇问题:PWM单次启动停止后,引脚输出为高电平,因装载下1bit数据需要时间,导致再次启动PWM输出时,高电平时长增加。
6. 逻辑分析仪抓取的波形如下:
7. PWMB初始化代码如下:

8. 验证PWM输出到相关代码如下:

乘风飞扬 发表于 3 天前

正常修改有效电平就可以


当设置低电平有效时:


当设置高电平有效时:

Jason 发表于 3 天前

只是反向输出了哦, 这个并不是我们想要的效果哦。
我们需要停止时(单脉冲结束后)低电平; CNT<CCR时高电平;CNT>=CCR时低电平。

辛苦帮忙看看, 是否还有其它办法? 感谢{:baoquan:}

Jason 发表于 3 天前

我们也尝试过反向输出, 和PWM模式2类似。 等效于每一个数据位输出是 先输出低电平波形、再输出高电平波形。而这和WS2812要求的时序不相吻合。

反向+延时输出 可以解决,约170us可以发送完毕5个灯珠的波形。
发送期间关闭了中断,因此会导致115200bps波特率的串口丢字节的可能性(假设串口硬件无超过2个字节的FIFO的话)。

乘风飞扬 发表于 3 天前

可参考这个帖子的设置,8H1K28没有DMA,将其中的DMA功能去掉

PWM-DMA 驱动 WS2812彩灯@Ai8051U,最多1365个灯同时, 32K SRAM
https://www.stcaimcu.com/thread-10850-1-1.html
(出处: 国芯人工智能技术交流网站)

Jason 发表于 3 天前

请问AI8H1K28的 PWMA 是否可以实现 停止时(单脉冲结束后)低电平; CNT<CCR时高电平;CNT>=CCR时低电平。

Jason 发表于 3 天前

PWMB5_2, 采用反向输出+延时,输出5个灯珠的波形,并确保0码和1码的周期满足1.2us以上,则整体发送时间为215us.如果同时串口接收数据的话, 可能会丢失2个字节。

乘风飞扬 发表于 前天 10:58

5楼帖子里面例子的处理方法是:
鉴于PWM的特点,在发数据前先发一个占空比为0的周期,最后也发一个占空比为0的周期(发送完后连续输出低电平)。

Jason 发表于 前天 11:48

需求已解决。
采用PWM4P 输出, 波形发送耗时为145us,   1.2*5*24=144us, 基本无浪费多余时间。
驱动WS2812要点:采用预加载,PWM模式1,循环输出,设置死区时间,本次发送前先发送1次占空比为0的波形,最后再发送1次占空比为0的波形。
感谢陈工的指点{:baoquan:},希望可以帮助后来人{:4_189:}
页: [1]
查看完整版本: AI8H1K28 用PWMB 驱动WS2812, 单脉冲停止后是否可以自动输出低电平或空闲电平