【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 ;


- 配置完成后,进入
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 呈现呼吸灯效果

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

分析优化
可使用正弦函数实现占空比的平滑过渡,更接近呼吸效果,修改代码如下
#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 占空比,为相关产品的开发和设计提供了参考。 |