1. PWM信号生成基础PWM脉冲宽度调制是嵌入式系统中最常用的信号控制技术之一。我第一次接触PWM是在大学做智能车项目时当时需要控制电机转速。老师给了我们一个简单的比喻PWM就像快速开关的水龙头通过控制开关的时间比例来控制水流大小。定时器是PWM的核心。以STM32为例每个通用定时器有4个独立通道每个通道都可以配置为PWM输出模式。关键寄存器包括TIMx_ARR自动重装载寄存器决定PWM周期TIMx_CCRx捕获/比较寄存器决定占空比TIMx_CNT计数器寄存器实时计数值// STM32 PWM初始化示例寄存器版 void PWM_Init(TIM_TypeDef* TIMx, uint32_t channel, uint16_t arr, uint16_t psc) { // 1. 使能时钟 if(TIMx TIM1) RCC-APB2ENR | RCC_APB2ENR_TIM1EN; else if(TIMx TIM2) RCC-APB1ENR | RCC_APB1ENR_TIM2EN; // 2. 配置时基单元 TIMx-PSC psc - 1; // 预分频 TIMx-ARR arr - 1; // 自动重装载值 // 3. 配置PWM模式 switch(channel) { case 1: TIMx-CCMR1 | TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1; // PWM模式1 TIMx-CCER | TIM_CCER_CC1E; // 使能通道1 break; // 其他通道类似配置... } // 4. 启动定时器 TIMx-CR1 | TIM_CR1_CEN; }实际项目中我常用PWM控制LED亮度。比如要实现呼吸灯效果需要动态调整CCR值。有个坑要注意当ARR值较小时如100亮度变化会显得不平滑。后来我发现将ARR设为1000左右再用浮点运算计算CCR值效果会好很多。2. 输入捕获技术解析输入捕获是PWM的逆向过程用于测量外部信号的时序参数。去年做无人机项目时我需要测量遥控器接收机的PWM信号输入捕获帮了大忙。输入捕获的工作流程配置定时器时钟和捕获通道设置捕获边沿上升沿/下降沿触发捕获时当前CNT值锁存到CCR计算相邻捕获值差值得到脉宽测量PWM的关键是双边沿捕获。通常需要两个通道配合通道1捕获上升沿记录周期开始通道2捕获下降沿记录高电平时间// 输入捕获中断处理示例 void TIMx_IRQHandler(void) { if(TIMx-SR TIM_SR_CC1IF) { // 通道1捕获 rising_edge TIMx-CCR1; TIMx-CCER ^ TIM_CCER_CC1P; // 切换捕获边沿 } if(TIMx-SR TIM_SR_CC2IF) { // 通道2捕获 falling_edge TIMx-CCR2; duty_cycle (falling_edge - rising_edge) * 100 / period; } TIMx-SR 0; // 清除中断标志 }实测中发现高频信号1MHz测量需要优化代码使用DMA传输捕获值减少中断延迟开启定时器预分频降低计数频率使用从模式自动复位计数器3. 完整信号链路实现构建闭环控制系统时我常用一个定时器同时做PWM输出和输入捕获。最近做的智能窗帘项目就是这样实现的硬件连接TIM3_CH1PA6输出PWM控制电机TIM3_CH2PA7输入捕获检测限位开关关键配置// 定时器3配置PWM输出输入捕获 void TIM3_Config(void) { // 共用时基配置 TIM3-PSC 84 - 1; // 1MHz计数频率 TIM3-ARR 10000 - 1; // 10ms周期 // PWM输出配置通道1 TIM3-CCMR1 | TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1; // PWM模式1 TIM3-CCER | TIM_CCER_CC1E; // 输出使能 // 输入捕获配置通道2 TIM3-CCMR1 | TIM_CCMR1_CC2S_0; // CC2通道输入 TIM3-CCER | TIM_CCER_CC2E | TIM_CCER_CC2P; // 下降沿捕获 TIM3-DIER | TIM_DIER_CC2IE; // 捕获中断使能 NVIC_EnableIRQ(TIM3_IRQn); TIM3-CR1 | TIM_CR1_CEN; }抗干扰设计经验在捕获引脚加10kΩ上拉电阻配置输入滤波TIMx_CCMRx中的ICF位软件去抖连续3次捕获值差5%才确认有效4. 高级应用与调试技巧在工业电机控制项目中我遇到了信号同步问题多个PWM需要严格同步输出。解决方案是使用定时器的主从模式配置TIM1为主模式Master设置TRGO输出为更新事件其他定时器TIM2/TIM3为从模式从定时器选择ITR1为触发源// 定时器同步配置 TIM1-CR2 | TIM_CR2_MMS_1; // 主模式选择更新事件 TIM2-SMCR | TIM_SMCR_SMS_2; // 从模式-触发模式 TIM2-SMCR | TIM_SMCR_TS_2; // 选择ITR1触发源调试PWM的实用方法用示波器观察波形时建议先关闭所有中断排除软件干扰测量异常时检查TIMx_CR1的CEN位是否意外清零使用定时器Break功能紧急停止PWM输出有个记忆深刻的调试案例PWM输出突然消失最后发现是GPIO复用功能没有正确配置。现在我的检查清单里一定会包含GPIO模式寄存器MODER配置为复用功能GPIO复用功能选择寄存器AFR选择正确的定时器GPIO速度寄存器OSPEEDR设为高速模式