|
coody_sz 发表于 2025-4-29 17:47 能发程序上来学习一下吗? |
| 我用STC的AI8051U驱动WS2812,用PWM或SPI都可以,DMA传输,不耗CPU时间,一次传输最多2700个灯。 |
| 要控制每一个脉冲的时间,这并不省事,如果本身程序有很多事情做,可以考虑再挂一块单片机专门做这个事 |
| 用SPI模拟,不要用PWM |
World-semi 发表于 2025-4-3 17:04 你好,我也想要资料,谢谢! |
World-semi 发表于 2025-4-3 17:04 我也想要资料,文档即可,谢谢 |
|
你好,我这边是WS2811的原厂家,有关时序控制的问题,可以联系我们,我们可以提供技术支持和源代码,教你控制WS2811 |
| 一个周期造一个bit,可以先送几个周期,确保数据是你想要的,再进行下一步,一般要配合dma |
Jasminedebug 发表于 2025-3-6 13:02 STC的PWMM频率是不能设置的!它只能是时钟的多少分之一的分频 就算是有能设置的型号,320nS就是0.32uS,那就是说,最坏的情况就是,每0.32uS的时间就进入中断一次,用来处理下一个字节 系统几乎没有时间去做其它的事了,没有人这么干的 |
lkc8210 发表于 2025-3-6 10:26 void WS_Set1(unsigned long dat) { unsigned char i; for(i = 0; i < 24; i++) { if(0x800000 == (dat & 0x800000) ) { WPWM_OUT_SET(42);//48MHz:1码,高电平920ns,低电平320ns } else { WPWM_OUT_SET(12);//48MHz:0码,高电平320ns,低电平920ns } dat <<= 1; } } 请问这样写切换0、1码和用PWM溢出中断切换0、1码有什么区别? 是因为这样写导致0、1码切换过慢是吗? |
lkc8210 发表于 2025-3-6 10:26 void WS_Set1(unsigned long dat) { unsigned char i; //EA = 1; for(i = 0; i < 24; i++) { if(0x800000 == (dat & 0x800000) ) WPWM_OUT_SET(42);//48MHz:1码,高电平920ns,低电平320ns else WPWM_OUT_SET(12);//48MHz:0码,高电平320ns,低电平920ns dat <<= 1; } } 我想了解一下我这样写有什么问题,是因为这样写PWM的0、1码切换过于慢,所以要用PWM溢出中断来切换0、1码是吗? |
|
用PWM驱动WS2811需要用PWM溢出中断 在中断内更新下一个PWM的占空比 |
| 这个芯片跟PWM是没什么关系的,亮度是由写入的数据决定的 |