CH58xPWM功能
前言:
针对CH58x芯片使用PWM进行讲解,围绕两方面:TMR产生PWM和PWM。
TMR_PWM
定时器产生的PWM分为直接输出和DMA配置输出。一般建议使用DMA。
默认例程配置PWM持续输出,没有停止。如下配置可以停止PWM。
int main(){
SetSysClock(CLK_SOURCE_PLL_60MHz);
GPIOB_SetBits(GPIO_Pin_7 | GPIO_Pin_4);
GPIOB_ModeCfg(GPIO_Pin_7 | GPIO_Pin_4, GPIO_ModeOut_PP_5mA);
mDelaymS(500);
#if 1 /* 定时器2,DMA PWM.*/
GPIOB_ModeCfg(GPIO_Pin_11, GPIO_ModeOut_PP_5mA);
GPIOPinRemap(ENABLE, RB_PIN_TMR2);
TMR2_PWMCycleCfg(60000); //周期=参数/系统主频=1ms
PwmBuf[0]=00; //起始电平给0,否则会出现第一个电平只有1组的情况。给0规避该问题。
PwmBuf[1]=6000; //占空比:低电平Low_Level=6000/60000*1ms
PwmBuf[2]=12000;
PwmBuf[3]=18000;
TMR2_PWMInit(Low_Level, PWM_Times_4 ); //先init,再cfg,否则第一个PWM波形会出一个。tmies4代表相同的波形循环4次。
TMR2_DMACfg(ENABLE, (uint16_t)(uint32_t)&PwmBuf[0], (uint16_t)(uint32_t)&PwmBuf[4], Mode_Single);//输出4组,第1组为0,所以波形为3组
TMR2_PWMEnable();
TMR2_Enable();
TMR2_ClearITFlag(TMR1_2_IT_DMA_END);
PFIC_EnableIRQ(TMR2_IRQn);
TMR2_ITCfg(ENABLE, TMR1_2_IT_DMA_END);
#endif
while(1);
}
__INTERRUPT
__HIGH_CODE
void TMR2_IRQHandler(void){
if(TMR2_GetITFlag(TMR1_2_IT_DMA_END)){
GPIOB_InverseBits(GPIO_Pin_7);
R16_TMR2_DMA_BEG = (uint16_t)(uint32_t)&TestBuf[10];//关闭PWM,控制输出次数,避免一直输出波形
R16_TMR2_DMA_END = (uint16_t)(uint32_t)&TestBuf[11];//DMA清除标志需要手动修改地址,地址传递需要4字节对齐
TMR2_ClearITFlag(TMR1_2_IT_DMA_END);
PFIC_DisableIRQ(TMR2_IRQn);
TMR2_ITCfg(DISABLE, TMR1_2_IT_DMA_END);
/* DMA 结束 */
/* 用户可自行添加需要的处理 */
}
}
定时器产生PWM的进入中断:DMA(endAddr - startAddr)*PWM有效输出重复次数=进入1次中断。即(4-0)*4,去掉1次为0的占空比,则12个周期进入1次中断。
PWM速度:
CH582芯片,主频跑60M。
- 定时器产生PWM最高可以跑到20M;
- 直接跑PWM最高跑2M不到。
左图,定时器产生PWM速度;右图,直接PWM速度: