3. PWM输出频率与占空比测量
任务定义
本案例使用逻辑分析仪测量MCU输出的PWM信号,验证频率与占空比是否符合预期。目标是通过8通道逻辑分析仪捕获PWM波形,利用软件解码功能读取频率和占空比,并与MCU配置值对比,确认PWM输出正确。
硬件连接
将MCU的PWM输出引脚(本例使用PA8,对应TIM1_CH1)连接至逻辑分析仪的CH0通道。逻辑分析仪的地线必须与MCU共地,否则采样波形将不稳定。若被测信号为3.3V逻辑电平,逻辑分析仪无需分压;若为5V系统,需确认逻辑分析仪输入耐压范围。
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通道逻辑分析仪进行测量,操作步骤如下:
- 将逻辑分析仪插入电脑USB口,打开PulseView软件;
- 在软件界面选择采样率≥10MHz(建议20MHz),采样深度≥1M样本;
- 点击“扫描”按钮识别设备,选择正确的通道CH0;
- 点击“开始采集”按钮,等待采集完成;
- 在协议解码器列表中选择“PWM”或“频率/占空比测量”相关解码器;
- 将解码器通道指定为CH0,设置阈值电压为1.65V(3.3V逻辑半电平);
- 读取解码结果中的频率和占空比数值。
验证方法与判定标准
完成采集后,在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倍以上)。