芯查查logo
  • 物料选型
  • 数据服务
    1. 新产品
    2. 查替代
    3. 丝印反查
    4. 查品牌
    5. PCN/PDN
    6. 查方案
    7. 查代理
    8. 数据合作
  • SaaS/方案
      SaaS产品
    1. 供应链波动监测预警
    2. 半导体产业链地图
    3. BOM管理
    4. 解决方案
    5. 汽车电子
    6. 政府机构
    7. 数据API
  • 商城
  • 行业资讯
    1. 资讯
    2. 直播
  • 论坛社区
    1. 论坛
    2. 学习
    3. 测评中心
    4. 活动中心
    5. 积分商城
  • 查一下
【星允派 NEBULA PI】18:使用PWM驱动RGB灯
原创 发布时间:20:22
版块:
单片机/MCU论坛
简介:简单和大家介绍一下本文章的主要内容:使用STM32F103,使用STM32 cubeMX 6.14版本生成底层的驱动库、结合定时器的PWM 输出功能、使用DMA发送数据的 方式,驱动WS2812 的R

简单和大家介绍一下本文章的主要内容:使用STM32F103,使用STM32 cubeMX 6.14版本生成底层的驱动库、结合定时器的PWM 输出功能、使用DMA发送数据的 方式,驱动WS2812 的RGB三色灯。
一:RGB三色灯的介绍:

   WS2812俗称:三色 RGB 灯,其中 LED 灯珠内部存在一个芯片控制控制芯片,通讯方式采用单线归零码的方法,使用DIN信号线来发送特定的时序数据,控制灯的工作与否,如果额外增加一路信号线,实现双路信号传输,即使存在某个LED灯异常损坏的时候,也不会影响整体显示效果。

二:WS2812b功能特点:

1.5050 灯珠内部集成高质量外控单线级联恒流 IC和优质 RGB LED 芯片,体积小巧,外围简单。The 5050ball 2.内置 IC恒流精度高,内部 RGB 芯片预先分光处理。发光高度一致,白光效果纯正。3.整形转发强化技术,单线数据传输,可无限级联。4.数据传输频率 800Kbps/秒,可实现画面刷新速率 30 幀/秒时,不小于 1024 点。5.输出端口 PWM 控制能够实现 256 级灰度调节,端口扫描频率 1.5KHz/s。6.采用优化预置 12mA/通道恒流模式,低压驱动级联数量最大化。高恒流精度,片内误差<1.5%,片间误差<3%。 7.内置低压强化模块,VDD在 4.5-5.5V 以上 100%正常工作。8.超强数据整形能力:接受完本单元数据自动将后续数据整形输出。

三:驱动方式:

a:LED灯珠主要根据高电平时间判断“0”码和“1”码。高电平时间介于 200ns~410ns,IC判断为“0”码,高电平时间介于 640ns~1000ns,判断为“1”码。 “0”码和“1”码的低电平代表此码结束,准备接收下一数据码。

b:低电平复位时间最小为100us,为了留有余度,一帧数据传输过程中(包括 24bit 和 24bit 之间、bit和 bit 之间)不要中断超过 35us,否则可能会被 IC 认为是RESET。中断时间在 35us之内,控制器可以进行正常数据传输等其他操作。

 

这里我使用的方式是:改变PWM脉宽的大小,即采用不同占空比的方式实现数据的输出。

实现的主要思路如下:

   采用定时器输出不同脉宽的PWM,并且结合DMA技术能够生成数量和占空比可编程控制的脉冲序列,主要利用DMA的自动数据传输功能,不占据CPU的资源,基本上不用担心被其他的任务打断。当定时器使能DMA时,每次计数器达到溢出值后,软件代码自动通过DMA总线获取新的比较值数据。通过动态改变DMA传输的比较值数据,即可实现每个PWM周期占空比的灵活调整。在本次项目中采用预定义数组存储比较值序列,由DMA控制器按需传输数组元素。通过配置数组长度(控制脉冲数量)和元素数值(决定各周期占空比),最终实现脉冲数量和占空比的双重可编程控制。

几个重要和大家分享一下:

工作机制:定时器溢出触发DMA传输,自动更新比较寄存器

动态调节:差异化的DMA传输数据实现占空比动态变化

实现方式:1:比较值序列存储在预定义数组。2:DMA负责数组元素的自动传输

控制难点:1:数组长度决定输出脉冲数量。2:数组元素值决定单个脉冲占空比

四:STM32cube MX 软件配置:

五;软件代码如下所示:

/*ws2812 初始化*/
void ws2812_init(uint8_t led_nums)
{
	level=0;
	breath_R=0;
	breath_G=0;
	breath_B=0;
	uint16_t num_data;
	num_data = 60 + led_nums * 24;
	for(uint8_t i = 0; i < led_nums; i++)
	{
		ws2812_set_RGB(0x00, 0x00, 0x00, i);
	}
	 HAL_TIM_PWM_Start_DMA(&htim1,TIM_CHANNEL_1,(uint32_t *)RGB_buffur,(num_data)); 
}
void ws2812_breath(uint8_t color,uint16_t num,uint16_t change_time)//呼吸灯,分别填入颜色,RGB灯数,每次切换亮度的时间
{	
	if(rgb_breath_time>=change_time)
	{

    level++;
		
		if(level<=breath_level)//渐亮
		{
			switch (color)
			{
				case red:   ws2812_red(breath_R+=breath_change_sum,num) ;break;
				case green: ws2812_green(breath_G+=breath_change_sum,num) ;break;
				case blue:  ws2812_blue(breath_B+=breath_change_sum,num) ;break;
				case yellow:ws2812_yellow(breath_B+=breath_change_sum,num) ;break;
			}
		}
		
		else if(level>breath_level&&level<breath_level*2)//渐灭
		{
			switch (color)
			{
				case red:   ws2812_red(breath_R-=breath_change_sum,num) ;break;
				case green: ws2812_green(breath_G-=breath_change_sum,num) ;break;
				case blue:  ws2812_blue(breath_B-=breath_change_sum,num) ;break;
				case yellow:ws2812_yellow(breath_B-=breath_change_sum,num) ;break;
			}
		}
		
		if(level==breath_level*2)//熄灭
		{
			breath_R=0x00;
			breath_G=0x00;
			breath_B=0x00;
			ws2812_init(80);
		}
		
		if(level==breath_level*2+4)//熄灭一段时间后再重置
		{
			level=0;
		}

		rgb_breath_time=0;
	}  
}

实物图片如下所示:

申请原创奖励
20:22
  • 举报
😁😂😃😄😅😆😉😊😋😌😍😏😒😓😔😖😘😚😜😝😞😠😡😢😣😤😥😨😩😪😫😭😰😱😲😳😵😷😸😹😺😻😼😽😾😿🙀🙅🙆🙇🙈🙉🙊🙋🙌🙍🙎🙏✂✅✈✉✊✋✌✏✒✔✖✨✳✴❄❇❌❎❓❔❕❗❤➕➖➗➡➰🚀🚃🚄🚅🚇🚉🚌🚏🚑🚒🚓🚕🚗🚙🚚🚢🚤🚥🚧🚨🚩🚪🚫🚬🚭🚲🚶🚹🚺🚻🚼🚽🚾🛀Ⓜ🅰🅱🅾🅿🆎🆑🆒🆓🆔🆕
@好友

全部评论

加载中
游客登录通知
已选择 0 人
自定义圈子
移动
发布帖子
发布动态
发布问答
发布者
聪聪哥哥
最新帖子
【星允派 NEBULA PI】18:使用PWM驱动RGB灯【星允派 NEBULA PI】17:使用消息队列创建工程项目【拆解活动】开源恒温加热台拆解分析5A快速充电宝1.0【开源项目】DIY智能手表Monica:极客的腕上科技艺术品
热门版块
查看更多
问型号
问技术
问行情
汽车电子工程师论坛
工业电子专区
新手入门指南
单片机/MCU论坛
PCB设计
开源项目
每日打卡

16

收藏

分享

微信扫码
分享给好友

评论