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;  // RLED_Data[LEDnum][1] = (colorValue >> 8) & 0xFF;   // GLED_Data[LEDnum][3] = colorValue & 0xFF;          // B
}void Set_Brightness(int brightness) {if (brightness > 90) brightness = 90;  // 最大亮度值为100if (brightness < 10) brightness = 10;      // 最小亮度值为0for (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_BRIGHTNESScolor = ((LED_Mod[i][1] << 16) | (LED_Mod[i][2] << 8) | (LED_Mod[i][3]));
#elsecolor = ((LED_Data[i][1] << 16) | (LED_Data[i][2] << 8) | (LED_Data[i][3]));
#endiffor (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);//RGBvoid 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.mzph.cn/diannao/31514.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

openssl 命令行生成密钥对,生成hash,PSS填充签名,校验

生成密钥对 openssl genpkey -algorithm RSA -out private_key.pem -pkeyopt rsa_keygen_bits:4096 openssl rsa -pubout -in private_key.pem -out public_key.pem将源文件data.txt生成hash值&#xff08;sha-256&#xff09; openssl dgst -sha256 -binary data.txt > d…

MySQL进阶——SQL优化

目录 1插入数据 1.1 insert 1.2大批量插入数据 2主键优化 3 order by 优化 4 group by 优化 5 limit 优化 6 count 优化 6.1概述 6.2 count用法 7 update优化 1插入数据 1.1 insert 优化方案主要有3种 批量插入数据 Insert into tb_test values(1,Tom),(2,Cat)…

QT 数值型坐标轴有那些?(QValueAxis)

在Qt中&#xff0c;QValueAxis类用于表示数值型坐标轴&#xff0c;它本身没有直接的子类&#xff0c;但它是从QAbstractAxis这个抽象类继承而来的。QAbstractAxis是定义坐标轴属性和行为的基类&#xff0c;而QValueAxis则在此基础上提供了针对数值数据的具体实现。 Qt的图表模…

HarmonyOS开发知识 :扩展修饰器,实现节流、防抖、权限申请

引言 防重复点击&#xff0c;利用装饰器面向切面&#xff08;AOP&#xff09;的特性结合闭包&#xff0c;实现节流、防抖和封装权限申请。 节流 节流是忽略操作&#xff0c;在触发事件时&#xff0c;立即执行目标操作&#xff0c;如果在指定的时间区间内再次触发了事件&…

linux修改root密码

linux修改root密码 在Linux中&#xff0c;可以使用以下几种方法来修改root密码&#xff1a; 方法1&#xff1a;使用passwd命令 该方法是最常见和最简单的方法&#xff0c;使用passwd命令可以直接修改root用户的密码。在终端中执行以下命令&#xff1a; sudo passwd root 系统…

移动端 UI 风格,彰显不凡

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

【车载AI音视频电脑】4/8路AHD 200万像素车载电脑SD卡录像机

产品主要特点&#xff1a; -支持4路实时高清AHD 1080P录像 -SD卡记录数据&#xff08;可支持2张大容量SD卡,最大支持单张256G&#xff09; -支持GPS全球定位, 可选模块 -支持WIFI高速自动下载功能, 可选模块 -内置3/4G模块&#xff0c;实时预览和远程管理&#xff0c; 可选…

汇凯金业:现货黄金投资平仓策略有哪些

现货黄金作为全球投资者广泛关注与参与的财富增值途径&#xff0c;其双向交易制度为市场参与者在不同行情下提供了盈利的可能。然而&#xff0c;如何在波动的市场中把握最佳的平仓时机&#xff0c;从而最大化收益&#xff0c;是所有投资者心中的疑问。正确的平仓策略可以说是现…

YYU系列电子引伸计

型号&#xff1a; YYU-50/10 YYU-50/25 YYU-25/10 YYU-100/10 YYU-100/25 轴向变形引伸计&#xff0c;适用于金属非金属材料的测试。用于测量弹性模量、规定非比例延伸强度、规定总延伸强度、各种延伸率、应变硬化指数等参数。 技术参数 1、应变片阻值&#xff1a;350欧…

vue+echarts ----中国地图 下拉选择省份地图中的省份区域高亮显示以及飞线图的效果

vueecharts ----中国地图 下拉选择省份地图中的省份区域高亮显示以及飞线图的效果 1、父组件核心代码&#xff1a;【/utils/area的详细数据】、【/utils/china详细数据】 <template><div class"center"><div class"digital"><el-se…

排书 IDA*

原题链接 题目描述 给定 n 本书&#xff0c;编号为 1∼n。 在初始状态下&#xff0c;书是任意排列的。在每一次操作中&#xff0c;可以抽取其中连续的一段&#xff0c;再把这段插入到其他某个位置。我们的目标状态是把书按照 1∼n 的顺序依次排列。求最少需要多少次操作。 输…

STM32学习笔记(十一)--SPI总线协议详解

概述&#xff1a;Serial Peripheral Interface&#xff0c;一组多从 传输速率比I2C快 但是线多 无应答 是一种同步&#xff08;具有时钟线需要同步时钟SCL&#xff09;、串行&#xff08;一位一位的往一个方向发送&#xff09;、全双工&#xff08;发送接收同时&#xff09;通…

Rocky9使用cockpitweb登陆时root用户无法登陆

Rocky9使用cockpitweb登陆时root用户无法登陆 [rootlvs ~]# vim /etc/cockpit/disallowed-users [rootlvs ~]# systemctl restart cockpit 取消disallowed-users中的root&#xff0c;即可访问 ip:9090 登陆。

计算机网络 —— 应用层(万维网)

计算机网络 —— 应用层&#xff08;万维网&#xff09; 万维网核心组成部分特点 URLHTTP版本请求消息结构响应消息结构工作流程 Cookie如何工作主要用途安全与隐私类型 Web缓存客户端缓存&#xff08;浏览器缓存&#xff09;服务器端缓存 今天我们来了解万维网&#xff1a; 万…

螺蛳粉店外卖配送小程序商城的效果为何

螺蛳粉是广西地区的特色美食&#xff0c;在当地有着大量实体餐饮店或品牌商&#xff0c;其单品消费率非常高&#xff0c;在外地也不乏自创品牌或加盟店等&#xff0c;其特殊的味道及吸引力也同样复购率高&#xff0c;客户除了线下到店外&#xff0c;也会购买袋/桶装螺蛳粉到家自…

构建有效的财务规划合作伙伴关系

在这个日益注重分类、定义和正规化的时代&#xff0c;财务规划与分析作为企业环境中发展最快的功能之一&#xff0c;已经从典型的数据管理角色逐步演变成企业框架中必不可少的身份。与其他新兴趋势一样&#xff0c;财务规划也开始采用更加创新的理念来吸引高技能投资&#xff0…

关于FPGA的浮点数处理 II

关于FPGA的浮点数处理 II 语言 &#xff1a;Verilg HDL 、VHDL EDA工具&#xff1a;ISE、Vivado、Quartus II 关于FPGA的浮点数处理 II一、引言二、浮点数运算的FPGA实现1. 有符号数整数转单精度浮点数&#xff08;1&#xff09;实现代码&#xff08;Int2Fp模块&#xff09;&am…

MYSQL杀掉会话

确实&#xff0c;你可以通过 performance_schema.events_statements_current 表来查找当前正在执行的语句的会话ID&#xff08;通常称为 THREAD_ID&#xff09;&#xff0c;然后使用 KILL 命令来终止该会话。不过&#xff0c;需要注意的是 events_statements_current 表中只包含…

新手项目经理如何快速成长?做好这些让你变优秀

随着国内企业精细化发展的步伐不断加快&#xff0c;企业内部在项目立项、项目运营、项目分析等板块的管理要求越来越高&#xff0c;对项目经理的岗位需求也越来越高。一个合格的项目经理需要对项目的初期、中期、后期进行全局的把控。初为项目经理&#xff0c;项目小白如何才能…

14、Spring之Bean生命周期~推断构造方法

14、Spring之Bean生命周期~推断构造方法 推断构造方法determineConstructorsFromBeanPostProcessors()方法autowireConstructor()方法instantiateBean()方法instantiateUsingFactoryMethod()方法 推断构造方法 spring在创建Bean对象的会调用createBeanInstance()方法进行实例化…