CH58xPWM功能

前言:

针对CH58x芯片使用PWM进行讲解,围绕两方面:TMR产生PWM和PWM。

TMR产生PWM

定时器产生的PWM分为直接输出和DMA配置输出。一般建议使用DMA。

定时器产生PWM的进入中断:DMA(endAddr - startAddr)*PWM有效输出重复次数=进入1次中断。

如图:

#if 1
    for(i=0; i<5; i++)
    {
      PwmBuf[i]=12000*i;
    }
    for(i=5; i<10; i++)
    {
      PwmBuf[i]=12000*(10-i);
    }
#else
    for(i=0; i<5; i++)
    {
        PwmBuf[i]=100000;
    }
    for(i=5; i<10; i++)
    {
        PwmBuf[i]=20000;
    }
#endif
    TMR2_DMACfg(ENABLE, (uint16_t)(uint32_t)&PwmBuf[0], (uint16_t)(uint32_t)&PwmBuf[10], Mode_LOOP);
    TMR2_PWMInit(High_Level, PWM_Times_4);

    TMR2_ClearITFlag(TMR1_2_IT_DMA_END);
    PFIC_EnableIRQ(TMR2_IRQn);
    TMR2_ITCfg(ENABLE, TMR1_2_IT_DMA_END);
#endif

__INTERRUPT
__HIGH_CODE
void TMR2_IRQHandler(void)
{
    if(TMR2_GetITFlag(TMR0_3_IT_CYC_END))
    {
        TMR2_ClearITFlag(TMR0_3_IT_CYC_END);
        /* 计数器计满,硬件自动清零,重新开始计数 */
        /* 用户可自行添加需要的处理 */
    }
    if(TMR2_GetITFlag(TMR1_2_IT_DMA_END))
    {
        GPIOB_InverseBits(GPIO_Pin_22);
        TMR2_ClearITFlag(TMR1_2_IT_DMA_END);
        PRINT("DMA end\n");
        /* DMA 结束 */
        /* 用户可自行添加需要的处理 */
    }
}

PWM速度:

CH582芯片,主频跑60M。

  • 定时器产生PWM最高可以跑到20M;
  • 直接跑PWM最高跑2M不到。

左图,定时器产生PWM速度;右图,直接PWM速度:

 

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