STM32驱动WS2812D全彩LED

最新更新时间:2019-01-09来源: eefocus关键字:STM32  驱动WS2812D  全彩LED 手机看文章 扫描二维码
随时随地手机看文章

1.简介

一个集控制电路与发光电路于一体的智能外控 LED 光源。 其外型与一个 SMD5050 侧发光 LED 灯珠相同, 每个元件即为一个像素点。 像素点内部包含了智能数字接口数据锁存信号整形放大驱动电路, 电源稳压电路, 内置恒流电路, 高精度 RC 振荡器, 输出驱动采用 PWM 技术, 有效保证了像素点内光的颜色高一致性。


● IC控制电路与LED点光源共用一个电源。


● 控制电路与RGB芯片集成在一个5mm直径的圆头四脚直插封装的灯珠中, 构成一个完整的外控像素点。


● 内置信号整形电路, 任何一个像素点收到信号后经过波形整形再输出, 保证线路波形畸变不会累加。


● 内置上电复位和掉电复位电路。


● 每个像素点的三基色颜色可实现256级亮度显示, 完成16777216种颜色的全真色彩显示。


● 扫描频率 2kHz/s。


● 串行级联接口, 能通过一根信号线完成数据的接收与解码。


● 任意两点传传输距离在不超过 2 米时无需增加任何电路。


● 当刷新速率 30 帧/秒时, 级联数不小于 2048 点。


● 数据发送速度可达 800Kbps


2.通讯协议


数据协议采用单线归零码的通讯方式, 像素点在上电复位以后, DIN端接受从控制器传输过来的数据, 首先送过来的24bit数据被第一个像素点提取后, 送到像素点内部的数据锁存器, 剩余的数据经过内部整形处理电路整形放大后通过DO端口开始转发输出给下一个级联的像素点, 每经过一个像素点的传输, 信号减少24bit。 像素点采用自动整形转发技术, 使得该像素点的级联个数不受信号传送的限制, 仅仅受限信号传输速度要求。


这里写图片描述


2.1 数据传输


这里写图片描述


对于 ns 延时,这里采用__nop() 实现,用 KEIL 调试了一下,发现几处的__nop()的延时不太一样,对于 72M主频,最小延时应该是:1/72000000=13.9ns,查询了一些资料,比较精确的延时还是得用示波器看一看。


2.2 24bit 数据结构


这里写图片描述


2.3 电路连接


这里写图片描述

图出处:天际智联STM32F103开源四轴


3.软件实现

头文件:


#define     RGB_LED     GPIO_Pin_9

#define     RGB_LED_HIGH    (GPIO_SetBits(GPIOB,RGB_LED))

#define     RGB_LED_LOW     (GPIO_ResetBits(GPIOB,RGB_LED))


void RGB_LED_Init(void)

{

    GPIO_InitTypeDef  GPIO_InitStructure;


    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);    

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;                

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;         

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;       

    GPIO_Init(GPIOB, &GPIO_InitStructure);                  

    GPIO_SetBits(GPIOB,GPIO_Pin_9);                      

}


/********************************************************/

//

/********************************************************/

void RGB_LED_Write0(void)

{

    RGB_LED_HIGH;

    __nop();__nop();__nop();__nop();__nop();__nop();

    RGB_LED_LOW;

    __nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();

    __nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();

    __nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();

    __nop();__nop();

}


/********************************************************/

//

/********************************************************/


void RGB_LED_Write1(void)

{

    RGB_LED_HIGH;

    __nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();

    __nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();

    __nop();__nop();

    RGB_LED_LOW;

    __nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();

    __nop();__nop();

}


void RGB_LED_Reset(void)

{

    RGB_LED_LOW;

    delay_us(80);

}


void RGB_LED_Write_Byte(uint8_t byte)

{

    uint8_t i;


    for(i=0;i<8;i++)

        {

            if(byte&0x80)

                {

                    RGB_LED_Write1();

            }

            else

                {

                    RGB_LED_Write0();

            }

        byte <<= 1;

    }

}


void RGB_LED_Write_24Bits(uint8_t green,uint8_t red,uint8_t blue)

{

    RGB_LED_Write_Byte(green);

    RGB_LED_Write_Byte(red);

    RGB_LED_Write_Byte(blue);

}



//亮灯颜色设定,其他颜色以此类推

void RGB_LED_Red(void)

{

     uint8_t i;

    //4个LED全彩灯

    for(i=0;i<4;i++)

        {

            RGB_LED_Write_24Bits(0, 0xff, 0);

    }

}


void RGB_LED_Green(void)

{

    uint8_t i;


    for(i=0;i<4;i++)

        {

            RGB_LED_Write_24Bits(0xff, 0, 0);

    }

}


void RGB_LED_Blue(void)

{

    uint8_t i;


    for(i=0;i<4;i++)

        {

            RGB_LED_Write_24Bits(0, 0, 0xff);

    }

}


关键字:STM32  驱动WS2812D  全彩LED 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/2019/ic-news010942849.html

上一篇:STM32驱动MPU6050(二)——软件实现
下一篇:STM32学习笔记一一SysTick

推荐阅读

STM32 SPI硬件模式
反复试验,发现SPI_NSS引脚的自动硬件控制与想象的不同,无论是否外加上拉,只要一使能SPI,SPI_Cmd(SPI1, ENABLE); SPI_NSS引脚就一直处于低电平,直到SPI_Cmd(SPI1, DISABLE);这个需要用程序来控制。  而用过其他芯片则是发送完成自动会拉高,这点是要注意的我说的就是做主机的时候SPI_SSOutputCmd(SPIx,ENABLE) 在soft模式时这句话有必要吗?我的理解是当hard模式,需要multimaster的时候,才应该要开启这个output功能,这点从我的截图上可以看出。我觉得,这里只要把SPI_InitStructure
发表于 2022-02-21
<font color='red'>STM32</font> SPI硬件模式
STM32 timer input filter
STM32的定时器输入通道都有一个滤波单元,分别位于每个输入通路上(下图中的黄色框)和外部触发输入通路上(下图中的兰色框),它们的作用是滤除输入信号上的高频干扰。具体操作原理如下:在TIMx_CR1中的CKD[1:0]可以由用户设置对输入信号的采样频率基准,有三种选择:1)采样频率基准fDTS=定时器输入频率fCK_INT2)采样频率基准fDTS=定时器输入频率fCK_INT/23)采样频率基准fDTS=定时器输入频率fCK_INT/4然后使用上述频率作为基准对输入信号进行采样,当连续采样到N次个有效电平时,认为一次有效的输入电平。实际的采样频率和采样次数可以由用户程序根据需要选择;外部触发输入通道的滤波参数在从模式控制寄存器(TI
发表于 2022-02-21
<font color='red'>STM32</font> timer input filter
关于STM32影子寄存器和预装载寄存器和TIM_ARRPreloadConfig
本文的说明依据STM32参考手册(RM0008)第10版:英文:http://www.st.com/stonline/products/literature/rm/13902.pdf中译文:http://www.stmicroelectronics.com.cn/stonline/mcu/images/STM32_RM_CH_V10_1.pdf在STM32参考手册的第13、14章中,都有一张定时器的框图,下面是第14章中定时器框图的局部,图中黄色框所示的是auto-reload register,在下面的第14.3.2节"Counter Modes"就解释了auto-reload register的用法。在图中可
发表于 2022-02-21
关于<font color='red'>STM32</font>影子寄存器和预装载寄存器和TIM_ARRPreloadConfig
stm32 Fdts
发表于 2022-02-21
<font color='red'>stm32</font> Fdts
STM32定时器输出比较模式
OCx与OCxREF和CCxP之间的关系初学STM32,我这个地方卡了很久,现在终于有些明白了,现在把我的理解写下与大家共享,如果有不对的地方,还请指出。-----------------------------------------------------------------------------------------------------------------------TIM_OCMode选择定时器模式。该参数取值见下表:TIM_OCInitStructure.TIM_Pulse = CCR1_Val; //设置跳变值,当计数器计数到这个值时,电平发生跳变TIM_OC2PreloadConfig(TIM3, TI
发表于 2022-02-18
<font color='red'>STM32</font>定时器输出比较模式
stm32库函数学习篇
两天学习了一下stm32通用定时器的输入捕获功能。在网上看到很多网友说触发中断程序进不了,于是自己也测试了个小程序,还好能够进入中断。呵呵~ 实现功能:PA8随意延时驱动led灯闪烁,并且将PA8用杜邦线连接到PA7口,PA7是通用定时器TIM3的2通道,在TIM3_CH2触发中断程序中取反连接到PD2口的led灯,指示中断程序运行,并且每次进入中断后改变触发捕获的极性。实现两个led灯会交替闪烁。 先有必要了解stm32定时器的输入触发模块,如下图:需要注意的是,一眼望去一个定时器似乎有8个通道,左边四个,右边四个,但其实左边和右边是共用相同的IO引脚,所以名称标注是一模一样。也就是说,每个通用定时器都只有四个
发表于 2022-02-18
<font color='red'>stm32</font>库函数学习篇
小广播
实战 培训 开发板 精华推荐

何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2022 EEWORLD.com.cn, Inc. All rights reserved