[MM32硬件] 【灵动微电子MM32F0121测评】3、 呼吸灯实验

[复制链接]
 楼主| 发表于 2025-6-13 11:18 | 显示全部楼层 |阅读模式
本文目的通过调节PWM占空比调节LED亮度,起到呼吸灯效果

1、硬件情况
板载的LED1、LED2分别对应PB15、PB14,可通过复用设置为PWM1输出
4.png

2、软件部分
1)PWM1初始化
这部分内容可以参考LibSamples_MM32F0120_V1.13.4\Samples\LibSamples\TIM1\TIM1_PWM_Output
因为只有2个LED,所以保留了PWM1的2个通道CHANNEL2、3

  1. void TIM1_Configure(void)
  2. {
  3.   RCC_ClocksTypeDef       RCC_Clocks;
  4.     GPIO_InitTypeDef        GPIO_InitStruct;
  5.     TIM_OCInitTypeDef       TIM_OCInitStruct;
  6.     TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
  7.     uint32_t                TIM_ClockFrequency = 0;
  8.     uint32_t                HPRE = 0, PPRE2 = 0;

  9.     uint32_t Channel2Pulse = 0, Channel3Pulse = 0;

  10.     HPRE  = READ_BIT(RCC->CFGR, RCC_CFGR_HPRE)  >> RCC_CFGR_HPRE_Pos;
  11.     PPRE2 = READ_BIT(RCC->CFGR, RCC_CFGR_PPRE2) >> RCC_CFGR_PPRE2_Pos;

  12.     RCC_GetClocksFreq(&RCC_Clocks);

  13.     if (HPRE < 8)
  14.     {
  15.         if (PPRE2 < 4)
  16.         {
  17.             TIM_ClockFrequency = RCC_Clocks.PCLK1_Frequency;
  18.         }
  19.         else
  20.         {
  21.             TIM_ClockFrequency = RCC_Clocks.PCLK1_Frequency * 2;
  22.         }
  23.     }
  24.     else
  25.     {
  26.         if (PPRE2 < 4)
  27.         {
  28.             TIM_ClockFrequency = RCC_Clocks.PCLK1_Frequency * 2;
  29.         }
  30.         else
  31.         {
  32.             TIM_ClockFrequency = RCC_Clocks.PCLK1_Frequency * 4;
  33.         }
  34.     }
  35.                
  36.                  /* Compute the value to be set in ARR regiter to generate signal frequency at 100 Khz */
  37.     TimerPeriod = TIM_ClockFrequency / 100000;

  38.     /* Compute CCR1 value to generate a duty cycle at 75% for channel 3 */
  39.     Channel3Pulse = (uint32_t)900 * TimerPeriod / 1000;//LED2

  40.     /* Compute CCR2 value to generate a duty cycle at 50% for channel 2 */
  41.     Channel2Pulse = (uint32_t)500 * TimerPeriod / 1000;//LED1
  42.                
  43.                
  44.                 RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);

  45.     TIM_TimeBaseStructInit(&TIM_TimeBaseInitStruct);
  46.     TIM_TimeBaseInitStruct.TIM_Prescaler         = 0;
  47.     TIM_TimeBaseInitStruct.TIM_CounterMode       = TIM_CounterMode_Up;
  48.     TIM_TimeBaseInitStruct.TIM_Period            = TimerPeriod;
  49.     TIM_TimeBaseInitStruct.TIM_ClockDivision     = TIM_CKD_Div1;
  50.     TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0;
  51.     TIM_TimeBaseInit(TIM1, &TIM_TimeBaseInitStruct);
  52.                
  53.                
  54.                 TIM_OCStructInit(&TIM_OCInitStruct);
  55.     TIM_OCInitStruct.TIM_OCMode       = TIM_OCMode_PWM1;
  56.     TIM_OCInitStruct.TIM_OutputState  = TIM_OutputState_Enable;
  57.     TIM_OCInitStruct.TIM_Pulse        = 0;
  58.     TIM_OCInitStruct.TIM_OCPolarity   = TIM_OCPolarity_High;
  59.     TIM_OCInitStruct.TIM_OCIdleState  = TIM_OCIdleState_Set;

  60.     TIM_OCInitStruct.TIM_Pulse = Channel3Pulse;
  61.     TIM_OC3Init(TIM1, &TIM_OCInitStruct);

  62.     TIM_OCInitStruct.TIM_Pulse = Channel2Pulse;
  63.     TIM_OC2Init(TIM1, &TIM_OCInitStruct);               


  64.                 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);
  65.                
  66.                 GPIO_PinAFConfig(GPIOB, GPIO_PinSource14,  GPIO_AF_6);   /* TIM1_CH3 */
  67.     GPIO_PinAFConfig(GPIOB, GPIO_PinSource15,  GPIO_AF_7);   /* TIM1_CH2 */
  68.                
  69.                 GPIO_StructInit(&GPIO_InitStruct);
  70.     GPIO_InitStruct.GPIO_Pin   = GPIO_Pin_14 | GPIO_Pin_15;
  71.     GPIO_InitStruct.GPIO_Speed = GPIO_Speed_High;
  72.     GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_AF_PP;
  73.     GPIO_Init(GPIOB, &GPIO_InitStruct);

  74.     TIM_Cmd(TIM1, ENABLE);

  75.     TIM_CtrlPWMOutputs(TIM1, ENABLE);
  76. }


呼吸灯实验:
通过TIM_SetCompare3、TIM_SetCompare2调节2个通道的占空比,调节范围0-1000对应0%-100%,由于LED是低电平有效,所以0%最亮,100%最暗
  1. void Breathing_Light_Sample(void)
  2. {
  3.         int i=0;
  4.         TIM1_Configure();
  5.         while (1)
  6.         {
  7.                 for(i=0;i<1000;i++)
  8.                 {
  9.                         TIM_SetCompare3(TIM1,(uint32_t)i * TimerPeriod / 1000);
  10.                         TIM_SetCompare2(TIM1,(uint32_t)i * TimerPeriod / 1000);
  11.                         PLATFORM_DelayMS(1);
  12.                 }
  13.                 for(i=1000;i>0;i--)
  14.                 {
  15.                         TIM_SetCompare3(TIM1,(uint32_t)i * TimerPeriod / 1000);
  16.                         TIM_SetCompare2(TIM1,(uint32_t)i * TimerPeriod / 1000);
  17.                         PLATFORM_DelayMS(1);
  18.                 }
  19.         }
  20. }


3、运行
tutieshi_640x357_4s.gif

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

本版积分规则

84

主题

147

帖子

3

粉丝
快速回复 返回顶部 返回列表