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速度:

PWM计算:

posted @ 2023-09-05 10:45  SweetTea_lllpc  阅读(304)  评论(1编辑  收藏  举报