[研电赛技术支持] 【GD32F303红枫派使用手册】第八讲 TIMER-RGB彩灯实验

[复制链接]
 楼主| 聚沃科技 发表于 2024-6-4 09:38 | 显示全部楼层 |阅读模式
本帖最后由 聚沃科技 于 2024-6-4 11:05 编辑

红枫派首图.png
8.1 实验内容
通过本实验主要学习以下内容:
• RGB彩灯控制原理
• TIMER PWM输出原理
8.2 实验原理
本例程中使用的RGB彩灯采用共阳极驱动方式,使用三路PWM进行驱动,对应引脚输出低电平的时候对应RGB灯珠点亮,调节不同路的PWM占空比可以实现多种多样的颜色,每个通道可以输出0%-100%的占空比,组合起来可以输出100*100*100种色彩。
8.3 硬件设计
RGB彩灯的硬件控制电路如下,通过TIMER0_CH0/CH1/CH2三个通道控制RGB灯珠。
图片1.png
8.4 代码解析
本例程采用TIMER0的三个通道进行控制RGB灯珠,调整每个通道的占空比实现呼吸灯的效果。
8.4.1 主函数代码解析
主函数代码如下所示,主要包括串口初始化、LED初始化、RGB灯珠初始化、timer驱动初始化(该timer用于调整RGB灯珠PWM驱动时间)。
  1. C
  2. int main(void)
  3. {
  4.     driver_init();
  5.   
  6.     bsp_uart_init(&BOARD_UART);
  7.     bsp_led_group_init();  
  8.     bsp_led_on(&LED0);
  9.     bsp_led_off(&LED1);
  10.         
  11.     bsp_rgb_init(1000000,100);// 1M timer_cnt_ck,10K PWM CK   

  12.     TIMER_INT.timer_updata_callback=rgb_switch;
  13.     bsp_timer_init(10000,500);
  14.    
  15.     printf("\r\n RGB breathing lamp\r\n");
  16.    
  17.         while(1)
  18.         {

  19.         }
  20. }
8.4.2 RGB灯珠初始化函数解析
RGB灯珠初始化函数如下,在此定义了RGB_TIMER_RRGB_TIMER_GRGB_TIMER_B三个灯的控制结构体,并通过timer驱动进行配置。
  1. C
  2. void bsp_rgb_init(uint32_t counter_frequency,uint16_t period)
  3. {
  4.     driver_timer_multi_channel_init(&RGB_TIMER_R,&RGB_TIMER_G,&RGB_TIMER_B,NULL,counter_frequency,period);
  5.     driver_timer_pwm_on(&RGB_TIMER_R);
  6.     driver_timer_pwm_on(&RGB_TIMER_G);
  7.     driver_timer_pwm_on(&RGB_TIMER_B);   
  8. }
  9. TIMER_CH_DEF(RGB_TIMER_R,TIMER0,0,TIMER_CH_PWM_LOW,A,8,AF_PP,NULL);
  10. TIMER_CH_DEF(RGB_TIMER_G,TIMER0,1,TIMER_CH_PWM_LOW,A,9,AF_PP,NULL);
  11. TIMER_CH_DEF(RGB_TIMER_B,TIMER0,2,TIMER_CH_PWM_LOW,A,10,AF_PP,NULL);
8.4.3 基础定时器初始化及中断处理函数
基础定时器初始化配置代码如下,在此起了一个定时器TIMER5,并使能了其溢出中断。该定时器用于控制RGB PWM输出时间。
  1. C
  2.     TIMER_INT.timer_updata_callback=rgb_switch;
  3.     bsp_timer_init(10000,500);
  4.     void bsp_timer_init(uint32_t counter_frequency,uint16_t period)
  5. {
  6.     driver_timer_base_int_init(&TIMER_INT,counter_frequency,period);
  7.     nvic_irq_enable(TIMER5_IRQn,0,0);
  8. }
其中断回调函数如下,通过该函数定时调整RGB三路PWM的占空比,其中,RGB三路起始占空比分别为030%60%,之后没路每次增加1%,进而实现彩灯呼吸的效果。
  1. C
  2. void rgb_switch(void)
  3. {   
  4.     static  uint8_t r_duty=0,g_duty=30,b_duty=60;
  5.     bsp_rgb_duty_set(r_duty++,g_duty++,b_duty++);
  6.     if(r_duty>=100) r_duty=0;
  7.     if(g_duty>=100) g_duty=0;
  8.     if(b_duty>=100) b_duty=0;   
  9. }
8.5 实验结果
将本例程代码下载到红枫派开发板中,运行后将会看到RGB彩灯呼吸的效果

本教程由GD32 MCU方案商聚沃科技原创发布,了解更多GD32 MCU教程,关注聚沃科技官网,GD32MCU技术交流群:859440462

您需要登录后才可以回帖 登录 | 注册

本版积分规则

170

主题

190

帖子

13

粉丝
快速回复 在线客服 返回列表 返回顶部