2. 案例2
任务定义
本案例要求使用逻辑分析仪捕获MCU输出的PWM波形,通过测量实际占空比并与设定值比对,定位PWM配置错误。目标板为STM32F103C8T6最小系统板,定时器TIM3的CH1(PA6)输出PWM,设定频率1kHz、占空比60%。若实测占空比偏离设定值超过±2%,判定配置存在错误,需按排查流程修正。
硬件连接与测量拓扑
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逻辑分析仪(或兼容设备),按以下步骤操作:
- 将逻辑分析仪CH0通道探针连接至PA6引脚,GND探针连接至系统公共地;
- 打开逻辑分析软件,设置采样率10MS/s(每周期采样10000点,足够精确测量1kHz信号);
- 设置触发条件为CH0上升沿,捕获时长10ms(约10个完整周期);
- 点击“开始”后给MCU上电或复位,自动捕获波形;
- 在软件中使用“测量”工具,分别测量高电平时间、低电平时间和周期。
测量结果与错误判定
捕获波形后,测量工具应显示以下数据(预期值,非实测结果):
- 周期: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%。
验证方法与判定标准
验证步骤:
- 修正代码中
TIM_Pulse为600,重新编译并烧录至目标板; - 重复上述逻辑分析仪捕获流程,测量高电平时间与周期;
- 计算占空比 = 高电平时间 / 周期 × 100%。
判定标准:
- 实测占空比在58%~62%范围内(即60%±2%),判定PWM配置正确,案例通过;
- 若实测占空比仍偏离此范围,需进一步检查时钟配置(如HSE是否起振、PLL倍频系数)或GPIO复用设置。
注意:上述“预期值”为基于代码逻辑的确定性推算结果,实际测量值需通过逻辑分析仪真实捕获获得,不得以推算代替实测。