ARM技术论坛
直播中

许小啵

3年用户 69经验值
擅长:可编程逻辑
私信 关注
[经验]

【星空派GD32F303开发板试用体验】-02-PWM实验之GRB三色灯模块

RGB紫色呼吸灯

PWM又称脉冲宽度调制,是学习掌握单片机外设的基本功能之一,对于温度调节,电机控制,等场景中使用较多。星空派手册资料详细介绍了PWM的原理和使用方法,根据官方提供的例程做了简单修改通过两路PWM波控制调节出紫色呼吸灯效果和6种颜色的灯光进行循环显示。通过此实验进一步加深了对gd32单片机PWM功能的学习。

首先利用单片机的PA8和PB0两个IO口进行复用成定时器PWM模式,通过两组PWM波同时工作可以兑出RGB灯的任意颜色,在通过官方提供的库进行基础配置,最后设置定时器的频率和占空比,在主函数里进行对占空比这个变量的调节,就可以实现呼吸灯的效果,此实验较为简单根据官方提供代码简单修改就可以实现本次效果。
23dbfbe46919e8f67966c8916fef62f.png 76f6deb28a45ba8e6a84c63dd7343d7.png
  1. #define __tiMER_PWM_C__

  2. #include


  3. /**
  4. 设置引脚为PWM模式
  5.   */
  6. void gpio_pwm_config(void)
  7. {
  8.     rcu_periph_clock_enable(RCU_GPIOA);  
  9.     rcu_periph_clock_enable(RCU_GPIOB);
  10.     gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_8);
  11.           gpio_init(GPIOB, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_0);
  12. }

  13. /**
  14.     brief      configure the TIMER peripheral
  15.     param[in]  none
  16.     param[out] none
  17.     retval     none
  18.   */
  19. //120MHz
  20. void timer_pwm_config(void)
  21. {
  22.     /* TIMER0 configuration: generate PWM signals with different duty cycles:
  23.        TIMER0CLK = SystemCoreClock / 120 = 1MHz */
  24.     timer_oc_parameter_struct timer_ocintpara;
  25.     timer_parameter_struct timer_initpara;

  26.            gpio_pwm_config();
  27.           rcu_periph_clock_enable(RCU_TIMER2);
  28.                 rcu_periph_clock_enable(RCU_TIMER0);
  29.           rcu_periph_clock_enable(RCU_AF);
  30.    timer_deinit(TIMER0);
  31.          timer_deinit(TIMER2);
  32.     /* TIMER0 configuration */
  33.         //预分频 119
  34.     timer_initpara.prescaler         = 119;
  35.         //边沿触发
  36.     timer_initpara.alignedmode       = TIMER_COUNTER_EDGE;
  37.     timer_initpara.counterdirection  = TIMER_COUNTER_UP;
  38.         //装载值 500  CAR
  39.     timer_initpara.period            = 500;
  40.     timer_initpara.clockdivision     = TIMER_CKDIV_DIV1;
  41.     timer_initpara.repetitioncounter = 0;
  42.     timer_init(TIMER0,&timer_initpara);
  43.     timer_init(TIMER2,&timer_initpara);
  44.          
  45.      /* CH0 configuration in PWM mode */
  46.         //使能通道输出
  47.         timer_ocintpara.outputstate  = TIMER_CCX_ENABLE;
  48.          //不需要通道互补
  49.     timer_ocintpara.outputnstate = TIMER_CCXN_DISABLE;
  50.          //通道输出极性 为高电平
  51.     timer_ocintpara.ocpolarity   = TIMER_OC_POLARITY_HIGH;
  52.          //通道互补输出极性 高电平
  53.     timer_ocintpara.ocnpolarity  = TIMER_OCN_POLARITY_HIGH;
  54.          //通道输出空闲状态 低电平
  55.     timer_ocintpara.ocidlestate  = TIMER_OC_IDLE_STATE_LOW;
  56.          //通道互补输出空闲状态 低电平
  57.     timer_ocintpara.ocnidlestate = TIMER_OCN_IDLE_STATE_LOW;
  58.                
  59.     timer_channel_output_config(TIMER2,TIMER_CH_2,&timer_ocintpara);
  60.           timer_channel_output_config(TIMER0,TIMER_CH_0,&timer_ocintpara);
  61.         //配置TIMER通道输出脉冲值 也就是 CHX_CV值
  62.     timer_channel_output_pulse_value_config(TIMER2,TIMER_CH_2,250);
  63.                 timer_channel_output_pulse_value_config(TIMER0,TIMER_CH_0,250);
  64.         //设置定时器通道0输出为PWM模式
  65.     timer_channel_output_mode_config(TIMER2,TIMER_CH_2,TIMER_OC_MODE_PWM0);
  66.     timer_channel_output_shadow_config(TIMER2,TIMER_CH_2,TIMER_OC_SHADOW_DISABLE);
  67.                
  68.                 timer_channel_output_mode_config(TIMER0,TIMER_CH_0,TIMER_OC_MODE_PWM0);
  69.     timer_channel_output_shadow_config(TIMER0,TIMER_CH_0,TIMER_OC_SHADOW_DISABLE);

  70.     timer_primary_output_config(TIMER0,ENABLE);
  71.     timer_primary_output_config(TIMER2,ENABLE);
  72.     /* auto-reload preload enable */
  73.     timer_auto_reload_shadow_enable(TIMER2);
  74.          timer_auto_reload_shadow_enable(TIMER0);
  75.     timer_enable(TIMER2);
  76.                 timer_enable(TIMER0);
  77. }


  78. #include "gd32f30x.h"
  79. #include "gd32f303e_eval.h"
  80. #include "systick.h"
  81. #include "timer_pwm.h"

  82. int main(void)
  83. {
  84.     int16_t i = 0;
  85.     FlagStatus breathe_flag = SET;
  86.    
  87.     /* configure the TIMER peripheral */
  88.     timer_pwm_config();
  89.    
  90.     /* configure systick */
  91.     systick_config();

  92.     while (1){
  93.         /* delay a time in milliseconds */
  94.         delay_1ms(40);
  95.         if (SET == breathe_flag){
  96.              i = i + 10;
  97.         }else{
  98.             i = i - 10;
  99.         }
  100.         if(500 < i){
  101.             breathe_flag = RESET;
  102.                                        
  103.         }
  104.         if(0 >= i){
  105.             breathe_flag = SET;
  106.         }
  107.         //配置TIMER通道输出脉冲值 也就是 CHX_CV值
  108.         timer_channel_output_pulse_value_config(TIMER2,TIMER_CH_2,i);
  109.                                 timer_channel_output_pulse_value_config(TIMER0,TIMER_CH_0,i);
  110.     }
  111. }

RGB七彩灯

更多回帖

发帖
×
20
完善资料,
赚取积分