技术伦理与指数增长:从Uber到AI的负责任创新之路
2026/5/31 10:56:12
本文详细讲解如何使用STM32的PWM功能实现呼吸灯效果,涵盖硬件连接、CubeMX配置、代码编写及调试技巧,通过定时器控制LED亮度渐变,提供完整可复现的嵌入式开发案例。
呼吸灯通过亮度平滑变化模拟呼吸节奏,广泛应用于设备状态指示(如手机通知)、装饰照明等领域。其核心是通过PWM(脉冲宽度调制)控制LED的导通时间。
PWM通过调节脉冲占空比(高电平时间占总周期的比例)控制平均电压输出。公式为:
V_avg = (t_on / T) × V_cc其中:
t_on:高电平时间T:PWM周期V_cc:电源电压| 组件 | 规格 | 数量 |
|---|---|---|
| STM32开发板 | STM32F103C8T6 | 1 |
| LED灯 | 5mm 红色 | 1 |
| 电阻 | 220Ω | 1 |
| 杜邦线 | 20cm | 若干 |
| 功能 | 引脚 | 复用功能 |
|---|---|---|
| PWM输出 | PA8 | TIM1_CH1 |
| LED阳极 | 通过电阻接PA8 | - |
| LED阴极 | GND | - |
目标:100Hz PWM频率,72MHz系统时钟
计算步骤:
预分频值 = 时钟频率 / (计数器周期 * PWM频率) - 1 = 72,000,000 / (1000 * 100) - 1 = 71CubeMX设置:
Breathing_LED/ ├── Core/ │ ├── Src/ │ │ ├── main.c # 主程序 │ │ └── tim.c # 定时器配置 ├── Drivers/ └── STM32F103C8Tx_FLASH.ld # 链接脚本main.c/* 文件名:main.c */#include"main.h"#include"tim.h"TIM_HandleTypeDef htim1;// TIM1句柄intmain(void){HAL_Init();SystemClock_Config();MX_TIM1_Init();HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1);// 启动PWMuint16_tduty=0;// 当前占空比int8_tdir=1;// 方向:1递增,-1递减while(1){HAL_Delay(10);// 10ms更新一次// 更新占空比值if(dir==1){if(++duty>=1000)dir=-1;}else{if(--duty==0)dir=1;}// 更新PWM脉宽__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,duty);}}tim.c/* 文件名:tim.c */voidMX_TIM1_Init(void){TIM_ClockConfigTypeDef sClockSourceConfig={0};TIM_MasterConfigTypeDef sMasterConfig={0};TIM_OC_InitTypeDef sConfigOC={0};htim1.Instance=TIM1;htim1.Init.Prescaler=71;// 预分频值htim1.Init.CounterMode=TIM_COUNTERMODE_UP;htim1.Init.Period=999;// 自动重装载值htim1.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;HAL_TIM_Base_Init(&htim1);// PWM配置sConfigOC.OCMode=TIM_OCMODE_PWM1;sConfigOC.Pulse=0;// 初始占空比sConfigOC.OCPolarity=TIM_OCPOLARITY_HIGH;sConfigOC.OCFastMode=TIM_OCFAST_DISABLE;HAL_TIM_PWM_ConfigChannel(&htim1,&sConfigOC,TIM_CHANNEL_1);HAL_TIM_MspPostInit(&htim1);}| 问题现象 | 解决方案 |
|---|---|
| LED不亮 | 检查PA8-GND电压是否变化 |
| 亮度不渐变 | 确认HAL_Delay()是否生效 |
| 呼吸频率过快 | 增大HAL_Delay()参数 |
constuint16_tsine_table[100]={/* 预计算值 */};duty=sine_table[counter++%100];通过本教程,您已掌握: