CH582/CH592 PWM方式驱动ws2812RGB灯方法

直接上代码

#define PIXEL_NUM       156
#define NUM             (24*PIXEL_NUM + 300)        // Reset 280us / 1.25us = 224
#define WS1             37
#define WS0             18
__attribute__((aligned(4))) uint32_t PwmBuf[NUM];
uint32_t WS281x_Color(uint8_t red, uint8_t green, uint8_t blue) { return red << 16 | green << 8 | blue; }
uint32_t Wheel(uint8_t WheelPos)
{
    WheelPos = 255 - WheelPos;
    if (WheelPos < 85)
    {
        return WS281x_Color(255 - WheelPos * 3, 0, WheelPos * 3);
    }
    if (WheelPos < 170)
    {
        WheelPos -= 85;
        return WS281x_Color(0, WheelPos * 3, 255 - WheelPos * 3);
    }
    WheelPos -= 170;
    return WS281x_Color(WheelPos * 3, 255 - WheelPos * 3, 0);
}
void WS281x_SetPixelColor(uint16_t n, uint32_t GRBColor)
{
    uint8_t i;
    if (n < PIXEL_NUM)
    {
        for (i = 0; i < 24; ++i)
            PwmBuf[24 * n + i] = (((GRBColor << i) & 0X800000) ? WS1 : WS0);
    }
}
void ws281x_rainbowCycle(uint8_t wait)
{
  uint16_t i, j;
  //for(j=0; j<256*5; j++)
  { // 5 cycles of all colors on wheel

//    for(i=0; i< PIXEL_NUM; i++) {
//
//       WS281x_SetPixelColor(i,Wheel(((i * 256 / PIXEL_NUM) + j) & 255));
//    }
    //DelayMs(1);
  }
}
void WS2812B_Init(void)
{
    GPIOB_ModeCfg(GPIO_Pin_11, GPIO_ModeOut_PP_5mA);
    GPIOPinRemap(ENABLE, RB_PIN_TMR2);
    PRINT("TMR2 DMA PWM\n");
    TMR2_PWMCycleCfg(75); // 周期 1.25us
    TMR2_DMACfg(ENABLE, (uint16_t)(uint32_t)&PwmBuf[0], (uint16_t)(uint32_t)&PwmBuf[NUM], Mode_LOOP);
    TMR2_PWMInit(High_Level, PWM_Times_1);
    /* 开启计数溢出中断,计满1000个周期进入中断 */
    TMR2_ClearITFlag(TMR1_2_IT_DMA_END);
    PFIC_EnableIRQ(TMR2_IRQn);
    TMR2_ITCfg(ENABLE, TMR1_2_IT_DMA_END);

    TMR2_PWMEnable();
    TMR2_Enable();
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个示例代码,用于通过 CH582M 控制 WS2812C 带: ```C #include <ch582m.h> // 定义带的像素数量 #define NUM_LEDS 10 // 定义引脚 #define DATA_PIN 2 // 定义颜色结构体 typedef struct { uint8_t r; uint8_t g; uint8_t b; } RGBColor; // 定义带颜色数组 RGBColor leds[NUM_LEDS]; // 初始化 CH582M void ch582m_init() { CH582M_Init(); } // 发送颜色数据到带 void ch582m_sendData() { uint8_t i; for (i = 0; i < NUM_LEDS; i++) { CH582M_WriteByte(leds[i].g); CH582M_WriteByte(leds[i].r); CH582M_WriteByte(leds[i].b); } } // 设置指定像素的颜色 void setPixelColor(uint8_t index, uint8_t r, uint8_t g, uint8_t b) { leds[index].r = r; leds[index].g = g; leds[index].b = b; } // 清除所有像素的颜色 void clearPixels() { uint8_t i; for (i = 0; i < NUM_LEDS; i++) { setPixelColor(i, 0, 0, 0); } } int main() { // 初始化 CH582M ch582m_init(); // 清除所有像素的颜色 clearPixels(); // 设置指定像素的颜色 setPixelColor(0, 255, 0, 0); // 设置第一个像素为红色 setPixelColor(1, 0, 255, 0); // 设置第二个像素为绿色 setPixelColor(2, 0, 0, 255); // 设置第三个像素为蓝色 // 发送颜色数据到ch582m_sendData(); return 0; } ``` 这是一个简单的示例代码,用于控制 CH582M 控制器通过单总线协议发送颜色数据到 WS2812C 带。您可以根据需要修改像素数量、引脚定义以及设置每个像素的颜色。请确保您已正确安装 CH582M 的驱动和相关库,并将代码适配到您的开发环境中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值