0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于STM32G070RB的七彩星空灯教程

airX嵌入式 来源:airX嵌入式 作者:airX嵌入式 2022-11-17 11:07 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群


今天我们用STM32G070RB NUCLEO开发板 和WS2812灯带制作一个七彩星空灯。

工作原理

1,上电时,WS2812数据IO为低电平保持。

2,空闲时,IO为低电平。

3,数据发送完毕后,保持电平,超过规格书上定义的RESET时间(只有低电平时间超过280us,就可以认为是RESET.)

先看下数据的时序

9812e0f2-6622-11ed-8abf-dac502259ad0.png

如下是每24bit的组成。注意,顺序不是RGB888,而是GRB888。一般我们取颜色的数值,都是RGB顺序,所以这里在代码里实现的时候,会需要做一下移位。另外,需要注意的是,需要高位先发(MSB)。

982f4490-6622-11ed-8abf-dac502259ad0.png

时序波形图。关键在于用什么方法去表示Bit的波形,网络上的方法有很多。例如PWM,也有用SPI。今天我们就先用一种简单方法实行吧,IO口模拟是不错的选择。

9846258e-6622-11ed-8abf-dac502259ad0.png

《新建工程》

1、万事从新建工程开始,打开STM32CubeMX

986a0ca6-6622-11ed-8abf-dac502259ad0.png


2、在搜索框内搜索 我们的开发板型号,也就是STM32G070RB,好的这样工程就新建好的,

9896d09c-6622-11ed-8abf-dac502259ad0.png


3、配置时钟树,如下图所示。

98c6ee9e-6622-11ed-8abf-dac502259ad0.png


4、接下来配置引脚 ,这里我们采用的是PWM+DMA的方式来驱动WS2812,通过WS2812的手册可以得知驱动需要800KHZ的频率好的我们现在来配置定时器,这里以定时器1为例来配置。如下图所示。计算方法79=(64M/800K)-1得出。下面的Pulse是指一个周期的脉冲数

98ebcfde-6622-11ed-8abf-dac502259ad0.png

5、下面我们开始配置DMA,如下图所示配置

99134fe6-6622-11ed-8abf-dac502259ad0.png


6、好的到这里就可以生成代码

993a6374-6622-11ed-8abf-dac502259ad0.png

好的到这里我们就已经把我们需要用到的资源初始化完成了

《开始写代码》

1、打开我们上次教程生成的代码;我们打开工程,将一下代码复制到下图所在位置

#define ONE_PULSE        (59)                           //1 码计数个数
#define ZERO_PULSE       (29)                           //0 码计数个数
#define RESET_PULSE       (80)                          //80 复位电平个数(不能低于40)
#define LED_NUMS         (12)                            //led 个数
#define LED_DATA_LEN     (24)                           //led 长度,单个需要24个字节
#define WS2812_DATA_LEN  (LED_NUMS*LED_DATA_LEN)        //ws2812灯条需要的数组长度
uint16_t static RGB_buffur[RESET_PULSE + WS2812_DATA_LEN] = { 0 };

99660524-6622-11ed-8abf-dac502259ad0.png


2、接下来就是DMA传输完成回调函数(根据你使用的定时器配置),以下函数都复制到main.c 的/* USER CODE BEGIN 4 */代码区

void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim)
{
   HAL_TIM_PWM_Stop_DMA(&htim1,TIM_CHANNEL_1);
}

3、下面就是今天的最后一步WS2812的驱动函数了,以下函数的作用是根据WS2812的数量将灯的GRB颜色数据写到需要DMA传送的数组中

void WS281x_SetPixelColor(uint16_t n, uint32_t GRBColor)
{
   uint8_t i;
   if (n < LED_NUMS)
   {
      for (i = 0; i < 24; ++i)
      RGB_buffur[24 * n + i] = (((GRBColor << i) & 0X800000) ? ONE_PULSE : ZERO_PULSE);
   }
}

4、将三个颜色的数据合并成GRB数据

uint32_t WS281x_Color(uint8_t red, uint8_t green, uint8_t blue)
{
   return green << 16 | red << 8 | blue;
}

5、这是一个简单的颜色渐变算法 ,感兴趣的可以研究研究

uint32_t Wheel(uint8_t WheelPos)
{
   WheelPos = 255 - WheelPos;
   if (WheelPos < 85)
   {
      return WS281x_Color(255 - WheelPos * 3, 0, WheelPos * 3);
   }
   if (WheelPos < 170)
   {
      WheelPos -= 85;
      return WS281x_Color(0, WheelPos * 3, 255 - WheelPos * 3);
   }
   WheelPos -= 170;
   return WS281x_Color(WheelPos * 3, 255 - WheelPos * 3, 0);
}

6、这里我简单的写了两个演示程序

void Mode2_LED(uint8_t wait)
{
   uint32_t timestamp = HAL_GetTick();
   uint16_t i;
   static uint8_t j;
   static uint32_t next_time = 0;
   uint32_t flag = 0;
   if (next_time < wait)
   {
      if ((uint64_t)timestamp + wait - next_time > 0)
         flag = 1;
   }
   else if (timestamp > next_time)
   {
      flag = 1;
   }
   if (flag)
   {
      j++;
      next_time = timestamp + wait;
      for (i = 0; i < LED_NUMS; i++)
      {
         WS281x_SetPixelColor(i, Wheel((i + j) & 255));
      }
   }
   HAL_TIM_PWM_Start_DMA(&htim1,TIM_CHANNEL_1,(uint32_t *)RGB_buffur,RESET_PULSE + WS2812_DATA_LEN);
}
void Mode1_LED(uint8_t wait)
{
   uint32_t timestamp = HAL_GetTick();
   uint16_t i;
   static uint8_t j;
   static uint32_t next_time = 0;
   static uint8_t loop = 0;
   if (loop == 0)
      next_time = timestamp;
   loop = 1; //首次调用初始化
 
   if ((timestamp > next_time)) // && (timestamp - next_time < wait*5))
   {
      j++;
      next_time = timestamp + wait;
      for (i = 0; i < LED_NUMS; i++)
      {
         WS281x_SetPixelColor(i, Wheel(((i * 256 / (LED_NUMS)) + j) & 255));
      }
   }
   HAL_TIM_PWM_Start_DMA(&htim1,TIM_CHANNEL_1,(uint32_t *)RGB_buffur,RESET_PULSE + WS2812_DATA_LEN);
}

7、在主函数中直接调用Mode1_LED和Mode2_LED函数即可。

OK 到这里就结束了,点亮之后相当炫酷。,大家可以借鉴 ,修改出自己独特的风格。



审核编辑 :李倩


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • STM32
    +关注

    关注

    2305

    文章

    11123

    浏览量

    371212
  • 开发板
    +关注

    关注

    25

    文章

    6136

    浏览量

    113555

原文标题:基于STM32G070RB的七彩星空灯教程

文章出处:【微信号:airX嵌入式,微信公众号:airX嵌入式】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    STMicroelectronics NUCLEO-C071RB STM32 Nucleo-64开发板数据手册

    STMicroelectronics NUCLEO-C071RB STM32 Nucleo-64开发板带有板载STM32C071RB MCU,支持Arduino和ST morpho连接。该板为用户
    的头像 发表于 10-17 16:47 535次阅读
    STMicroelectronics NUCLEO-C071<b class='flag-5'>RB</b> <b class='flag-5'>STM32</b> Nucleo-64开发板数据手册

    星空投影方案开发设计案例

    面临的挑战。今天,深圳三佛科技将介绍一款基于辉芒微8 位 MCU 的星空投影仪控制方案,它不仅能够满足上述需求,还能在极短的开发周期内实现量产,为市场带来全新的选择。 方案定位 星空投影方案面向三类
    发表于 09-03 15:45

    STM32G070RBT6TR ADC采集定点电压误差较大,有没有优化方向?

    STM32G070RBT6TRADC采集定点电压误差较大,有没有优化方向
    发表于 07-22 07:24

    STM32CubeMX配置STM32G070RBT6TR时为什么无法使能PVD中断?

    STM32CubeMX 配置STM32G070RBT6TR时无法使能PVD中断
    发表于 06-18 07:59

    STM32CubeMX配置STM32G070RBT6TR时无法使能PVD中断怎么办?

    STM32CubeMX 配置STM32G070RBT6TR时无法使能PVD中断
    发表于 06-16 06:32

    stm32g070数据手册和使用手册

    电子发烧友网站提供《stm32g070数据手册和使用手册.pdf》资料免费下载
    发表于 06-13 16:21 16次下载

    万能七彩充开关电源电器的制作

    手机万能七彩充电器的制作过程JC820型手机万能充电器套件制成后,适合充容量为250~3000mA锂离子、镍氢电池;充电时,七彩灯闪烁,指示的颜色依次变化,发出绚丽多彩的七彩光芒,饱
    发表于 03-26 14:17

    灯光太普通?快来试试这款多模式的七彩灯方案!

    爆闪模式:红、绿、蓝、黄、青、粉、白种颜色交替爆闪;七彩跑马流水灯:在偶数流水模式下,偶数LED依次点亮,奇数LED熄灭。流水达到设定数后,切换颜色继续显示
    的头像 发表于 03-17 18:22 1108次阅读
    灯光太普通?快来试试这款多模式的<b class='flag-5'>七彩</b>灯方案!

    NRK3301离线语音识别模块在七彩灯上的应用方案

    传统七彩灯依赖遥控器或APP的操作方式,总在关键时刻“掉链子”。如今,语音控制正成为智能照明的“新宠”——只需一句话,灯光颜色、亮度、模式随心切换。而实现这种“声控”的核心,正是藏在灯带里
    的头像 发表于 03-10 14:04 789次阅读
    NRK3301离线语音识别模块在<b class='flag-5'>七彩</b>灯上的应用方案

    STM32G070 UART串口,低波特率传送数据时,TIMER出现严重延时现象如何解决?

    STM32G070, UART串口,低波特率传送数据时,TIMER出现严重延时现象,传送数据长的话,导致系统重启。如何解决?
    发表于 03-07 07:07

    【敏矽微ME32G070开发板免费体验】点亮WS2812B

    [10,0,255] 设置第2个珠的RGB颜色为[0,25,12] 则第0个珠的数据表示 (GRB): G[0001 1001]R[0000 1111]B[1000 0000] 则第1个
    发表于 01-07 23:58

    【敏矽微ME32G070开发板免费体验】使用coremark测试敏矽微ME32G070 跑分

    收到敏矽微ME32G070分开发板有3天了,一直想知道这个MCU的性能怎样?就像平时买新电脑后,就会用鲁大师来测个分数,今天我就使用coremark来测试下敏矽微ME32G070这款MCU的分数能力
    发表于 12-19 12:09

    【敏矽微ME32G070开发板免费体验】开箱及环境搭建

    一、开箱 上周收到敏矽微官方寄过来的ME32G070开发板,使用普通的纸盒包装,官方还送了三颗ME32G070RBT6 MCU,从外观上看,主板上的MCU还留有焊接的痕迹,应该是刚手动焊接
    发表于 12-17 22:13

    【敏矽微ME32G070开发板免费体验】+ADC测试与LED点亮

    *附件:【敏矽微ME32G070开发板免费体验】+ADC测试与LED点亮.docx【敏矽微ME32G070开发板免费体验】+ADC测试与LED点亮 收到了敏矽微ME32G070开发板,查看了一下板子
    发表于 12-16 19:00

    【敏矽微ME32G070开发板免费体验】\\+Lora通信终端产品开发项目

    CH340N,USB 转 TTL 串行芯片。 芯片串口和 CH340N 连接需要学员自备短路帽实现 UART1 接通 TYPEC。 (3)主控芯片 主控芯片为 ME32G070RB16。 (4)仿真
    发表于 12-15 18:26