基于SK6812编码LED实现炫光功能(PWM+DMA功能MCU兼容)
老套路;引言,追源,再讲实际
谈到LED大家一定都不陌生,在玩开发板的时候就点亮过各种颜色的贴片LED了吧,可是当我们同时要用到多个LED的时候,芯片IO不够用了呢?对了,点下我的头像看一下查理复用算法,那如果依然不够用了咋办呢?
新道具出现了-略微昂贵的编码RGB-SK6812
当然可编码的LED不止这颗型号,类似有WS2812B这些型号,但控制原理如出一辙,要问我为啥原理相似,还不是生产厂家为了取代别家涨价的物料而做的咯,回归正题,具体控制原理我们先熟悉一下,如下图;
由图可以得到的信息:
(1)编码是以24bit来完成一个LED的RGB效果,也就是如果需要点亮N个LED,则需要发送N个24bit数据,然后复位一下,就可以实现不同LED亮出不一样颜色的效果了
(2)每个bit的高低电平:cycle(周期)=1.2us,占空比=50%为1,占空比=30%为0
(3)编码LED是单线通信,到这里可以构思的方法出现了三种:1-SPI;2-IO;3-PWM
这里我不详细解说我实际操作时候遇到的问题,以及我是如何排除这些方法的,最后结果我选择了PWM+DMA的方式,原因是该方案既不浪费资源,且移植性强,可操作性强
正文
在MCU的选型中,确认是否具备PWM+DMA功能,如果不具备就可以不继续浪费时间了;
首先配置PWM,这里有一个功能,在我使用的MCU中是具备同时寄存两种PWM波形的,用户需要确认自己使用的MCU是否具备此功能,或者可以同时寄存更多种PWM波形。在初始化时将这两种波形先预存好;
pwm_set_cycle_and_duty(PWM_ID,(uint8_t)(RGB_cycle_set),(uint8_t)(RGB_duty_high_value));
pwm_set_pwm0_shadow_cycle_and_duty(RGB_cycle_rest_set,RGB_duty_rest_low_value);
/*每个MCU配置不同,不需要细纠*/
然后预设好中断
pwm_set_interrupt_enable(PWM_IRQ_PWM0_IR_DMA_FIFO_DONE);irq_set_mask(FLD_IRQ_SW_PWM_EN);
此时不需要打开PWM输出,等到主函数中配置完需要输出的pwm组后再输出;
准备工作还没有结束,我们需要再单独配置一下底层代码处的输出高和输出低电平的驱动函数
/** @description : 设置电平1的pwm* @param - none : 无* @return - none : 无*/
uint16_t hal_set_pwm0_high(void)
{return pwm_config_dma_fifo_waveform(1, PWM0_PULSE_NORMAL, 1);//高脉冲生效,1个PWM0_PULSE_NORMAL帧
}/** @description : 设置电平0的pwm* @param - none : 无* @return - none : 无*/
uint16_t hal_set_pwm0_low(void)
{return pwm_config_dma_fifo_waveform(1, PWM0_PULSE_SHADOW, 1);//高脉冲生效,1个PWM0_PULSE_SHADOW帧
}
(内容根据自己的MCU提供的SDK包进行修改)
然后开始正式的驱动程序:
/** @description : 对DMA进行填充,单一色域的多个rgb亮* @param - len : 要显示的灯数量* @param - *rgb : 要显示的灯的三色参数数组* @return - none : 无*/
void api_SK6812_send_dat_one_in(uint8_t *rgb, uint16_t len)
{uint8_t i;uint8_t memaddr = 2;while (len){for(i=0; i<8; i++) // GREEN data{IR_DMA_Buff[memaddr] = ((rgb[GREEN]<<i) & 0x0080) ? hal_set_pwm0_high():hal_set_pwm0_low();memaddr++;}for(i=0; i<8; i++) // RED{IR_DMA_Buff[memaddr] = ((rgb[RED]<<i) & 0x0080) ? hal_set_pwm0_high():hal_set_pwm0_low();memaddr++;}for(i=0; i<8; i++) // BLUE{IR_DMA_Buff[memaddr] = ((rgb[BLUE]<<i) & 0x0080) ? hal_set_pwm0_high():hal_set_pwm0_low();memaddr++;}}uint32_t length = memaddr*2 - 4;uint16_t *buff ;buff=IR_DMA_Buff;buff[0]= length&0xff;buff[1]= (length>>16)&0xff;SK6812_Show();
}
这是一个单一颜色的多个LED驱动的代码,简而言之就是使用逻辑将我们的数组数据填充到DMA数组中,然后驱动DMA,后面的功能也是如此,然后在外围通过改变数组的内容,实现各种想要的任务,例如呼吸,渐变色,炫光
思想就是这样的一个思想,实现任务还是建议各位自己动手尝试,如果实在不想,可以去我的文章的代码库里拿取
基于SK6812编码LED实现炫光功能(PWM+DMA功能MCU兼容)相关推荐
- 基于三星 ARM Cortex-A9 Exynos4412处理器的底层实验(led跑马灯、pwm蜂鸣器)
Exynos 4412简介: Exynos 4412又称为Exynos 4 Quad,Exynos 4412采用了三星32nm HKMG工艺,是三星的第一款四核处理器. [1]led灯试验 1.查看原 ...
- 基于机智云物联网平台的空气质量多功能检测系统设计
摘要: 目前市面上的空气质量检测仪通常只能检测少数几种气体,面对空气中多种有害气体,就要使用不同的检测仪器.针对现有检测系统功能不全等问题,开发了由STM32单片机.各类传感器.LCD显示屏和WiFi ...
- 基于单片机的LED照明系统的设计
本设计是基于单片机的LED照明系统的设计,主要实现以下功能: 可实现LCD1602显示光照强度,灯的状态: 可实现通过按键控制LED的开关: 可实现通过光照强度控制灯光的亮度: 可实现通过人体红外控制 ...
- 基于单片机的LED自适应调光系统的设计与实现 - 调光电路图
电路图简介: 本文主要介绍了基于单片机的LED自适应调光系统的设计与实现.LED自适应调光系统是一种典型的绿色照明方式,与传统照明相比,具有智能.节能.环保.寿命长.安全可靠等这些优点,这是代表着照明 ...
- 基于FPGA的LED点阵系统开发
LED点阵显示屏被用到很多领域,随着电子技术的发展,LED点阵书写显示屏的广泛应用是一种趋势.传统的LED点阵显示是由微处理器实现的,但是以FPGA做控制器将成为发展趋势.FPGA的结构灵活,其逻辑单 ...
- 智能宠物喂食器语音芯片应用设计方案(基于唯创语音芯片WT588E02-8S(C001)功能拓展)
智能宠物喂食器语音芯片应用设计方案(基于唯创语音芯片WT588E02-8S(C001)功能拓展) 概述 本文主要通过使用唯创知音语音芯片扩展目录进行选型微定制,达到节省成本快速选型开发目的的应用介绍. ...
- 【基于 STM32CubeMX + PWM + DMA驱动SW2812b全彩RGB灯】
基于 STM32CubeMX + PWM + DMA驱动SW2812b全彩RGB灯 STM32CubeMX配置: 工程源码: END 以上就是相关配置,最需要注意的就是时钟以及pre数值以及芯片时钟频 ...
- 基于ArduinoNano的LED点阵时钟探索(1)四合一MAX7219+DS3231
基于ArduinoNano的LED点阵时钟探索(1)四合一MAX7219+DS3231 这篇文章是自己打算做一个LED点阵时钟记录学习进度的,刚完成第一次点亮MAX7219四合一模块,所以先做好学习记 ...
- 【共阳极高辉度无频闪调光IC方案FP7125】耐压100V10A LED降压恒流PWM调光芯片 汽车大灯车灯照明/调光电源应用
方案名称: [共阳极高辉度无频闪调光IC方案FP7125]耐压100V10A LED降压恒流PWM调光芯片 汽车大灯车灯调光电源应用 方案品牌: 远翔FEELING(雅欣-大陆总代理商) 芯片图片 方 ...
- 不写一行代码(一):实现安卓基于GPIO的LED设备驱动
文章目录 系列文章 一.前言 二.准备工作 2.1 内核版本 2.2 内核文档:bindings->leds 2.3 文档解析: leds-gpio.txt 三.编写DTS 3.1 查原理图,挑 ...
最新文章
- 鸿蒙投屏和普通投屏,华为智慧屏SE发布:预装鸿蒙 可一碰投屏
- 【渗透技术】一个渗透测试工具人是怎样操作的
- 简单明了区分escape、encodeURI和encodeURIComponent
- 一个透明的shader
- 信息学奥赛一本通(1152:最大数max(x,y,z))
- 2.Hadoop HDFS 安装配置
- 论文翻译:U-Net: Convolutional Networks for Biomedical Image Segmentation
- Jar运行的几个方法
- [Python] np.nonzero(ndarray) 返回数组中不为0的元素的索引
- android局域网怎么传文件,两手机同一局域网怎么传文件
- 基本图像分类与目标检测网络要点总结
- Solidworks如何导入和使用模板文件
- react Hook useEffect()
- 字节跳动+京东+美团+腾讯面试总结,附赠课程+题库
- TCPIP详解Protocol 读书笔记(八) Traceroute程序
- 大小写字母表(大小写字母表)
- Elasticsearch:理解 Master,Elections,Quorum 及 脑裂
- android 清华镜像,清华镜像网站下载android源码并编译
- python 用爬虫写网页测试
- 亚马逊运营必备实用工具