(STM32笔记5)ws2812驱动开发

这篇具有很好参考价值的文章主要介绍了(STM32笔记5)ws2812驱动开发。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

ws2812

需要开发的外设:ws2812

开发环境:MDK

开发板:stm32最小系统板

杜邦线无数

一、原理阐述

(一)这个ws2812有很多种,一个小灯、灯带,矩形像素屏等等。

ws2812驱动程序详解,stm32,stm32,单片机,arm,linuxws2812驱动程序详解,stm32,stm32,单片机,arm,linuxws2812驱动程序详解,stm32,stm32,单片机,arm,linux

这些都是DIN连接输入,DOUT连接输出,另外两个引脚是GNE和VCC

ws2812驱动程序详解,stm32,stm32,单片机,arm,linux

 

(二)数据传输原理:

第1个WS2812B灯珠接收到了第1个24bit的数据,做出响应(发光);

第N个WS2812B灯珠接收到了第N个24bit的数据,
再收到第二个24bit的数据后,直接转发给第二个WS2812B灯珠,由第二个WS2812B灯珠做出响应;依次类推。

ws2812驱动程序详解,stm32,stm32,单片机,arm,linux

每次给一个灯一个24位的数据,顺序是GRB-green red bule

ws2812驱动程序详解,stm32,stm32,单片机,arm,linux

(三)数据编码

编码时序是低高电平占位大小来区分的,分别是高比低比例位    1/2-->0 code

                                                                                                      2/1-->1 code

ws2812驱动程序详解,stm32,stm32,单片机,arm,linux

 ws2812驱动程序详解,stm32,stm32,单片机,arm,linux

 (四)定时器配置

根据WS2812的最大传输速率800kbps,设置定时器不分频和计数周期为89+1,这样下来波形的频率为  72M /(89+1) = 800K  ,并且一个波形的周期为  1 / 800 = 1.25us

我用的最大是72M,不同板子不同配置,自行选择。

二、代码展示

 main.h

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "ws2812b.h"
uint8_t rgb0[][3] = {0,0,0};
uint8_t rgb1[212][3] = {{0,0,0},{10,0,0},{20,0,0},{30,0,0},{40,0,0},{50,0,0},{60,0,0},{70,0,0},{80,0,0},{90,0,0},
											 {100,0,0},{110,0,0},{120,0,0},{130,0,0},{140,0,0},{150,0,0},{160,0,0},{170,0,0},{180,0,0},{190,0,0},
										   {200,0,0},{210,0,0},{220,0,0},{230,0,0},{240,0,0},{250,0,0},{10,10,0},{20,20,0},{30,30,0},
											 {40,40,0},{50,50,0},{60,60,0},{70,70,0},{80,80,0},{90,90,0},{100,100,0},{110,110,0},{120,120,0},{130,130,0},{140,140,0},
											 {150,150,0},{160,160,0},{170,170,0},{180,180,0},{190,190,0},{200,200,0},{210,210,0},{220,220,0},{230,230,0},{240,240,0},
											 {250,250,0},{10,0,10},{20,0,20},{30,0,30},{40,0,40},{50,0,50},{60,0,60},{70,0,70},{80,0,80},{90,0,90},{100,0,100},{110,0,110},{120,0,120},
											 {130,0,130},{140,0,140},{150,0,150},{160,0,160},{170,0,170},{180,0,180},{190,0,190},{200,0,200},{210,0,210},{220,0,220},
											 {230,0,230},{240,0,240},{250,0,250},{0,10,10},{0,20,20},{0,30,30},{0,40,40},{0,50,50},{0,60,60},{0,70,70},
											 {0,80,80},{0,90,90},{0,100,100},{0,110,110},{0,120,120},{0,130,130},{0,140,140},{0,150,150},{0,160,160},{0,170,170},
											 {0,180,180},{0,190,190},{0,200,200},{0,210,210},{0,220,220},{0,230,230},{0,240,240},{0,250,250},{10,10,10},{30,30,30},
											 {90,90,90},{140,140,140},{200,200,200},{0,0,0},{10,0,0},{20,0,0},{30,0,0},{40,0,0},{50,0,0},{60,0,0},{70,0,0},{80,0,0},{90,0,0},
											 {100,0,0},{110,0,0},{120,0,0},{130,0,0},{140,0,0},{150,0,0},{160,0,0},{170,0,0},{180,0,0},{190,0,0},
										   {200,0,0},{210,0,0},{220,0,0},{230,0,0},{240,0,0},{250,0,0},{10,10,0},{20,20,0},{30,30,0},
											 {40,40,0},{50,50,0},{60,60,0},{70,70,0},{80,80,0},{90,90,0},{100,100,0},{110,110,0},{120,120,0},{130,130,0},{140,140,0},
											 {150,150,0},{160,160,0},{170,170,0},{180,180,0},{190,190,0},{200,200,0},{210,210,0},{220,220,0},{230,230,0},{240,240,0},
											 {250,250,0},{10,0,10},{20,0,20},{30,0,30},{40,0,40},{50,0,50},{60,0,60},{70,0,70},{80,0,80},{90,0,90},{100,0,100},{110,0,110},{120,0,120},
											 {130,0,130},{140,0,140},{150,0,150},{160,0,160},{170,0,170},{180,0,180},{190,0,190},{200,0,200},{210,0,210},{220,0,220},
											 {230,0,230},{240,0,240},{250,0,250},{0,10,10},{0,20,20},{0,30,30},{0,40,40},{0,50,50},{0,60,60},{0,70,70},
											 {0,80,80},{0,90,90},{0,100,100},{0,110,110},{0,120,120},{0,130,130},{0,140,140},{0,150,150},{0,160,160},{0,170,170},
											 {0,180,180},{0,190,190},{0,200,200},{0,210,210},{0,220,220},{0,230,230},{0,240,240},{0,250,250},{10,10,10},{30,30,30},
											 {90,90,90},{140,140,140},{200,200,200}};
uint8_t rgb2[109][3] = {{0,0,0},{0,5,0},{0,10,0},{0,15,0},{0,20,0},{0,25,0},{0,30,0},{0,35,0},{0,40,0},{0,45,0},{0,50,0},{0,55,0},{0,60,0},{0,65,0},{0,70,0},{0,75,0},{0,80,0},{0,85,0},{0,90,0},
											 {0,95,0},{0,100,0},{0,105,0},{0,110,0},{0,115,0},{0,120,0},{0,125,0},{0,130,0},{0,135,0},{0,140,0},{0,145,0},{0,150,0},{0,155,0},{0,160,0},{0,165,0},{0,170,0},{0,175,0},{0,180,0},{0,185,0},{0,190,0},
											 {0,195,0},{0,200,0},{0,205,0},{0,210,0},{0,215,0},{0,220,0},{0,225,0},{0,230,0},{0,235,0},{0,240,0},{0,245,0},{0,250,0},{0,255,0},{0,250,0},{0,245,0},{0,240,0},{0,235,0},{0,230,0},
											 {0,225,0},{0,220,0},{0,215,0},{0,210,0},{0,205,0},{0,200,0},{0,195,0},{0,190,0},{0,185,0},{0,180,0},{0,175,0},{0,170,0},{0,165,0},{0,160,0},{0,155,0},{0,150,0},{0,145,0},{0,140,0},{0,135,0},{0,130,0},
											 {0,125,0},{0,120,0},{0,115,0},{0,110,0},{0,105,0},{0,100,0},{0,95,0},{0,90,0},{0,85,0},{0,80,0},{0,75,0},{0,70,0},{0,65,0},{0,60,0},{0,55,0},{0,50,0},{0,45,0},{0,40,0},{0,35,0},{0,30,0},
											 {0,25,0},{0,20,0},{0,15,0},{0,10,0},{0,5,0},{0,0,0}};
uint8_t rgb3[53][3] = {{0,0,0},{0,0,10},{0,0,20},{0,0,30},{0,0,40},{0,0,50},{0,0,60},{0,0,70},{0,0,80},{0,0,90},
											 {0,0,100},{0,0,110},{0,0,120},{0,0,130},{0,0,140},{0,0,150},{0,0,160},{0,0,170},{0,0,180},{0,0,190},
											 {0,0,200},{0,0,210},{0,0,220},{0,0,230},{0,0,240},{0,0,250},{0,0,255},{0,0,250},{0,0,240},{0,0,230},
											 {0,0,220},{0,0,210},{0,0,200},{0,0,190},{0,0,180},{0,0,170},{0,0,160},{0,0,150},{0,0,140},{0,0,130},
											 {0,0,120},{0,0,110},{0,0,100},{0,0,90},{0,0,80},{0,0,70},{0,0,60},{0,0,50},{0,0,40},{0,0,30},
											 {0,0,20},{0,0,10},{0,0,0}};
uint8_t rgb5[200][3] = {{0,0,0},{100,0,0},
											 {100,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,100,0},{0,100,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,100},{0,0,100},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{10,100,0},{10,100,0},
											 {0,0,0},{0,0,0},{0,0,0},{0,0,0},{10,0,100},{10,0,100},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,10,100},{0,10,100},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{100,0,10},{100,0,10},{0,0,0},{0,0,0},{0,0,0},{0,0,0},
											 {0,0,100},{0,0,100},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,100,0},{0,100,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{100,0,0},{100,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{100,0,100},{0,100,100},
											 {0,0,0},{0,0,0},{0,0,0},{0,0,0},{100,0,100},{100,100,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{90,0,100},{0,100,0}};


											 
uint8_t rgb4[53][3] = {{0,0,0},{10,0,0},{20,0,0},{30,0,0},{40,0,0},{50,0,0},{60,0,0},{70,0,0},{80,0,0},{90,0,0},
											 {100,0,0},{110,0,0},{120,0,0},{130,0,0},{140,0,0},{150,0,0},{160,0,0},{170,0,0},{180,0,0},{190,0,0},
											 {200,0,0},{210,0,0},{220,0,0},{230,0,0},{240,0,0},{250,0,0},{255,0,0},{250,0,0},{240,0,0},{230,0,0},
											 {220,0,0},{210,0,0},{200,0,0},{190,0,0},{180,0,0},{170,0,0},{160,0,0},{150,0,0},{140,0,0},{130,0,0},
											 {120,0,0},{110,0,0},{100,0,0},{90,0,0},{80,0,0},{70,0,0},{60,0,0},{50,0,0},{40,0,0},{30,0,0},{20,0,0},{10,0,0},{0,0,0}};

//每个三位数,每一个位位一个不同颜色,数字大小表明亮度大小,最大256,通过将这个三个灯亮不同种类、大小程度进行调制不同量的颜色
u16 i,j;

 int main(void)
 {	

	delay_init();	      
	LED_Init();		  	
  Timer2_init();
	 
	while(1)
	{
		
		

		for(i=0;i<110;i++)
		{
			WS2812_send(&rgb2[i],50,0);
			delay_ms(50);
		}
		for(i=0;i<77;i++)
		{
		  WS2812_send(&rgb5[i],50,0);
			delay_ms(50);
		}	
		for(i=0;i<212;i++)
		{
			WS2812_send(&rgb1[i],50,1);
			delay_ms(50);
		} 
	}
 }



 每个三位数,每一个位位一个不同颜色,数字大小表明亮度大小,最大256,通过将这个三个灯亮不同种类、大小程度进行调制不同量的颜色

 

ws2812.c

#include "WS2812B.h"

#define TIM2_CCR1_Address 0x40000034
	
#define TIMING_ONE  50
#define TIMING_ZERO 25
 uint16_t LED_BYTE_Buffer[300];
void WS2812_send(uint8_t (*color)[3], uint16_t len,u8 flag)
{
	static unsigned char iie = 0;
	uint8_t i;
	uint16_t memaddr;
	uint16_t buffersize;
	buffersize = (len*24);
	memaddr = 0;				

	while (len)
	{	
		for(i=0; i<8; i++) // G
		{
			LED_BYTE_Buffer[memaddr] = ((color[iie][1]<<i) & 0x0080) ? TIMING_ONE:TIMING_ZERO;
			memaddr++;
		}
		for(i=0; i<8; i++) // r
		{
				LED_BYTE_Buffer[memaddr] = ((color[iie][0]<<i) & 0x0080) ? TIMING_ONE:TIMING_ZERO;
				memaddr++;
		}
		for(i=0; i<8; i++) // B
		{
				LED_BYTE_Buffer[memaddr] = ((color[iie][2]<<i) & 0x0080) ? TIMING_ONE:TIMING_ZERO;
				memaddr++;
		}
		if(flag==1)
		{
		if(iie>=12)
			iie = 0;
			iie++;
			
		}
		len--;
	}

 

 ws2812.h

#ifndef __WS2812B_H
#define	__WS2812B_H

#include "stm32f10x.h"
#include "delay.h"	

void Timer2_init(void);
void WS2812_send(uint8_t (*color)[3], uint16_t len,u8 flag);

#endif 

BUG:

如果使用象素萍的话我们只能成功使用50个,然后使用单一装置和小灯带可以成功,这个目前没有解决。

完整工程代码:

(35条消息) 外设ws2812使用32驱动-单片机文档类资源-CSDN文库https://download.csdn.net/download/weixin_52451652/86399407?spm=1001.2014.3001.5503文章来源地址https://www.toymoban.com/news/detail-805621.html

到了这里,关于(STM32笔记5)ws2812驱动开发的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32+PWM+DMA驱动WS2812彩灯模块(附源码)

    WS2812是一颗数字LED灯珠,采用单总线通讯,每颗灯珠支持24bit的颜色控制,也即RGB888,信号线通过DIN输入,经过一颗灯珠之后,信号线上前24bit数据会被该灯珠锁存,之后将剩下的数据信号整形之后通过DOUT输出 C1为VDD的滤波电容,一般大小为100NF。 WS2812.c pwm.c DMA.c main.c 需要源

    2024年02月15日
    浏览(16)
  • 使用STM32F103的SPI+DMA驱动ws2812 LED

    目录 前言 一、WS2812协议 1.1 数据传输编码方式:  1.2 传输的数据结构 二、驱动方式:SPI+DMA 2.1 原理介绍 2.2 SPI+DMA操作  2.3 编写代码 2.4 使用 三 总结 参考文章 主要使用的STM32F103C8T6芯片的SPI+DMA方式实现WS2812的驱动协议,总体可以看作是使用SPI来实现一种通信协议来发送信号。

    2024年02月09日
    浏览(32)
  • 电子模块|外控集成 LED 光源 WS2812模块---硬件介绍和stm32驱动

    WS2812是一个集控制电路与发光电路于一体的智能外控LED光源。其外型与一个5050LED灯珠相同,每个元件即为一个像素点。像素点内部包含了智能数字接口数据锁存信号整形放大驱动电路,还包含有高精度的内部振荡器和12V高压可编程定电流控制部分,有效保证了像素点光的颜色

    2024年02月10日
    浏览(20)
  • STM32+PWM+DMA驱动WS2812彩灯模块(评论点赞给源代码)

    WS2812是一颗数字LED灯珠,采用单总线通讯,每颗灯珠支持24bit的颜色控制,也即RGB888,信号线通过DIN输入,经过一颗灯珠之后,信号线上前24bit数据会被该灯珠锁存,之后将剩下的数据信号整形之后通过DOUT输出 C1为VDD的滤波电容,一般大小为100NF。 WS2812.c pwm.c DMA.c main.c 需要源

    2024年04月23日
    浏览(15)
  • STM32G0 定时器PWM DMA输出驱动WS2812配置 LL库

    优点:不消耗CPU资源 缺点:占用内存较大 定时器配置 定时器通道:TIM3 CH2 分频:0 重装值:79,芯片主频64Mhz,因此PWM输出频率:64Mhz/79 ≈ 800Khz,满足芯片要求。 auto-reload preload 要关闭 output compare preload 要打开 DMA配置 外设一定要选择TIM3_UP,不要选TIM_CHx 方向是内存到外设,

    2024年02月10日
    浏览(19)
  • STM32 HAL库 PWM+DMA 驱动WS2812B彩灯(STM32F030F4P6)

    博主使用STM32驱动WS2812B主要参考了这位佬的文章,因为需求问题,采用了Cortex-M0的stm32f030f4p6(16k的flash,4k的sram)来驱动,原文中写的是stm32f103c8t6,个人认为其实区别并不是很大,需要修改部分参数即可移植(cv战士申请出战)。 上图是我的一圈灯,一共8个,第一个LED的数

    2024年02月06日
    浏览(34)
  • STM32系列(HAL库)——F103C8T6驱动WS2812全彩RGB模块(PWM+DMA方式)

    (1)编程平台:Keil5 (2)CubeMX (1)某宝买的RGB模块(4个灯珠级联) (2)F1的板子,本例使用经典F103C8T6 (3)ST-link 下载器 (4)杜邦线若干 (1)模块简介: 没什么比手册讲得更加清楚了,模块中文数据手册:ws2812b中文资料_数据手册_参数 (2)驱动原理:          以上这是数据手册中提到

    2023年04月11日
    浏览(19)
  • WS2812B彩灯 STM32HAL库开发:PWM+DMA(stm32f103c8t6)

    目录 一、摘要 二、WS2812B介绍 三、CUBEMX配置 四、程序介绍(KEIL编译器) 五、数据手册         1、本文使用示例单片机型号为 stm32f103c8t6 ,RGB型号为 WS2812B ;          2、主要实现功能是实现用 PWM+DMA 使RGB_LED亮起不同颜色的灯光;         3、目的:简单调通该型号

    2024年02月03日
    浏览(19)
  • 基于stm32作品设计:多功能氛围灯、手机APP无线控制ws2812,MCU无线升级程序

    作品哔哩哔哩视频:https://www.bilibili.com/video/BV1Yb4y1a7AQ#reply5536921990 资料链接: 蓝牙彩灯v1.01资料链接: CSDN: https://download.csdn.net/download/mbs520/25149435 百度网盘: https://pan.baidu.com/s/14Vout7Q2P6JBDZCCd8Gm6w 提取码:b7it 蓝牙彩灯v1.03资料链接: https://download.csdn.net/download/mbs520/25150035 取

    2024年02月09日
    浏览(17)
  • 普冉PY32系列(十三) SPI驱动WS2812全彩LED

    普冉PY32系列(一) PY32F0系列32位Cortex M0+ MCU简介 普冉PY32系列(二) Ubuntu GCC Toolchain和VSCode开发环境 普冉PY32系列(三) PY32F002A资源实测 - 这个型号不简单 普冉PY32系列(四) PY32F002A/003/030的时钟设置 普冉PY32系列(五) 使用JLink RTT代替串口输出日志 普冉PY32系列(六) 通过I2C接口驱动PCF8574扩

    2024年02月05日
    浏览(22)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包