实现方式因使用的 MCU 不同而异,以下以常见的 STM32 MCU 为例:

  1. 配置 GPIO 口为输出模式,并将其初始化为低电平(灯灭)。
  // 定义 GPIO 口的引脚号和端口号
  #define LED_PIN GPIO_PIN_13
  #define LED_PORT GPIOC

  // 配置 GPIO 口为推挽输出模式
  GPIO_InitTypeDef gpio_init = {0};
  gpio_init.Pin = LED_PIN;
  gpio_init.Mode = GPIO_MODE_OUTPUT_PP;
  gpio_init.Pull = GPIO_NOPULL;
  gpio_init.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(LED_PORT, &gpio_init);

  // 初始化 GPIO 口为低电平(灯灭)
  HAL_GPIO_WritePin(LED_PORT, LED_PIN, GPIO_PIN_RESET);
  1. 在主循环中实现呼吸灯的效果,即循环改变 LED 的亮度。
  // 定义呼吸灯的周期和亮度变化步长
  #define BREATHE_PERIOD 1000
  #define BREATHE_STEP 10

  while (1) {
    // 从低到高改变 LED 的亮度
    for (int duty_cycle = 0; duty_cycle <= 100; duty_cycle += BREATHE_STEP) {
      // 计算当前占空比对应的延时时间
      int delay_time = duty_cycle * BREATHE_PERIOD / 100;

      // 计算当前占空比对应的 PWM 脉宽
      int pwm_width = duty_cycle * TIM_PERIOD / 100;

      // 更新 PWM 波形的占空比和延时时间
      TIM_OC_InitTypeDef tim_oc_init = {0};
      tim_oc_init.OCMode = TIM_OCMODE_PWM1;
      tim_oc_init.Pulse = pwm_width;
      tim_oc_init.OCPolarity = TIM_OCPOLARITY_HIGH;
      HAL_TIM_PWM_ConfigChannel(&htim2, &tim_oc_init, TIM_CHANNEL_1);
      HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);
      HAL_Delay(delay_time);
    }

    // 从高到低改变 LED 的亮度
    for (int duty_cycle = 100; duty_cycle >= 0; duty_cycle -= BREATHE_STEP) {
      // 计算当前占空比对应的延时时间
      int delay_time = (100 - duty_cycle) * BREATHE_PERIOD / 100;

      // 计算当前占空比对应的 PWM 脉宽
      int pwm_width = duty_cycle * TIM_PERIOD / 100;

      // 更新 PWM 波形的占空比和延时时间
      TIM_OC_InitTypeDef tim_oc_init = {0};
      tim_oc_init.OCMode = TIM_OCMODE_PWM1;
      tim_oc_init.Pulse = pwm_width;
      tim_oc_init.OCPolarity = TIM_OCPOLARITY_HIGH;
      HAL_TIM_PWM_ConfigChannel(&htim2, &tim_oc_init, TIM_CHANNEL_1);
      HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);
      HAL_Delay(delay_time);
    }
  }

其中,htim2 是使用定时器 TIM2 来产生 PWM 波形的句柄,TIM_PERIOD 是 PWM 波形的周期,可以通过修改定时器的预分频器和自动重装载寄存器来控制。需要注意的是,在 STM32 MCU 中,定时器的预分频器和自动重装载寄存器都是 16 位的,因此 PWM 波形的周期不能超过 65535 个时钟周期

MCU的呼吸灯的软件

原文地址: https://www.cveoy.top/t/topic/hsJx 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录