你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【NUCLEO-C562RE】呼吸灯

[复制链接]
无垠的广袤 发布时间:2026-10-8 14:01

【NUCLEO-C562RE】呼吸灯

本文介绍了 NUCLEO-C562RE 开发板结合 PWM 驱动 LED 实现呼吸灯的项目设计。

项目介绍

NUCLEO-C562RE 开发板结合定时器产生 PWM 信号驱动无源蜂鸣器,实现音乐播放的项目设计。

  • 准备工作:模块介绍、硬件连接、环境搭建;
  • 工程测试:工程配置、关键代码、编译上传、效果演示。

PWM

PWM(Pulse Width Modulation,脉宽调制)是一种通过快速切换电源开关来控制模拟设备输出的技术。核心思想是改变高低电平在一个周期内的时间比例,即占空比,从而控制 LED 的平均电流和亮度。

PWM_duty.jpg

单片机通过调节 PWM 的占空比,实现 LED 的亮度变化,模拟 “呼吸” 效果。

呼吸灯需固定 PWM 频率、改变占空比。因此不改变 ARR,固定周期、循环改 CCR。频率大于 1kHz 以实现平滑过渡。

实现方法

通过 STM32CubeMX2 可轻松实现硬件 PWM 输出,实现呼吸灯:

  • 定时器(TIM2)生成 PWM 信号,自动控制引脚高低电平;
  • 通过修改定时器的比较值(Compare Value)改变占空比,实现LED亮度调节;
  • 硬件自动生成 PWM 波,无需 CPU 持续干预,提高系统效率。

硬件连接

根据开发板原理图,板载用户 LED 由 PA5 引脚控制,PA5 对应定时器 2 的频道 1,将该其作为 PWM 信号产生引脚。

sch_led_pa5.jpg

接线方式

NUCLEO-C562RE LED Note
PA5 SIG PWM Signal
GND GND Ground

实物图

connect_pwm_led.jpg

工程配置

  • 打开 STM32CubeMX2 软件,从开发板新建工程;
  • 点击左侧工具栏 Open Peripherals 按钮,展开 Timers ,启用 TIM2,配置预分频器,输出 PWM 频率固定 2kHz;

mx2_tim2_clock.jpg

使用标准公式:频率 = f_clk / [(PSC + 1) × (ARR + 1)],即

$$ f{pwm}=\frac{f{clk}}{(PSC+1)×(ARR+1)}.

$$

计算步骤:

  1. Prescaler :143 + 1 = 144
  2. Period:499 + 1 = 500
  3. Total Divisor:144 × 500 = 72,000
  4. Final Result:144,000,000 / 72,000 = 2,000 Hz(2 kHz)

固定 PSC=0、占空比 50%,则:

$$ ARR=\frac{f{clk}}{f{pwm}}−1, \qquad CCR=\frac{ARR+1}{2}.

$$

使能 PWM 后,ARR 和 CCR 可通过程序更改,进而改变 音调 和 音量 。

  • 设置通道,启用 CH1,输出模式,比较模式设置为 PWM mode 1,脉冲为 0,使能通道1,使能 GPIO 引脚;

mx2_tim2_channel1.jpg

  • 将 TIM2 的 CH1 引脚配置为 PA5 ;

mx2_tim2_gpio.jpg

  • 开启定时器中断

mx2_tim2_nvic.jpg

  • 保存配置,生成 CMake工程;

导入 IDE

  • 打开 STM32CubeIDE 软件,依次选择 File - Import ,选择 STM32 CMake Project ,选择目标工程文件所在路径;
  • 配置工具链,选择主控芯片型号 STM32C562RETx ;
  • 待导入完成,点击工具栏 小锤子 按钮,编译工程,无报错。
  • 或使用 VS Code 软件打开目标文件夹,编译工程。

vscode_debug.jpg

流程图

flowchart_breath_led.jpg

工程代码

打开 main.c 文件,添加如下代码

#include "main.h"
#define STEP_DELAY  5U          // 每级占空比停留 5ms
#define STEPS       100U        // 渐变级数
static void pwm_set_duty(uint32_t duty)
{
  hal_tim_handle_t *htim = mx_tim2_gethandle();
  TIM_TypeDef *tim = (TIM_TypeDef *)htim->instance;
  uint32_t arr = LL_TIM_GetAutoReload(tim);
  uint32_t ccr = (arr + 1U) * duty / STEPS;

  if (duty >= STEPS)
  {
    ccr = arr + 1U;
  }

  LL_TIM_OC_SetCompareCH1(tim, ccr);
}

int main(void)
{
  if (mx_system_init() != SYSTEM_OK)
  {
    return (-1);
  }
  else
  {
    hal_tim_handle_t *htim = mx_tim2_gethandle();
    /* 启动 PWM 输出 */
    HAL_TIM_OC_StartChannel(htim, HAL_TIM_CHANNEL_1);
    HAL_TIM_Start(htim);
    while (1) {
    /* 渐亮 */
    for (uint32_t d = 0; d <= STEPS; d++)
    {
      pwm_set_duty(d);
      HAL_Delay(STEP_DELAY);
    }
    /* 渐暗 */
    for (uint32_t d = STEPS; d > 0; d--)
    {
      pwm_set_duty(d);
      HAL_Delay(STEP_DELAY);
    }
    }
  }
} /* end main */

保存代码。

编译上传

  • 点击 VS Code 左侧菜单栏的 调试运行 按钮,创建 launch.json 调试文件,选择 STLINK,默认配置保存;

launch_json_stlink.jpg

  • 点击运行按钮,自动编译工程并进入调试状态,点击条状悬浮窗的运行按钮,开始运行程序;

vscode_debug_start.jpg

效果演示

运行程序,板载用户 LED 亮度循环渐变。

breath_led.gif

总结

本文介绍了 NUCLEO-C562RE 开发板结合 PWM 驱动 LED 实现呼吸灯的项目设计,为相关项目的快速开发和应用设计提供了参考。

赞 收藏 评论0 发布时间:2026-10-8 14:01

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版