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输出到相关代码如下:
正常修改有效电平就可以
当设置低电平有效时:
当设置高电平有效时:
只是反向输出了哦, 这个并不是我们想要的效果哦。
我们需要停止时(单脉冲结束后)低电平; CNT<CCR时高电平;CNT>=CCR时低电平。
辛苦帮忙看看, 是否还有其它办法? 感谢{:baoquan:}
我们也尝试过反向输出, 和PWM模式2类似。 等效于每一个数据位输出是 先输出低电平波形、再输出高电平波形。而这和WS2812要求的时序不相吻合。
反向+延时输出 可以解决,约170us可以发送完毕5个灯珠的波形。
发送期间关闭了中断,因此会导致115200bps波特率的串口丢字节的可能性(假设串口硬件无超过2个字节的FIFO的话)。
可参考这个帖子的设置,8H1K28没有DMA,将其中的DMA功能去掉
PWM-DMA 驱动 WS2812彩灯@Ai8051U,最多1365个灯同时, 32K SRAM
https://www.stcaimcu.com/thread-10850-1-1.html
(出处: 国芯人工智能技术交流网站)
请问AI8H1K28的 PWMA 是否可以实现 停止时(单脉冲结束后)低电平; CNT<CCR时高电平;CNT>=CCR时低电平。 PWMB5_2, 采用反向输出+延时,输出5个灯珠的波形,并确保0码和1码的周期满足1.2us以上,则整体发送时间为215us.如果同时串口接收数据的话, 可能会丢失2个字节。 5楼帖子里面例子的处理方法是:
鉴于PWM的特点,在发数据前先发一个占空比为0的周期,最后也发一个占空比为0的周期(发送完后连续输出低电平)。 需求已解决。
采用PWM4P 输出, 波形发送耗时为145us, 1.2*5*24=144us, 基本无浪费多余时间。
驱动WS2812要点:采用预加载,PWM模式1,循环输出,设置死区时间,本次发送前先发送1次占空比为0的波形,最后再发送1次占空比为0的波形。
感谢陈工的指点{:baoquan:},希望可以帮助后来人{:4_189:}
页:
[1]