芯源半导体CW32
直播中

张秀兰

8年用户 1341经验值
私信 关注
[问答]

pwm关闭后,有杂波怎么解决?

使用cw32l083的芯片,用GtiM3-CH3,PA11输出38K的pwm发送红外信号,使能定时器后,即使占空比设为0,也会输出杂波,或者关闭定时器,也会有杂波,大概要怎么配置呢?

回帖(1)

路过秋天

2025-11-28 18:12:53

针对CW32L083芯片使用GTIM3-CH3(PA11)输出38K PWM后关闭出现杂波的问题,可通过以下步骤排查和解决:


问题原因分析



  1. 引脚状态未复位:关闭PWM后引脚可能进入高阻态(Hi-Z),易受外界干扰产生杂波。

  2. 寄存器残余配置:定时器关闭后输出比较逻辑可能未完全复位。

  3. 硬件电路干扰:红外发射管驱动电路设计缺陷(如缺失下拉电阻)。


解决方案代码(基于标准外设库)


// 停止PWM输出并消除杂波
void PWM_Stop(void) {
    // 1. 强制输出低电平(覆盖PWM输出)
    GTIM_ForceOutputChannelCmd(CW_GTIM3, GTIM_CHANNEL3, GTIM_ForcedAction_Inactive);

    // 2. 关闭GTIM3定时器
    GTIM_Cmd(CW_GTIM3, DISABLE);

    // 3. 重配PA11为普通GPIO输出低电平
    GPIO_InitTypeDef gpio_init = {0};
    gpio_init.Pins = GPIO_PIN_11;
    gpio_init.Mode = GPIO_MODE_OUTPUT_PP;  // 推挽输出
    gpio_init.IT = GPIO_IT_NONE;
    GPIO_Init(CW_GPIOA, &gpio_init);
    GPIO_WritePin(CW_GPIOA, GPIO_PIN_11, GPIO_Pin_RESET);  // 强制拉低
}

// 启动PWM输出
void PWM_Start(uint16_t duty) {
    // 切换PA11为复用功能
    GPIO_InitTypeDef gpio_init = {0};
    gpio_init.Pins = GPIO_PIN_11;
    gpio_init.Mode = GPIO_MODE_OUTPUT_PP_AF;  // 复用推挽
    GPIO_Init(CW_GPIOA, &gpio_init);

    // 取消强制输出,恢复PWM模式
    GTIM_ForceOutputChannelCmd(CW_GTIM3, GTIM_CHANNEL3, GTIM_ForcedAction_Disabled);

    // 设置新占空比并启动定时器
    GTIM_SetCompare3(CW_GTIM3, duty);
    GTIM_Cmd(CW_GTIM3, ENABLE);
}

关键配置说明




  1. 强制输出低电平


    GTIM_ForceOutputChannelCmd(CW_GTIM3, GTIM_CHANNEL3, GTIM_ForcedAction_Inactive);

    在关闭定时器前强制通道输出低电平(非激活电平),避免瞬时高阻态。




  2. 双重引脚控制



    • 关闭PWM后立即将PA11切换为普通GPIO并拉低,确保物理电平稳定。

    • 启动PWM前恢复复用功能,防止引脚冲突。




  3. 定时器基础配置(初始化时需包含):


    // 时钟使能
    RCC_APB2PeriphClk_Enable(RCC_APB2PERIPH_GTIM3, ENABLE);
    RCC_AHBPeriphClk_Enable(RCC_AHB_PERIPH_GPIOA, ENABLE);

    // GTIM3初始化
    GTIM_InitTypeDef tim_init = {
       .Prescaler = prescaler,     // 计算:系统时钟/(38kHz * reload_period)
       .ReloadValue = reload_period,
       .Mode = GTIM_MODE_TIME,
       .OneShotMode = GTIM_COUNT_CONTINUE,
    };
    GTIM_TimeBaseInit(CW_GTIM3, &tim_init);

    // PWM通道配置
    GTIM_OCInitTypeDef oc_init = {
       .OCMode = GTIM_OCMODE_PWM1,
       .OCPolarity = GTIM_OCPOLARITY_HIGH,  // 高电平有效
       .OCState = GTIM_OCSTATE_ENABLE,
       .OCValue = 0,  // 初始占空比0
    };
    GTIM_OC3Init(CW_GTIM3, &oc_init);



硬件设计建议



  1. 添加下拉电阻

    • 在PA11与GND之间并联10kΩ电阻,避免高阻态时引入干扰。


  2. 驱动电路优化

    • 检查红外发射管驱动三极管(如用)的基极限流电阻,确保开关特性干净。

    • 电源端增加0.1μF去耦电容。



验证步骤



  1. 用示波器观察PWM_Stop()调用后的PA11波形,确认是否稳定低电平。

  2. 检查关闭PWM时系统功耗变化,排除其他外设干扰。

  3. 若仍有杂波,尝试降低GPIO输出速度(初始化时添加gpio_init.Speed = GPIO_SPEED_LOW;)。



注意事项:切换GPIO模式时需确保定时器已关闭,否则可能引发总线冲突。通过强制输出+引脚模式切换的组合操作,可彻底消除关闭PWM后的杂波问题。


举报

更多回帖

发帖
×
20
完善资料,
赚取积分