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