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)…

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

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

移动端 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…

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…

神经压缩文本训练:提升大型语言模型效率的新方法

随着大型语言模型&#xff08;LLMs&#xff09;在各个领域的广泛应用&#xff0c;其训练和部署的效率问题日益凸显。传统的子词标记化方法&#xff0c;如Byte Pair Encoding (BPE) 或 Unigram&#xff0c;虽然能够在一定程度上压缩文本&#xff0c;但其压缩率通常只有4倍左右。…

Kubernetes部署Kanboard看板管理平台

【云原生】Kubernetes部署Kanboard项目管理平台 文章目录 【云原生】Kubernetes部署Kanboard项目管理平台介绍资源列表基础环境一、检查k8s环境1.1、检查工作节点状态1.2、检查系统pod状态 二、编辑kanboard.yaml文件2.1、创建项目目录2.2、编辑kanboard.yaml文件 三、部署Kanb…

日常工作中常用的管理工具

日常工作中常用的管理工具 SWOT分析法&#xff1a; 帮你清晰地把我全局&#xff0c;分析自己在资源方面的优势域劣势&#xff0c;把握环境提供的机会&#xff0c;防范可能存在的风险与威胁&#xff0c;对我们的成功有非常重要的意义 PDCA循环规则&#xff1a; 每一项工作&#…

如何使用LiveTargetsFinder生成实时活动主机URL列表

关于LiveTargetsFinder LiveTargetsFinder是一款功能强大的实时活动主机生成工具&#xff0c;该工具可以为广大研究人员以自动化的形式生成可供分析和测试的实时活动主机URL列表&#xff0c;并通过MassDNS、Masscan和Nmap自动过滤出无法访问的主机。 我们只需要提供一个域名作…

代码随想录第30天|贪心算法

122.买卖股票的最佳时机II 给你一个整数数组 prices &#xff0c;其中 prices[i] 表示某支股票第 i 天的价格。 在每一天&#xff0c;你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买&#xff0c;然后在 同一天 出售。 返回 你能获得…

SAP PP学习笔记23 - 生产订单(制造指图)的元素2 - 决济规则(结算规则)

上一章讲了生产订单&#xff08;制造指图&#xff09;画面的基本元素。 SAP PP学习笔记22 - 生产订单&#xff08;制造指图&#xff09;的元素1-CSDN博客 本章继续讲生产订单上面的其他元素。 1&#xff0c;Settlement rule&#xff08;决济规则(结算规则)&#xff09;概要 M…

springboot容器功能

springboot容器 容器功能Spring注入组件的注解Component&#xff0c;Controller&#xff0c;Service&#xff0c;Repository案例演示 Configuration应用实例传统方式使用Configuration 注意事项和细节 Import应用实例 ConditionalConditional介绍应用实例 ImportResource应用实…