2. 案例2

任务定义

本案例要求使用逻辑分析仪捕获MCU输出的PWM波形,通过测量实际占空比并与设定值比对,定位PWM配置错误。目标板为STM32F103C8T6最小系统板,定时器TIM3的CH1(PA6)输出PWM,设定频率1kHz、占空比60%。若实测占空比偏离设定值超过±2%,判定配置存在错误,需按排查流程修正。

硬件连接与测量拓扑

STM32F103C8T6 TIM3_CH1 PA6 GND → 公共地 PA6 (PWM输出) 逻辑分析仪 CH0 → PA6 GND → 公共地 采样率 ≥ 10MS/s USB → PC 信号线 GND 预期捕获波形 (1kHz, 60%占空比): 高电平: 0.6ms 低电平: 0.4ms 周期: 1.0ms

PWM初始化代码(含故意配置错误)

以下代码初始化TIM3_CH1输出PWM。当前版本中故意将预分频器设置为71(正确应为71,但ARR设置为999时频率计算为72MHz/(71+1)/(999+1)=1kHz),实际错误在于比较寄存器CCR1被错误设置为500(正确应为600),导致占空比变为50%而非设定值60%。

// pwm_config.c - STM32F103 TIM3_CH1 PWM初始化
#include "stm32f10x.h"

void PWM_Init(void) {
    GPIO_InitTypeDef GPIO_InitStructure;
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    TIM_OCInitTypeDef TIM_OCInitStructure;
    
    // 1. 使能时钟
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    
    // 2. 配置PA6为复用推挽输出
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    
    // 3. TIM3时基配置:72MHz/(71+1)=1MHz计数频率
    TIM_TimeBaseStructure.TIM_Prescaler = 71;      // 预分频 71 → 1MHz
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseStructure.TIM_Period = 999;        // ARR=999 → 1kHz
    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
    
    // 4. PWM模式配置
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCInitStructure.TIM_Pulse = 500;           // CCR1=500 → 占空比50%(错误值)
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
    TIM_OC1Init(TIM3, &TIM_OCInitStructure);
    
    // 5. 使能TIM3
    TIM_Cmd(TIM3, ENABLE);
}

int main(void) {
    PWM_Init();
    while(1) {
        // 主循环空转,PWM由硬件持续输出
    }
}

逻辑分析仪捕获与测量步骤

使用Saleae Logic 16逻辑分析仪(或兼容设备),按以下步骤操作:

  1. 将逻辑分析仪CH0通道探针连接至PA6引脚,GND探针连接至系统公共地;
  2. 打开逻辑分析软件,设置采样率10MS/s(每周期采样10000点,足够精确测量1kHz信号);
  3. 设置触发条件为CH0上升沿,捕获时长10ms(约10个完整周期);
  4. 点击“开始”后给MCU上电或复位,自动捕获波形;
  5. 在软件中使用“测量”工具,分别测量高电平时间、低电平时间和周期。

测量结果与错误判定

捕获波形后,测量工具应显示以下数据(预期值,非实测结果):

  • 周期:1.000ms(对应频率1kHz)
  • 高电平时间:0.500ms
  • 低电平时间:0.500ms
  • 实际占空比 = 0.500ms / 1.000ms = 50%

设定目标占空比为60%,实测50%偏差达10%,远超±2%容差,判定PWM配置存在错误。根据排查流程,检查TIM_TimeBaseStructure和TIM_OCInitStructure参数,发现TIM_Pulse = 500应为600(600/1000=60%)。修正该值后重新编译烧录,再次捕获波形,高电平时间应变为0.600ms,占空比恢复为60%。

验证方法与判定标准

验证步骤:

  1. 修正代码中TIM_Pulse为600,重新编译并烧录至目标板;
  2. 重复上述逻辑分析仪捕获流程,测量高电平时间与周期;
  3. 计算占空比 = 高电平时间 / 周期 × 100%。

判定标准:

  • 实测占空比在58%~62%范围内(即60%±2%),判定PWM配置正确,案例通过;
  • 若实测占空比仍偏离此范围,需进一步检查时钟配置(如HSE是否起振、PLL倍频系数)或GPIO复用设置。

注意:上述“预期值”为基于代码逻辑的确定性推算结果,实际测量值需通过逻辑分析仪真实捕获获得,不得以推算代替实测。