【WCH蓝牙系列芯片】-基于CH592开发板—定时器PWM周期中断(动态修改PWM)
-------------------------------------------------------------------------------------------------------------------------------------
在CH592的EVT程序中,TMR定时器功能例程中只有PWME输出例程,通过PB22配置PWM口。
设置定时器3的PWM周期为100us,计算公式为:周期(微秒)= (计数值) / (主频MHz),这里主频为60MHz,计数值为60 * 100 = 6000


在原有的例程上进行修改程序,添加定时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); // 更新占空比 } }
浙公网安备 33010602011771号