STM32CubeMX WS2812B灯驱动

一、WS2812B

数据发送速度可达800Kbps。

数据协议采用单线归零码的通讯方式,像素点在上电复位以后,DIN端接受从控制器传输过来的数据,首先送过来的24bit数据被第一个像素点提取后,送到像素点内部的数据锁存器,剩余的数据经过内部整形处理电路整形放大后通过DO端口开始转发输出给下一个级联的像素点,每经过一个像素点的传输,信号减少24bit。像素点采用自动整形转发技术,使得该像素点的级联个数不受信号传送的限制,仅受限信号传输速度要求。

280μs以上的RESET时间,出现中断也不会引起误复位,可以支持更低频率、价格便宜的MCU。LED具有低电压驱动、环保节能、亮度高、散射角度大、一致性好超、低功率及超长寿命等优点。将控制电路集成于LED上面,电路变得更加简单,体积小,安装更加简便

 二、CubeMX配置

我这里使用的是stm32f030f4p6,留了一个485接口

1.打开调试 选择滴答时钟

2.RCC配置

 3.时钟树配置

4.配置PWW输出

设置周期为60个时钟周期(48MHz / 60 = 800kHz, 1.25us周期)

dma配置

5.串口配置

 生成工程

三、KEIL代码

目标PWM信号

WS2812 LED的时序要求非常严格。一般来说,WS2812的高电平和低电平的持续时间如下:

  • 高电平时间约为0.7µs(亮位)
  • 低电平时间约为0.35µs(暗位)

总信号周期约为1.25µs。

设置

  • 系统时钟频率:48 MHz
  • 目标PWM周期:1.25µs

计算

  1. 计算计数器周期值(ARR)

    我们需要让一个PWM周期为1.25µs,即:

    给定系统时钟频率为48 MHz,时钟周期为:

    因此,计数器周期值为:

  2. 设置高电平和低电平持续时间

    • 高电平时间约为0.7µs
    • 低电平时间约为0.35µs

    对应的计数器值:

WS2812B.c

#include "WS2812B.h"
#include "tim.h"

#define MAX_LED 6    // 灯的数量
#define USE_BRIGHTNESS 1    // 启用亮度控制

uint8_t LED_Data[MAX_LED][4];
uint8_t LED_Mod[MAX_LED][4];  // 用于亮度控制

void Set_LED(int LEDnum, int Red, int Green, int Blue) {
    LED_Data[LEDnum][0] = LEDnum;
    LED_Data[LEDnum][1] = Green;
    LED_Data[LEDnum][2] = Red;
    LED_Data[LEDnum][3] = Blue;
}

void Set_LED_HEX(int LEDnum, uint32_t colorValue) {
    LED_Data[LEDnum][0] = LEDnum;
    LED_Data[LEDnum][2] = (colorValue >> 16) & 0xFF;  // R
    LED_Data[LEDnum][1] = (colorValue >> 8) & 0xFF;   // G
    LED_Data[LEDnum][3] = colorValue & 0xFF;          // B
}

void Set_Brightness(int brightness) {
    if (brightness > 90) brightness = 90;  // 最大亮度值为100
    if (brightness < 10) brightness = 10;      // 最小亮度值为0
    for (int i = 0; i < MAX_LED; i++) {
        LED_Mod[i][0] = LED_Data[i][0];
        for (int j = 1; j < 4; j++) {
            LED_Mod[i][j] = (LED_Data[i][j] * brightness) / 100;
        }
    }
}

uint16_t pwmData[(24 * MAX_LED) + 50];

void WS2812_Send(void) {
    uint32_t indx = 0;
    uint32_t color;

    for (int i = 0; i < MAX_LED; i++) {
#if USE_BRIGHTNESS
        color = ((LED_Mod[i][1] << 16) | (LED_Mod[i][2] << 8) | (LED_Mod[i][3]));
#else
        color = ((LED_Data[i][1] << 16) | (LED_Data[i][2] << 8) | (LED_Data[i][3]));
#endif
        for (int j = 23; j >= 0; j--) {
            if (color & (1 << j)) {
                pwmData[indx] = 34;  // 高电平持续时间
            } else {
                pwmData[indx] = 17;  // 低电平持续时间
            }
            indx++;
        }
    }

    for (int i = 0; i < 50; i++) {
        pwmData[indx] = 0;
        indx++;
    }

    HAL_TIM_PWM_Start_DMA(&htim3, TIM_CHANNEL_1, (uint32_t *)pwmData, indx);
}

WS2812B.h

#ifndef __WS2812B_H


#define __WS2812B_H
#include "main.h"

void Set_LED (int LEDnum, int Red, int Green, int Blue);//RGB

void Set_LED_HEX(int LEDnum, uint32_t colorValue);//十六进制

void Set_Brightness (int brightness);  // 0-100
void WS2812_Send (void);


#endif

 主函数

导入头文件和定义接收数组

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "WS2812B.h"
/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
//接收数据解析 FD 亮度 小灯1 2 3 4 5 6 FF
uint8_t rx1data[15]={0};
uint8_t data[15];
uint8_t rx1flag=0;
/* USER CODE END PTD */

 空闲中断接收数据

/* USER CODE BEGIN 0 */
//空闲中断回调函数,参数Size为串口实际接收到数据字节数
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{
	if(huart->Instance==USART1)
	{
		for(int i=0;i<15;i++){
			data[i]=rx1data[i];
		}
		rx1flag=1;
		//再次开启空闲中断接收,不然只会接收一次数据
		HAL_UARTEx_ReceiveToIdle_IT(&huart1,rx1data,Size);
	}
}
/* USER CODE END 0 */

 main函数 接收一帧数据并且控制小灯RGB

int main(void)
{
 
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_USART1_UART_Init();
  MX_TIM3_Init();
 
  HAL_UARTEx_ReceiveToIdle_IT(&huart1,rx1data,sizeof(rx1data));

  while (1)
  {
		if(rx1flag==1){
			if(data[0]==0xFD){
				Set_LED(0,data[2],data[3]>>4,data[3]&0x0f);
				Set_LED(1,data[4],data[5]>>4,data[5]&0x0f);
				Set_LED(2,data[6],data[7]>>4,data[7]&0x0f);
				Set_LED(3,data[8],data[9]>>4,data[9]&0x0f);
				Set_LED(4,data[10],data[11]>>4,data[11]&0x0f);
				Set_LED(5,data[12],data[13]>>4,data[13]&0x0f);
				Set_Brightness(data[1]);
				WS2812_Send();
				rx1flag=0;
			}
		}

 
  }

}

 帧解析

FD F0 0F 00 0F F0 00 F0 00 0F 00 FF 0F 0F FF

帧头帧尾    FD- FF

第一个字节数据 是调节RGB亮度       F0

第二第三个字节 控制第一个RGB 显示红色   0F 00

第四第五个字节 控制第二个RGB 显示黄色   0F F0

第六第七个字节 控制第三个RGB 显示绿色   00 F0

第八第九个字节 控制第四个RGB 显示蓝色   00 0F

第十第十一个字节 控制第五个RGB 显示靛蓝 00 FF

第十二第十三个字节 控制第6个RGB显示紫色  0F 0F

效果

 

 

 https://oshwhub.com/chem4111/ledboad 

链接:https://pan.baidu.com/s/1WSJNQzQiiU7Vc3ed04pNPw?pwd=1cjy 
提取码:1cjy

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/729719.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MyBatis基础教程

文章目录 一、MyBatis基本使用1.1简介1.2搭建MyBatis环境1.2.1安装MyBatis1.2.2创建MyBatis核心配置文件1.2.3创建mapper接口1.2.4创建MyBatis映射文件1.2.5实现增加功能 1.3整合log4j1.4修改与删除功能1.5查询功能1.5.1查询单个实体类对象1.5.2查询所有用户信息 二、核心配置文…

数据结构经典面试之链表——C#和C++篇

文章目录 一、链表的基本概念二、链表的操作三、定义链表的节点结构体&#xff08;C#&#xff09;四、定义链表的基本操作类&#xff08;C#&#xff09;五、创建一个链表实例并进行基本操作演示&#xff08;C#&#xff09;六、编写一个自定义链表操作函数&#xff08;C&#xf…

react学习——09react中props属性

1、基本使用 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><!-- 移动端适配--><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>1_props基…

跨境电商-Ozon平台开店指南-魔行观察

商家入驻开店指南 第1步&#xff1a;注册并激活您的帐户 对于独联体以外的卖家&#xff1a;法人实体可以在平台上注册。如果您是个体经营户&#xff0c;请您首先开设一家公司。个体经营户&#xff08;土耳其的个体经营户除外&#xff09;不能在我们的平台上注册。 进行注册 …

qmt量化交易策略小白学习笔记第46期【qmt编程之期货行情数据--如何获取5档盘口行情、期货结算价与持仓量】

qmt编程之获取期货数据 qmt更加详细的教程方法&#xff0c;会持续慢慢梳理。 也可找寻博主的历史文章&#xff0c;搜索关键词查看解决方案 &#xff01; 感谢关注&#xff0c;咨询免费开通量化回测与获取实盘权限&#xff0c;欢迎和博主联系&#xff01; 获取5档盘口行情 …

高效文本编辑器:轻松掌握内容,批量删除每隔一行带有分隔符的内容,助力文本处理更高效!

在信息爆炸的时代&#xff0c;文本处理已成为我们日常生活和工作中不可或缺的一部分。然而&#xff0c;面对海量的文本内容&#xff0c;如何高效地进行编辑和整理&#xff0c;成为了许多人面临的难题。今天&#xff0c;我要向大家推荐一款高效文本编辑器——首助编辑高手&#…

如何在 MySQL 中创建和使用事务?

目录 1. 环境准备 2. 创建事务 3. 事务执行 4. 事务撤消 5. 总结 事务是数据库区别于文件系统的重要特征之一&#xff0c;当我们有了事务就会让数据库始终保持一致&#xff0c;同时我们还能通过事务机制恢复到某个时间点&#xff0c;这样可以保证已提交到数据库的修改不会…

mysql设置密码复杂度策略,登录失败次数限制

在配置文件中加入如下配置&#xff0c;重启mysql服务 [mysqld] #密码复杂度插件 plugin-load-addvalidate_password.so validate-passwordFORCE_PLUS_PERMANENT validate_password_policy2 # 0简单 1普通 2困难 validate_password_length9 # 密码长度限制 #登录失败次数、时间…

云服务器可以从哪些方面降低开发运维难度

开发和运维工作面临着诸多挑战&#xff0c;如果说现在市场上有可以快速有效解决的方案&#xff0c;那么云服务器绝对是首选&#xff0c;云服务器从多个方面显著降低了其难度。 具象到云服务器的特质中&#xff0c;不得不提的还是云服务器的弹性伸缩&#xff0c;之前的文章里有…

网络流量 数据包length计算

MTUMSSIP header(20 bytes)tcp header(20 bytes) lengthMTUEthernet header(14bytes) 其中MSS为Maximum Segment Size&#xff0c;即最大报文段长度&#xff0c;其受MTU大小影响&#xff0c;这里的MTU指的是三层的&#xff0c;二层的MTU固定为1500&#xff0c;不能修改。 MT…

推出RW610高度集成的低功耗无线MCU,带内置3频:1x1 Wi-Fi®6+ Bluetooth® Low Energy 5.4射频单元

RW610是一款高度集成的低功耗无线MCU&#xff0c;它集成了MCU和Wi-Fi6Bluetooth Low Energy (LE) 5.4射频单元&#xff0c;适用于多种应用&#xff0c;包括互联智能家居设备、游戏控制器、企业和工业自动化、智能配件和智能能源。 采用TFBGA145封装的系列器件&#xff1a;RW61…

docker curl:(56) Recv failure: Connection reset by peer

docker容器启动后&#xff0c;查看日志未发现错误&#xff0c;通过查询和分析&#xff0c;发现是期望容器打开的端口与容器实际打开的端口不一致导致。 1&#xff09;docker run -itd -p 8082:8082 vulfocus/log4j2-rce-2021-12-09:latest 2&#xff09;curl localhost:8082 …

移动端 UI 风格,彰显不凡

移动端 UI 风格&#xff0c;彰显不凡

一文读懂数据仓库ODS层

数据仓库一般分为三层&#xff0c;分别为数据贴源层&#xff08;ODS&#xff0c;Operation Data Store&#xff09;、数据公共层&#xff08;CDM&#xff0c;Common Data Model&#xff09;和数据应用层&#xff08;ADS&#xff0c;Application Data Service&#xff09;。其中…

java基于ssm+jsp 高校四六级报名管理系统

1前台首页功能模块 高校四六级报名管理系统&#xff0c;在系统首页可以查看首页、四六级报名、新闻资讯、我的、跳转到后台、在线客服等内容&#xff0c;如图1所示。 图1系统功能界面图 学生登录、学生注册&#xff0c;在注册页面可以填写学号、密码、姓名、学院、班级、手机、…

苹果智能和人工智能最大化

苹果智能和人工智能最大化 除了苹果公司&#xff0c;还没有人真正使用过苹果的智能功能。它要到秋天才会分阶段发布&#xff0c;即使到那时&#xff0c;它也无法在80%或90%的iPhone安装基础上运行&#xff0c;因为它需要只有iPhone 15 Pro才能使用的设备上处理功能。没有什么能…

无线模块433MHz和2.4GHz的功能与适用性比较

433MHz和2.4GHz这两个频段常用于无线通信中的模块&#xff0c;今天我们就来介绍这两种频段无线模块各自的特点。433MHz和2.4GHz无线模块工作频段都属于国内免许可的ISM开放频段&#xff0c;因此二者使用较为广泛。 433MHz频段无线模块位于超高频(UHF)范围内&#xff0c;具体频…

【0-1系列】从0-1快速了解搜索引擎是什么以及怎么用(上)

友情链接 社区开发版安装部署与使用教程社区版家族V2024.5版本更新说明 START>>1.快速了解搜索引擎 什么是搜索引擎数据库 搜索引擎数据库是一类专门用于数据内容搜索的NoSQL数据库&#xff0c;是非结构化大数据处理分析领域中重要的基础支撑软件。 伴随互联网、移动…

【element-ui】el-date-picker动态设置picker-options

<el-date-pickerv-model"formObj.startDate"type"date"placeholder"开始时间":picker-options"startPickerOptions"> </el-date-picker><el-date-pickerv-model"formObj.endDate"type"date"placeh…

全域外卖系统源码在哪些渠道值得推荐?

当前&#xff0c;全域外卖的热度持续飙升&#xff0c;并且隐隐有了大爆的趋势。许多创业者也因此有了进军全域外卖赛道的想法&#xff0c;以全域外卖系统源码在哪找为代表多个相关问题因此成为了多个创业者交流群的常客。 根据中国互联网络信息中心&#xff08;CNNIC&#xff0…