【WCH蓝牙系列芯片】-基于CH592开发板—定时器PWM周期中断(动态修改PWM)

-------------------------------------------------------------------------------------------------------------------------------------

  在PWM周期结束后进入中断处理服务函数(ISR)的这个操作,应用场景非常广泛,特别是在需要精确控制和监测中。如:LED调光控制电机速度控制、传感器数据采集、电源管理、音频信号生成等。

  在CH592的EVT程序中,TMR定时器功能例程中只有PWME输出例程,通过PB22配置PWM口。

  设置定时器3的PWM周期为100us,计算公式为:周期(微秒)= (计数值) / (主频MHz),这里主频为60MHz,计数值为60 * 100 = 6000

  设置PWM信号的占空比为50%,计算公式为:占空比 = (数据宽度) / (周期计数值),这里数据宽度为3000,周期计数值为6000,占空比为50%

  通过逻辑分析仪,可以看到PWM占空比波形,占空比是50%

 

  在原有的例程上进行修改程序,添加定时3中断使能,并且将中断标志设置为PWM周期结束标志。在中断服务函数中进行翻转PB15的IO口电平状态。

  通过逻辑分析仪,可以看到占空比波形,可以观察到PWM输出一个周期之后,PB15从低电平到高电平,第二个周期结束之后,PB15从高电平到低电平

  在中断服务函数中可以进行对PWM的占空比实时动态更改,通过逻辑分析仪,观察整个占空比波形变化

GPIOB_SetBits(GPIO_Pin_15);
GPIOB_ModeCfg(GPIO_Pin_15, GPIO_ModeOut_PP_5mA);
​
GPIOB_ResetBits(GPIO_Pin_22); // 配置PWM口 PB22
GPIOB_ModeCfg(GPIO_Pin_22, GPIO_ModeOut_PP_5mA);
TMR3_PWMInit(High_Level, PWM_Times_1);
TMR3_PWMCycleCfg(60 * 100); // 周期 100us  最大67108864
TMR3_PWMActDataWidth(3000); // 占空比 50%, 修改占空比必须暂时关闭定时器
TMR3_PWMEnable();  //启动PWM功能
TMR3_Enable();  // 启用定时器3,开始计时和PWM信号输出
TMR3_ITCfg(ENABLE, TMR0_3_IT_CYC_END);  // 使能周期结束标志   PWM-周期结束
PFIC_EnableIRQ(TMR3_IRQn);  //使能定时器3的中断
​
__INTERRUPT
__HIGH_CODE
void TMR3_IRQHandler(void)
{
    if(TMR3_GetITFlag(RB_TMR_IF_CYC_END))
    {
        TMR3_ClearITFlag(RB_TMR_IF_CYC_END); //清除中断标志
        GPIOB_InverseBits(GPIO_Pin_15);  //翻转PB15io状态
// 动态调整占空比
           static uint16_t dutyCycle = 3000; // 初始占空比 50%
           dutyCycle = (dutyCycle == 3000) ? 1500 : 3000; // 切换占空比
           TMR3_PWMActDataWidth(dutyCycle); // 更新占空比
    }
}

 


 

 

posted on 2025-03-31 17:10  凡仕  阅读(186)  评论(0)    收藏  举报