这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 活动中心 » 板卡试用 » 【换取手持数字示波器】+点亮WS2812RGB灯

共7条 1/1 1 跳转至

【换取手持数字示波器】+点亮WS2812RGB灯

工程师
2024-04-16 20:14:28   被打赏 50 分(兑奖)     打赏

使用国民技术N32G430开发板点亮WS2812 RGB灯,你需要遵循WS2812的通讯协议和数据传输方式。WS2812是一种可编程的LED灯,具有RGB显示效果,通过单线传输数据来控制每个灯珠的颜色。

下面是一个基本的步骤指南,帮助你实现这个目标:

  1. 硬件连接

    • 将WS2812 RGB灯珠的DIN(数据输入)引脚连接到N32G430开发板的一个GPIO(通用输入输出)引脚上。

    • 将WS2812 RGB灯珠的VDD(电源正)引脚连接到开发板的电源输出上,确保电压范围在WS2812的工作电压内(通常为+3.5V至+5.3V)。


    • 将WS2812 RGB灯珠的VSS(电源地)引脚连接到开发板的GND(地线)上。

灯珠连接原理图:

image.png.



手工刻的板子:

image.png


焊好的效果图:

image.png


驱动代码:

image.png灯颜色代码:

image.png参考示例:

#include "board.h" // 根据你的开发环境包含正确的头文件  
#include "gpio.h"  
  
// 假设WS2812的DIN引脚连接到了GPIO1  
#define WS2812_DIN_PIN GPIO_PIN(PORT_A, 1)  
  
// WS2812的一位时间,单位为微秒  
#define WS2812_T0H 0.4  
#define WS2812_T1H 0.8  
#define WS2812_TRESET 50 // 重置时间,单位为微秒  
#define WS2812_BIT_TIME (WS2812_T1H + WS2812_T0H)  
  
// 延时函数,单位微秒  
void delay_us(uint32_t us) {  
    // 根据你的开发环境实现延时函数  
    // 例如使用定时器或循环等待  
}  
  
// 发送单个WS2812位  
void ws2812_send_bit(uint8_t bit) {  
    if (bit) {  
        // 发送1位(高电平时间长)  
        gpio_set_value(WS2812_DIN_PIN, 1);  
        delay_us(WS2812_T1H);  
        gpio_set_value(WS2812_DIN_PIN, 0);  
        delay_us(WS2812_T0H);  
    } else {  
        // 发送0位(高电平时间短)  
        gpio_set_value(WS2812_DIN_PIN, 1);  
        delay_us(WS2812_T0H);  
        gpio_set_value(WS2812_DIN_PIN, 0);  
        delay_us(WS2812_T1H);  
    }  
}  
  
// 发送一个完整的WS2812字节  
void ws2812_send_byte(uint8_t byte) {  
    for (int i = 0; i < 8; i++) {  
        ws2812_send_bit((byte >> i) & 1);  
    }  
}  
  
// 发送RGB值到WS2812  
void ws2812_send_rgb(uint8_t red, uint8_t green, uint8_t blue) {  
    // 开始信号  
    gpio_set_value(WS2812_DIN_PIN, 0);  
    delay_us(WS2812_TRESET);  
    gpio_set_value(WS2812_DIN_PIN, 1);  
    delay_us(WS2812_T0H);  
  
    // 发送24位数据:GRB格式  
    ws2812_send_byte(green);  
    ws2812_send_byte(red);  
    ws2812_send_byte(blue);  
  
    // 发送结束信号  
    gpio_set_value(WS2812_DIN_PIN, 0);  
    delay_us(WS2812_TRESET);  
}  
  
int main(void) {  
    // 初始化GPIO  
    gpio_init(WS2812_DIN_PIN);  
    gpio_set_mode(WS2812_DIN_PIN, GPIO_MODE_OUTPUT);  
  
    // 发送RGB值到WS2812  
    ws2812_send_rgb(255, 0, 0); // 红色  
  
    while (1) {  
        // 主循环保持空或执行其他任务  
    }  
  
    return 0;  
}

参考波形:

image.png点亮效果:

image.png



工程师
2024-04-23 10:04:31     打赏
2楼

学习了。谢谢分享。


专家
2024-05-21 11:44:22     打赏
3楼

学习了,谢谢分享!


工程师
2024-05-28 04:35:54     打赏
4楼

感谢分享


专家
2024-06-23 09:53:05     打赏
5楼

感谢分享


专家
2024-07-07 17:26:49     打赏
6楼

感谢分享


菜鸟
2024-07-22 18:37:16     打赏
7楼

谢谢楼主大大分享



共7条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]