打印
[STM32C0]

【STM32C092RC 测评】PWM 呼吸灯

[复制链接]
386|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主

【STM32C092RC 测评】PWM 呼吸灯

本文介绍了 Nucleo-STM32C092 开发板通过硬件 PWM 实现呼吸灯的流程。

项目方案

  • 使用 STM32CubeMX创建工程;
  • STM32CubeIDE 编译和调试工程、固件上传;
  • 实现板载LED呼吸灯并串口打印 PWM 占空比。

工程创建

使用 STM32CubeMX 快速创建工程,开启 UART 并实现串口打印字符串。

  • 打开 STM32CubeMX 软件,新建 ST 板卡工程,搜索 NUCLEO-C092RC 选中目标板卡,开始工程,选择默认外设配置(注意不使用 BSP 板级支持包);
  • 时钟配置:采用默认设置,系统时钟频率 12MHz;
  • Pinout & Configuration 标签下选择 Connectivity - 使能 USART2 - 选择 Asynchronous 异步通信模式;
  • Pinout & Configuration 标签下选择 Timers - 使能 TIM1

cubemx_breathe_TIM_Config.jpg

  • 配置 PWM 参数,板载 LED 连接 PC9 低电平点亮,对应定时器 1 通道 2,使能自动重装载;

    • 频率 = CK_PSC/[(PSC+1) (ARR+1)],根据系统时钟 PSC 设为 11
    • 占空比 = CCR/(ARR+1),这里 ARR 设为 999
    • 分辨率 = 1/(ARR+1)

SCH_LED.jpg

  • 配置完成后,进入 Project Manager 标签栏,进行项目命名、保存路径设置、编译器选择等操作;
  • 点击 Generate Code 按钮,使用 STM32CubeIDE 或 Keil 打开目标工程;
  • 编译工程,0 error, 0 warning .

工程代码

打开 Core/Src/main.c 文件,添加关键代码

#include "main.h"
#include "tim.h"
#include "usart.h"
#include "gpio.h"

/* USER CODE BEGIN Includes */
#include <stdio.h>
/* USER CODE END Includes */

#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif

PUTCHAR_PROTOTYPE
{
    HAL_UART_Transmit(&huart2, (uint8_t*)&ch,1,HAL_MAX_DELAY);
    return ch;
}
/* USER CODE END PD */

void SystemClock_Config(void);

int main(void)
{

  /* USER CODE BEGIN 1 */
    uint16_t pwm_duty = 0;
    uint8_t direction = 0;
  /* USER CODE END 1 */

  HAL_Init();

  SystemClock_Config();

  MX_GPIO_Init();
  MX_TIM1_Init();
  MX_USART2_UART_Init();
  /* USER CODE BEGIN 2 */
  HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_2); // 初始化 PWM

  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
          if (direction)
          {
              __HAL_TIM_SetCompare(&htim1, TIM_CHANNEL_2, pwm_duty--);
              if(pwm_duty==0)
              direction=0;
          }
          else
          {
              __HAL_TIM_SetCompare(&htim1, TIM_CHANNEL_2, pwm_duty++);
              if(pwm_duty==1000)
              direction=1;
          }
          printf("%d\r\n",pwm_duty);
          HAL_Delay(1);
  }
  /* USER CODE END 3 */
}

编译程序,连接开发板并运行程序,可实现固件上传和程序自动执行。

效果演示

板载蓝色 LED 呈现呼吸灯效果

breatheLED.gif

同时串口发送对应的占空比数值

serial_plot_breathe_1.jpg

分析优化

可使用正弦函数实现占空比的平滑过渡,更接近呼吸效果,修改代码如下

#include <math.h>
float sinVal = 0;

while (1)
{
          // 计算正弦波值(范围 0~1)
          sinVal = (sin(HAL_GetTick() * 0.001f) + 1) / 2;  // 0~1 变化
          pwm_duty = (uint16_t)(sinVal * 1000); // 转换为 PWM 占空比(0~1000)
          __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_2, pwm_duty); // 更新 PWM 占空比
          printf("%d\r\n",pwm_duty);
          HAL_Delay(1);
}

总结

本文介绍了 Nucleo-STM32C092RC 开发板通过硬件 PWM 实现呼吸灯的流程,同时串口输出实时 PWM 占空比,为相关产品的开发和设计提供了参考。

使用特权

评论回复
沙发
AdaMaYun| | 2025-6-8 22:35 | 只看该作者
PWM非常不错

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

26

主题

60

帖子

0

粉丝