首页 > 其他分享 >定时器PWM控制RGB彩灯案例

定时器PWM控制RGB彩灯案例

时间:2024-01-09 21:35:41浏览次数:29  
标签:10 定时器 20 RGB 110 PWM

1.脉冲宽度调制PWM

       PWM(Pulse Width Modulation)简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在测量、通信、工控等方面。

      PWM的一个优点是从处理器到 被控系统信号都是数字形式的,再进行数模转换。可将噪声影响降到最低(可以跟电脑一样)。噪声只有在强到足以将逻辑1改变为逻辑0或将逻辑0改变为逻辑1时,也才能对数字信号产生影响。

2.STM32定时器

      通用定时器是一个通过可编程预分频器驱动的16位自动装载计数器构成。它适用于多种场合,包括测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和PWM)。

      使用定时器预分频器和RCC时钟控制器预分频器,脉冲长度和波形周期可以在几个微秒到几个毫秒间调整。

定时器PWM控制RGB彩灯案例_PWM


      定时器脉冲宽度调制模式可以产生一个由TIMx_ARR寄存器确定频率、由TIMx_CCRx寄存器确定占空比的信号。在TIMx_CCMRx寄存器中的OCxM位写入’110’(PWM模式1)或’111’(PWM模式2),能够独立地设置每个OCx输出通道产生一路PWM。必须设置TIMx_CCMRx寄存器OCxPE位以使能相应的预装载寄存器,最后还要设置TIMx_CR1 寄存器的ARPE位, (在向上计数或中心对称模式中)使能自动重装载的预装载寄存器。

      本次RGB彩灯即可通过定时器PWM控制,实现全彩颜色显示。

3.RGB彩灯

定时器PWM控制RGB彩灯案例_PWM_02

定时器PWM控制RGB彩灯案例_RGB灯_03

  本次使用的RGB彩灯设备是国巨的RS-3535,亮度可达8000nit。使用RGB三个引脚,通过三原色的设置从而实现全彩颜色显示。

  硬件接口如下:

接口

引脚

LED_R

PB4(TIM3_CH1)

LED_G

PB5(TIM3_CH2)

LED_B

PB8(TIM4_CH3)

4.软件配置

4.1 定时器PWM通道配置

  根据硬件接口,接下来需要完成对定时器3的CH1和CH2配置,定时器4的CH3的配置。将通道配置为PWM输出模式。根据实际亮度测试,仅需将亮度周期时间设置为255即可,软件代码配置如下:

定时器PWM控制RGB彩灯案例_RGB灯_04

 定时器4的CH3配置:

定时器PWM控制RGB彩灯案例_呼吸灯_05

4.2 定时器2配置

  为了实现呼吸灯效果,这里通过定时器2实现,设置周期时间为50ms,CNT+1时间为0.1ms。

定时器PWM控制RGB彩灯案例_RGB灯_06

定时器PWM控制RGB彩灯案例_PWM_07

5.代码生成

5.1 PW配置生成代码

  定时器3的CH1和CH2代码生成:

定时器PWM控制RGB彩灯案例_RGB灯_08

  定时器4的CH3代码生成:

定时器PWM控制RGB彩灯案例_RGB灯_09

5.2 增加PWM启动代码

  在软件生成代码过程中,PWM通道需要手动启动,添加代码如下:

定时器PWM控制RGB彩灯案例_RGB灯_10

5.3 RGB彩灯控制函数

  编写函数,实现RGB彩灯控制,后续仅需调用该函数即可实现全彩颜色显示。

/************rgb***************
函数功能:检测按键值
形  参:r,g,b --红绿蓝,取值范围为0~255
公  司:北京万邦易嵌
作  者:IT_阿水
*******************************/
void RGB_Ctl(uint8_t r,uint8_t g,uint8_t b)
{
  htim3.Instance->CCR1=(r/25);
  htim3.Instance->CCR2=(g/20);
  htim4.Instance->CCR3=(b/10);
}

6. RGB彩色呼吸灯实现

  通过定时器2,设置计数周期为50ms,计数器+1的时间为0.1ms。即没50ms改变一次RGB彩灯颜色。功能实现如下:

定时器PWM控制RGB彩灯案例_RGB灯_11

  在定时器2中断服务函数中,没进一次中断,即改变一次RGB颜色值,RGB颜色变化效果为:红—绿—蓝三种颜色逐渐转换。

uint8_t rgb[53*3][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},
                       {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,0},
                       {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}};
void TIM2_IRQHandler(void)
{
  /* USER CODE BEGIN TIM2_IRQn 0 */
   static uint16_t i=0;
  /* USER CODE END TIM2_IRQn 0 */
  HAL_TIM_IRQHandler(&htim2);
  /* USER CODE BEGIN TIM2_IRQn 1 */
  i++;
  if(i>=159)i=0;
  RGB_Ctl(rgb[i][0],rgb[i][1],rgb[i][2]);
  /* USER CODE END TIM2_IRQn 1 */
}

定时器PWM控制RGB彩灯案例_PWM_12

定时器PWM控制RGB彩灯案例_PWM_13

标签:10,定时器,20,RGB,110,PWM
From: https://blog.51cto.com/u_15688123/9165589

相关文章

  • 基于TIC6000的DSP教学实验箱操作教程:5-18 RGB24图像灰度转换(LCD显示)
    一、实验目的学习RGB24图像灰度转换的原理,掌握图像的读取方法,并实现在LCD上显示灰度转换前后的图像。二、实验原理RGB24图像灰度转换RGB颜色空间作为一种常用的彩色图像表示模型,分别用红(R)、绿(G)、蓝(B)三原色的组合来表示每个像素的颜色。一般情况下,RGB彩色图像灰度化有三种转化方案:(1)......
  • STM32定时器驱动WS2812
    最近在学STM32F103的定时器的标准库驱动,在学到定时器的比较输出功能时发现它可以和DMA配合一起使用产生一连串占空比各不同的PWM波,于是我立刻想到用这个东西来驱动WS2812,手边正好有一串30颗灯珠的WS2812灯带。WS2812的通信协议数据格式WS2812是一种采用单线通信方式的全......
  • 06 PWM呼吸灯实验
    软件版本:VIVADO2021.1操作系统:WIN1064bit硬件平台:适用XILINXA7/K7/Z7/ZU/KU系列FPGA登录米联客(MILIANKE)FPGA社区-www.uisrc.com观看免费视频课程、在线答疑解惑!1概述小小呼吸灯在很多设备上我们可以看到,我们可以在FPGA的控制主板上也可以加入呼吸灯,指示我们的FPGA主板......
  • 定时器原理及使用
    一、引入在进行并发编程时,有时候会需要定时功能,比如监控某个GO程是否会运行过长时间、定时打印日志等等。GO标准库中的定时器主要有两种:Timer定时器、Ticker定时器。Timer计时器使用一次后,就失效了,需要Reset()才能再次生效。而Ticker计时器会一直生效。二、Timer定时器1)实现原......
  • 线程安全&&定时器总结
    总结线程线程:执行的独立代码线程执行是靠cpu分配时间片,同一个时间片上只能执行一个线程线程的状态:新建就绪运行阻塞死亡Thread:多线程的类currentThread()getName(),setName()sleep()实现多线程的方式1.继承Thread,重写run2.实现Runnable,重写run实现线程安全......
  • 07 RGB转HDMI显示方案
    软件版本:VIVADO2021.1操作系统:WIN1064bit硬件平台:适用XILINXA7/K7/Z7/ZU/KU系列FPGA登录米联客(MiLianKe)FPGA社区-www.uisrc.com观看免费视频课程、在线答疑解惑!1概述本实验通过FPGA内部资源实现HDMI协议,使用HDMI直接驱动HDMI接口显示器,这是成本非常低廉的一种方案,可以......
  • [BOM]定时器
    定时调用 setInterval//开启定时器:第一个参数是回调函数(必须),第二个参数是毫秒//返回值表示是这个页面的第几个定时器(从1开始数)vartimer=setInterval(function(){console.log('一秒!');},1000);console.log(timer);//异步语句......
  • 疾速7600MT/s!KELVV科赋CRAS V RGB DDR5内存图赏
    12月18日消息,KLEVV科赋日前推出新款大容量DDR5内存套装,满足游戏玩家、内容创作者和高端PC爱好者的需求。现在,KLEVV科赋CRASVRGB内存套装已经来到我们评测室,下面为大家带来图赏。目前在售CRASVRGB均为16B*2套装,提供6000MT/s、6400MT/s、7200MT/s、7600MT/s、8000MT/s共五种不同......
  • 定时器
    背景参数解释OnActiveSec定时器生效后,多少时间开始执行任务OnBootSec系统启动后,多少时间开始执行任务OnStartupSecSystemd进程启动后,多少时间开始执行任务OnUnitActiveSec该单元上次执行后,等多少时间再次执行OnUnitInactiveSec定时器上次关闭后多少时......
  • FreeRTOS中的定时器介绍和使用
    FreeRTOS作为一款流行的嵌入式实时操作系统,提供了强大的任务调度和同步机制。在实时嵌入式系统中,定时器是一项重要的功能,用于执行特定任务、延时操作或周期性执行代码。本文将深入介绍FreeRTOS中的定时器,并提供详细的代码演示,以帮助开发者更好地理解和应用定时器功能。1.定时器的......