3. PWM输出频率与占空比测量

PWM输出频率与占空比测量 学习卡片

任务定义

本案例使用逻辑分析仪测量MCU输出的PWM信号,验证频率与占空比是否符合预期。目标是通过8通道逻辑分析仪捕获PWM波形,利用软件解码功能读取频率和占空比,并与MCU配置值对比,确认PWM输出正确。

硬件连接

将MCU的PWM输出引脚(本例使用PA8,对应TIM1_CH1)连接至逻辑分析仪的CH0通道。逻辑分析仪的地线必须与MCU共地,否则采样波形将不稳定。若被测信号为3.3V逻辑电平,逻辑分析仪无需分压;若为5V系统,需确认逻辑分析仪输入耐压范围。

MCU STM32G0系列 TIM1_CH1 PA8 GND 逻辑分析仪 8通道 USB CH0 GND 采样率 ≥ 10MHz 采样深度 ≥ 1M样本 信号线 共地线 注意:逻辑分析仪GND必须与MCU GND可靠连接,否则波形毛刺严重

MCU端PWM配置代码

以下代码基于STM32G0系列HAL库,配置TIM1_CH1输出1kHz、占空比60%的PWM信号。使用内部时钟源,预分频器设为64-1,自动重载值设为1000-1,这样PWM频率为64MHz/(64×1000)=1kHz。

// pwm_config.h
#ifndef PWM_CONFIG_H
#define PWM_CONFIG_H

#include "stm32g0xx_hal.h"

void PWM_Init(void);
void PWM_Start(void);

#endif
// pwm_config.c
#include "pwm_config.h"

TIM_HandleTypeDef htim1;
TIM_OC_InitTypeDef sConfigOC;

void PWM_Init(void)
{
    __HAL_RCC_TIM1_CLK_ENABLE();
    
    htim1.Instance = TIM1;
    htim1.Init.Prescaler = 64 - 1;          // 64MHz/64 = 1MHz计数频率
    htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
    htim1.Init.Period = 1000 - 1;           // 1MHz/1000 = 1kHz PWM频率
    htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
    htim1.Init.RepetitionCounter = 0;
    htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
    HAL_TIM_PWM_Init(&htim1);
    
    sConfigOC.OCMode = TIM_OCMODE_PWM1;
    sConfigOC.Pulse = 600;                  // 占空比 = 600/1000 = 60%
    sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
    sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
    HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1);
    
    // 使能TIM1通道1对应的GPIO:PA8
    __HAL_RCC_GPIOA_CLK_ENABLE();
    GPIO_InitTypeDef GPIO_InitStruct = {0};
    GPIO_InitStruct.Pin = GPIO_PIN_8;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    GPIO_InitStruct.Alternate = GPIO_AF1_TIM1;  // STM32G0系列PA8复用为TIM1_CH1
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}

void PWM_Start(void)
{
    HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
}
// main.c 调用示例
#include "pwm_config.h"

int main(void)
{
    HAL_Init();
    PWM_Init();
    PWM_Start();
    
    while (1)
    {
        // 持续输出PWM,等待逻辑分析仪测量
    }
}

逻辑分析仪测量步骤

使用PulseView软件(sigrok)配合8通道逻辑分析仪进行测量,操作步骤如下:

  1. 将逻辑分析仪插入电脑USB口,打开PulseView软件;
  2. 在软件界面选择采样率≥10MHz(建议20MHz),采样深度≥1M样本;
  3. 点击“扫描”按钮识别设备,选择正确的通道CH0;
  4. 点击“开始采集”按钮,等待采集完成;
  5. 在协议解码器列表中选择“PWM”或“频率/占空比测量”相关解码器;
  6. 将解码器通道指定为CH0,设置阈值电压为1.65V(3.3V逻辑半电平);
  7. 读取解码结果中的频率和占空比数值。

验证方法与判定标准

完成采集后,在PulseView中观察CH0波形,应看到稳定的方波信号。使用光标测量一个完整周期的时间T,频率f=1/T。使用解码器读取的占空比应为高电平时间与周期之比。

判定标准:

  • 频率测量值在1kHz±1%范围内(即990Hz~1010Hz)视为通过;
  • 占空比测量值在60%±2%范围内(即58%~62%)视为通过;
  • 波形无明显毛刺、抖动或电平漂移。

若测量结果超出上述范围,检查MCU时钟配置是否正确、预分频器与自动重载值是否计算有误、GPIO复用功能是否配置正确。

常见问题排查

  • 无波形输出:检查GPIO复用功能是否正确(PA8对应AF1),确认TIM1时钟已使能;
  • 频率偏差大:确认系统时钟是否为64MHz,若使用HSI内部时钟,实际频率可能为64MHz±1%,需用示波器校准;
  • 占空比偏差:检查Pulse寄存器值是否写入正确,确认自动重载值未溢出;
  • 波形毛刺:检查共地连接是否可靠,采样率是否足够高(至少为信号频率的10倍以上)。