目录

一、摘要

二、WS2812B介绍

三、CUBEMX配置

四、程序介绍(KEIL编译器)

五、数据手册


一、摘要

1、本文使用示例单片机型号为stm32f103c8t6,RGB型号为WS2812B

        2、主要实现功能是实现用PWM+DMA使RGB_LED亮起不同颜色的灯光;

3、目的:简单调通该型号RGB_LED,方便后续改编使用,希望各位读者可以依次做出更炫酷的效果。为了便于更好理解数据手册和单片机配置的关联,第二部分也放入了CUBEMX的部分配置图片

4、优点:DMA转运,硬件自动数据搬运(由内存到外设),减少CPU资源占用,第一次使用DMA可以先大致看一下DMA相关知识,这会让你很容易理解下面的一些配置

二、WS2812B介绍

 ( 为了便于更好理解数据手册和单片机配置的关联,第二部分也放入了CUBEMX的部分)

依据方向标识与单片机接好线路

注:VSS接5V

DIN接单片机PWM输出引脚(本文中接PA8引脚,即TIM1_PWM输出通道1)

DOUT接下一个LED的DIN引脚

此处重装值就是定时器一个周期从0计到89计90个数(后面介绍为什么是89)

通过控制PWM占空比发送0码和1码,额定周期为1.25us,则频率为800Khz

0码PWM占空比:

(0码高电平时间)/(周期)--->  0.4 / 1.25 = 0.32

用占空比乘以定时器重装值加一就是0码的CCR值(代表PWM高电平计数个数)--->

0.32 * (89+1) = 28.8(取28,实测不可以高于28,但23到28都可以)

1码PWM占空比:

同理计算:(1码高电平时间)/ (周期)---> 0.8 / 1.25 = 0.64

(占空比)*(重置值+1)= CCR ---> 0.64 * 1.25 = 57.6(取58)

每一个LED的R、G、B分别由八位数据控制颜色浓度,(每种颜色浓度有0~255档,理论上RGB就可以组成256的3次方中颜色组合)即每个LED需要24BIT数据,那么需要发送数据的总长度则为(要控制LED数量 n)*(24),每个LED保存24BIT将剩余位传给后面LED。全部数据发送完成后要继续发送大于24us的低电平作为RESET_CODE等才可以点亮。

三、CUBEMX配置

 

定时器配置

PWM频率:

Fpwm =Tclk / ((arr+1)*(psc+1))(单位:Hz)

上面提到数据传送频率为800Khz,Tclk为72Mhz,我们这里设置pcs = 0,arr= 89,得到频率刚好为800Khz。

占空比:

duty circle = TIM3->CCR1 / arr(单位:%)

TIM3->CCR1  用户设定值(即上述0码和1码占空比计算所得CCR)

PWM-DMA配置

1:DMA配置

2:添加一个DMA

3:选择定时器1的通道一外设

四、程序介绍(KEIL编译器)

RGB.H

#ifndef __RGB_H__
#define __RGB_H__#include "main.h"/*这里是上文计算所得CCR的宏定义*/
#define CODE_1       (58)       //1码定时器计数次数
#define CODE_0       (25)       //0码定时器计数次数/*建立一个定义单个LED三原色值大小的结构体*/
typedef struct
{uint8_t R;uint8_t G;uint8_t B;
}RGB_Color_TypeDef;#define Pixel_NUM 1  //LED数量宏定义,这里我使用一个LED,(单词pixel为像素的意思)void RGB_SetColor(uint8_t LedId,RGB_Color_TypeDef Color);//给一个LED装载24个颜色数据码(0码和1码)
void Reset_Load(void); //该函数用于将数组最后24个数据变为0,代表RESET_code
void RGB_SendArray(void);          //发送最终数组
void RGB_RED(uint16_t Pixel_Len);  //显示红灯
void RGB_GREEN(uint16_t Pixel_Len);//显示绿灯
void RGB_BLUE(uint16_t Pixel_Len); //显示蓝灯
void RGB_WHITE(uint16_t Pixel_Len);//显示白灯#endif

RGB.C

#include "RGB.h"
#include "tim.h"/*Some Static Colors------------------------------*/
const RGB_Color_TypeDef RED      = {255,0,0};   //显示红色RGB数据
const RGB_Color_TypeDef GREEN    = {0,255,0};
const RGB_Color_TypeDef BLUE     = {0,0,255};
const RGB_Color_TypeDef SKY      = {0,255,255};
const RGB_Color_TypeDef MAGENTA  = {255,0,220};
const RGB_Color_TypeDef YELLOW   = {127,216,0};
const RGB_Color_TypeDef OEANGE   = {127,106,0};
const RGB_Color_TypeDef BLACK    = {0,0,0};
const RGB_Color_TypeDef WHITE    = {255,255,255};/*二维数组存放最终PWM输出数组,每一行24个
数据代表一个LED,最后一行24个0代表RESET码*/
uint32_t Pixel_Buf[Pixel_NUM+1][24];       /*
功能:设定单个RGB LED的颜色,把结构体中RGB的24BIT转换为0码和1码
参数:LedId为LED序号,Color:定义的颜色结构体
*/
void RGB_SetColor(uint8_t LedId,RGB_Color_TypeDef Color)
{uint8_t i; if(LedId > Pixel_NUM)return; //avoid overflow 防止写入ID大于LED总数for(i=0;i<8;i++) Pixel_Buf[LedId][i]   = ( (Color.G & (1 << (7 -i)))? (CODE_1):CODE_0 );//数组某一行0~7转化存放Gfor(i=8;i<16;i++) Pixel_Buf[LedId][i]  = ( (Color.R & (1 << (15-i)))? (CODE_1):CODE_0 );//数组某一行8~15转化存放Rfor(i=16;i<24;i++) Pixel_Buf[LedId][i] = ( (Color.B & (1 << (23-i)))? (CODE_1):CODE_0 );//数组某一行16~23转化存放B
}//最后一行装在24个0
void Reset_Load(void)
{uint8_t i;for(i=0;i<24;i++){Pixel_Buf[Pixel_NUM+1][i] = 0;}
}/*
功能:发送数组
参数:(&htim1)定时器1,(TIM_CHANNEL_1)通道1,((uint32_t *)Pixel_Buf)待发送数组,(Pixel_NUM+1)*24)发送个数,数组行列相乘
*/
void RGB_SendArray(void)
{HAL_TIM_PWM_Start_DMA(&htim1, TIM_CHANNEL_1, (uint32_t *)Pixel_Buf,(Pixel_NUM+1)*24);
}/*
功能:显示红色
参数:Pixel_Len为显示LED个数
*/
void RGB_RED(uint16_t Pixel_Len)
{uint16_t i;for(i=0;i<Pixel_Len;i++)//给对应个数LED写入红色{RGB_SetColor(i,RED);}Reset_Load();RGB_SendArray();
}/*
功能:显示绿色
参数:Pixel_Len为显示LED个数
*/
void RGB_GREEN(uint16_t Pixel_Len)
{uint16_t i;for(i=0;i<Pixel_Len;i++)//给对应个数LED写入绿色{RGB_SetColor(i,GREEN);}Reset_Load();RGB_SendArray();
}/*
功能:显示蓝色
参数:Pixel_Len为显示LED个数
*/
void RGB_BLUE(uint16_t Pixel_Len)
{uint16_t i;for(i=0;i<Pixel_Len;i++)//给对应个数LED写入蓝色{RGB_SetColor(i,BLUE);}Reset_Load();RGB_SendArray();
}/*
功能:显示白色
参数:Pixel_Len为显示LED个数
*/
void RGB_WHITE(uint16_t Pixel_Len)
{uint16_t i;for(i=0;i<Pixel_Len;i++)//给对应个数LED写入白色{RGB_SetColor(i,WHITE);}Reset_Load();RGB_SendArray();
}//也可以继续添加其他颜色,和颜色变化函数等

main.c

在此处调用RGB头文件

在while(1)里写入想要的颜色变化,这里现象为红绿蓝白四种颜色1秒变化一次

五、数据手册

百度云盘 WS2812B

阿里云盘 WS2812B

ok,简单讲到这里,希望你可以依次添加更多功能复杂的函数,做出更炫酷更有趣的LED颜色变幻,如果有什么地方感觉说的不清晰可以留言评论


WS2812B彩灯 STM32HAL库开发:PWM+DMA(stm32f103c8t6)相关推荐

  1. 看这里就知道ws2812B怎么用了(PWM+DMA)

    文章目录 芯片&工具 编码 1. ==外设初始化配置== 2. ==让灯亮起来== 3. ==显示彩虹灯== 4. ==享受彩虹灯== 近期用RGB三色灯WS2812B做了个彩虹灯的小玩意,记 ...

  2. STM32 HAL库开发转固件库开发杂谈

    前言 本文使用代码工程 STM32HAL库开发转固件库开发杂谈-嵌入式文档类资源-CSDN文库 STM32 最早提供固件库开发,在当时也是一个很大的创新.导致大量攻城狮熟悉了固件库开发,后面STM32 ...

  3. STM32-HAL库串口DMA空闲中断的正确使用方式+解析SBUS信号

    STM32-HAL库串口DMA空闲中断的正确使用方式+解析SBUS信号 一. 问题描述 二. 方法一--使用HAL_UART_Receive_DMA 三. 方法二--使用HAL_UARTEx_Rece ...

  4. STM32 HAL WS2812B PWM+DMA控制

    目录 1.配置PWM+DMA 2.占空比设置 由上图可知 T0H+T0L 和 T1H+T1L 的时间周期为 800ns ~ 1380ns 取一个中间值 1.25us 那么0码/1码的周期就是 1s / ...

  5. STM32F427库函数PWM+DMA控制ws2812b灯带

    STM32F427IIHx库函数PWM+DMA控制ws2812b灯带 一.参考资料 查看ws2812b用户手册可知: 二.代码部分 添加文件ws2812b.c,ws2812b.h 配置的F427IIH ...

  6. 【STM32F4系列】【HAL库】【自制库】WS2812(软件部分)(PWM+DMA)

    文章目录 相关链接 协议 外设设置 硬件PWM 分析 HAL设置 DMA 分析 HAL设置 方案设计 代码实现 解码函数 开始发送和复位 发送函数 波形 成品 相关链接 硬件介绍(PCB设计方案) 模 ...

  7. 如何使用STM32F103C8T6驱动WS2812(PWM+DMA)

    一.WS2812概述: WS2812 内部集成了处理芯片和3颗不同颜色的led灯(红,绿,蓝),通过单总线协议分别控制三个灯的亮度强弱,达到全彩的效果. 数据传输时间: T0H 0码,高电平时间 22 ...

  8. GD32F303固件库开发(11)----ADC在DMA模式下扫描多个通道

    GD32F303固件库开发.11----双ADC轮询模式扫描多个通道 概述 视频教学 csdn课程 样品申请 硬件准备 keil配置 使能串口 串口重定向 ADC通道设置 DMA设置 ADC0初始化 ...

  9. GD32F303固件库开发(13)----定时器TIM捕获PWM测量频率与占空比

    GD32F303固件库开发.13----定时器TIM捕获PWM测量频率与占空比 概述 视频教学 csdn课程 样品申请 生成例程 keil配置 使能串口 串口重定向 占空比与频率计算 GPIO初始化 ...

最新文章

  1. 学点基本功:机器学习常用损失函数小结
  2. 可微分的「OpenCV」:这是基于PyTorch的可微计算机视觉库
  3. 和远程ip_漏洞Microsoft Windows TCP/IP 远程执行代码漏洞威胁通告
  4. .NET英文技术文章导读(2017-02-09)
  5. ubuntu 12.04 联想thinkpad e430 安装wifi驱动
  6. halcon基本,vb,vc连接halcon读取图像,视频
  7. 最大素数c语言,for语句计算输出10000以内最大素数怎么搞最简单??各位大神们...
  8. 第1课贝贝的交通指挥系统(《聪明人的游戏:信息学探秘.提高篇-2017-06-C++版》)
  9. ASP.NET 安全性
  10. adodb 连接mysql_PHP中使用ADODB连接MySQL中文乱码
  11. 秒杀项目(1)项目环境搭建
  12. python股票交易系统是如何实现自动交易的?
  13. 虚幻4 - ARPG实战教程(第一季)
  14. java上传图片至阿里云oss服务器
  15. Drozer的安装和使用教程(入门)
  16. 4-17 定义一个长方形类,定义 求周长和面积的方法,然后定义一个测试类,进行测试。
  17. linux操作系统2试题,linux操作系统试题
  18. 大数定理和中心极限定理的通俗理解。
  19. Windows 反消息钩子(1)
  20. 计算机婚纱影楼毕业设计开题报告,毕业设计开题报告 数码照片合成设计

热门文章

  1. PHP的抽象类和抽象方法 abstract
  2. Python中len的使用方法
  3. [FAQ10019]HDMI/MHL如何修改手机默认横竖屏显示方式
  4. 选购笔记本要看清液晶屏幕及主流技术
  5. Nodejs开发微信公众号--获取access_token
  6. Android音乐播放器的比较。
  7. [附源码]Java计算机毕业设计SSM办公自动化系统
  8. vue启动报错98% after emitting CopyPlugin This dependency was not found:
  9. 树莓派云台舵机怎么用_教程 - 由多个舵机控制的云台 - MAKE 趣无尽
  10. 二元关系的复合、集合幂集的包含关系是格的证明、逻辑相等与划分