STM32 HAL WS2812B PWM+DMA控制
目录
- 1.配置PWM+DMA
- 2.占空比设置
由上图可知 T0H+T0L
和 T1H+T1L
的时间周期为 800ns ~ 1380ns
取一个中间值 1.25us
那么0码/1码的周期就是 1s / 1.25us = 800kHz
所以PWM的周期就是800KHz
1.配置PWM+DMA
我这里使用的是TIM2_CH1 总线上的时钟频率为 52M
52M / 800KHz = 65
分频系数为0
那么向上计数值为65-1
2.占空比设置
0码的高电平大概占1/3的时间,那么PWM的计数值为 65 * 1/3 = 22
1码的高电平大概占2/3的时间,那么PWM的计数值为65 * 2/3 = 43
上面理论的东西弄好了,接下来是怎么使用
如果你以前只是使用PWM来调节呼吸灯,那你可能很难理解
例如我想输出 8个码 0 0 1 0 1 0 1 1
这里需要解决两个问题,怎么控制
1.输出一个0后,如何快速输出一个1?
2.怎么精准控制输出8个脉冲后就停止了?
运用你以前的PWM的使用方法是无法做到上面这两点的,但是和DMA组合使用,就可以很方便地实现(一行代码就搞定)
#define NUM 9
uint16_t send_Buf[NUM] = {22, 22, 43, 22, 43, 22, 43, 43, 0};void led_on(void)
{send_Buf[NUM - 1] = 0; // 这个很重要,最后一个需要设为0,要不然DMA不会停下来HAL_TIM_PWM_Start_DMA(&htim2, TIM_CHANNEL_1, (uint32_t *)send_Buf, NUM);
}
一个函数,简简单单就实现了上面的功能,示波器采集到的数据也对应得上
/*** @brief :输入hsv 返回rgb值 转换函数* @param {uint32_t} h:色调(0~360°)* @param {uint32_t} s:饱和度(0~100%)* @param {uint32_t} v:亮度(0~100%)* @param {uint32_t} *r:* @param {uint32_t} *g:* @param {uint32_t} *b:* @return {*}**/
void led_strip_hsv2rgb(uint32_t h, uint32_t s, uint32_t v, uint32_t *r, uint32_t *g, uint32_t *b)
{h %= 360; // h -> [0,360]uint32_t rgb_max = v * 2.55f;uint32_t rgb_min = rgb_max * (100 - s) / 100.0f;uint32_t i = h / 60;uint32_t diff = h % 60;// RGB adjustment amount by hueuint32_t rgb_adj = (rgb_max - rgb_min) * diff / 60;switch (i){case 0:*r = rgb_max;*g = rgb_min + rgb_adj;*b = rgb_min;break;case 1:*r = rgb_max - rgb_adj;*g = rgb_max;*b = rgb_min;break;case 2:*r = rgb_min;*g = rgb_max;*b = rgb_min + rgb_adj;break;case 3:*r = rgb_min;*g = rgb_max - rgb_adj;*b = rgb_max;break;case 4:*r = rgb_min + rgb_adj;*g = rgb_min;*b = rgb_max;break;default:*r = rgb_max;*g = rgb_min;*b = rgb_max - rgb_adj;break;}
}
后续把WS2812B的驱动代码补上(如果我还记得的话。。。)
STM32 HAL WS2812B PWM+DMA控制相关推荐
- STM32 HAL库 PWM+DMA 驱动WS2812B彩灯(STM32F030F4P6)
谁不想拥有炫酷的小彩灯呢?WS2812B可以给你机会...... 博主使用STM32驱动WS2812B主要参考了这位佬的文章,因为需求问题,采用了Cortex-M0的stm32f030f4p6(16k ...
- 关于STM32利用TIM+PWM+DMA控制WS2812
开发环境 MCU:STM32F103c8t6 开发工具:STM32CubeMX 使用板子参考原理图:STM32F103C8T6最小系统板开源链接 PWM 脉宽调制(PWM)基本原理:控制方式就是对逆变 ...
- STM32F427库函数PWM+DMA控制ws2812b灯带
STM32F427IIHx库函数PWM+DMA控制ws2812b灯带 一.参考资料 查看ws2812b用户手册可知: 二.代码部分 添加文件ws2812b.c,ws2812b.h 配置的F427IIH ...
- STM32 HAL库 串口DMA接收不定长数据
STM32 HAL库 串口DMA接收不定长数据 整体思路:我是用的CUBEMX软件生成的工程,使能了两个串口,串口2用来接收不定长的数据,串口1用来发送串口2接收到的数据:串口2我找了一个UBLOX卫 ...
- STM32:利用PWM波控制飞盈电调过程和注意事项
STM32:利用PWM波控制电调过程和注意事项 在进行模型控制的过程中,如四旋翼无人机等,需要用到电机,这些电机需要通过电调来控制电机的转速.在电调模块中带有的说明书一般都是利用遥控器进行控制,有些情 ...
- STM32 HAL 硬件IIC+DMA+简单图形库控制OLED
目录 前言 一.建立工程 二.编写和移植 前期准备 驱动部分修改 三.使用和验证 结论 (2022年1月22日重制)本文主要是移植带简单图形库的程序,如果只是实现DMA控制,建议看[0.96寸 OLE ...
- 国民技术 N32G031F8S7 PWM+DMA 控制 WS2812
一.技术背景 之前移植使用STM32来做MCU,但是这两年STM32离谱的价格和供货情况直接劝退大部分互联网企业.国产的MCU厂家也抓住机会,迅猛抢占市场,国民技术是较为典型的一个厂家. 在很多时候, ...
- STM32 HAL库 串口DMA(收发)和STM32串口中断接收(接收时间管理机制)+ESP8266 wifi模组通信问题
一.HAL库 串口 DMA+ESP8266模组通信问题 用STM32 HAL库串口的DMA发送和空闲中断接收处理数据,单片机发送AT指令给ESP8266 wifi模组问题:单片机连续几次给wifi模组 ...
- STM32 HAL库ADC+DMA(非定时器)代码和遇到的问题
目录 一.整体说明 二.部分知识点预览 三.代码部分 四.遇到的问题及现象 (1)仿真进入错误 (2)非连续模式软件触发时adcbuf里面的数据不对 (3)HAL库的ADC DMA相关中断的嵌套实现 ...
最新文章
- 零基础的前端开发初学者应如何系统地学习?
- 《转》java URL重写
- python 实现redis订阅发布功能
- 漫画 | 你真的会用烙铁焊接吗?
- 有哪些网站社区可以看原创平面设计大师作品?
- 机器人瓦力机械舞_25个与机器人有关的“前卫”知识,你知道几个?
- 拥抱开源四年的 .NET,现在怎么样了?
- Python编码风格
- windows取证之镜像取证仿真步骤
- GoF 23种设计模式
- 电子DIY:用单片机设计一款USB游戏手柄
- 加班申请 ----中间表--系统自动算出---可调休天数
- 年老时最后悔但为时已晚的几件事
- Windows常见的几种提权方法
- 计算机体系结构的主要原理,《计算机组成原理》计算机体系结构.pdf
- NodeMCU 通过MQTT 连接阿里云物联网
- 模拟QQ聊天——采用TCP协议的C/S架构实现
- iptables扩展模块
- sc4020使用并挂载到vcenter 2019.7.10
- PC微信逆向:发送与接收消息的分析与代码实现
热门文章
- 脉冲星 6 月脉动 | Pulsar Summit 北美峰会圆满结束,ApacheCon 议程官宣
- c语言打印一个字母圣诞树,C语言打印圣诞树
- 测试功能点----方法
- 前端参数无法转为后端实体内部类_javaweb实现自动将前端的属性值(HttpServletRequest)转化为后台对应的实体类...
- 学校计算机社团目标,电脑社团活动计划
- 微信公众号点击菜单出现白屏问题探究
- oem是代工还是贴牌_OEM贴牌和ODM贴牌的区别
- 最优策略(Optimal Policy)及贝尔曼最优方程(Bellman Optimally Equation)
- 2.系统发生树构建(非加权分组平均法、邻接法python实现)
- 自然语言处理之神经网络基础