打印
[技术问答]

请教一下有关PWM的问题。

[复制链接]
833|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
PWM, PA, gp, sy, UL, IO
使用新唐单片机M433。初始化pwm,开启周期中断。在中断里面将一个IO口拉高,再拉低。发现有很长一段时L间,PWM是没有周期中断的,请问这是为什么。周期中断不应该一直都有吗。
void ePWM0_Init()
{
        CLK_EnableModuleClock(EPWM0_MODULE);   
        CLK_SetModuleClock(EPWM0_MODULE, CLK_CLKSEL2_EPWM0SEL_PLL, (uint32_t)NULL);//EPWM时钟频率来源于PLL.EPWMx_CLK = 144,000,000HZ
   
    SYS->GPA_MFPL &= ~(SYS_GPA_MFPL_PA5MFP_Msk | SYS_GPA_MFPL_PA4MFP_Msk | SYS_GPA_MFPL_PA3MFP_Msk | SYS_GPA_MFPL_PA2MFP_Msk);
    SYS->GPA_MFPL |= (SYS_GPA_MFPL_PA5MFP_EPWM0_CH0 | SYS_GPA_MFPL_PA4MFP_EPWM0_CH1 | SYS_GPA_MFPL_PA3MFP_EPWM0_CH2 | SYS_GPA_MFPL_PA2MFP_EPWM0_CH3);
   
    EPWM_ConfigOutputChannel(EPWM0, 0, 4000, 50);   
    EPWM_EnableOutput(EPWM0, EPWM_CH_0_MASK);
   
    EPWM_EnablePeriodInt(EPWM0, 0, 0);
    NVIC_EnableIRQ(EPWM0P0_IRQn);   
   
    EPWM_Start(EPWM0, EPWM_CH_0_MASK);     
}
void EPWM0P0_IRQHandler(void)
{
    uint16_t u=100;
   
    if(EPWM_GetPeriodIntFlag(EPWM0, 0))        
    {
        PF4 = 1;
        EPWM_ClearPeriodIntFlag(EPWM0, 0);
        while(u--);//3.5us
        PF4 = 0;        
    }
}

417.jpg (738.62 KB )

417.jpg

使用特权

评论回复
沙发
稳稳の幸福| | 2025-4-17 15:53 | 只看该作者
中断处理时间过长
虽然while(u--)循环仅约3.5µs,但需确认实际延时是否符合预期。若主频或优化导致循环耗时更长,可能导致中断丢失。

解决方案:移除或缩短延时,或改用硬件定时器实现精确延时。

使用特权

评论回复
板凳
稳稳の幸福| | 2025-4-17 15:53 | 只看该作者
PWM频率配置错误
EPWM_ConfigOutputChannel的第三个参数可能被误解为频率(Hz),但实际可能需传入周期计数值。
若PLL时钟为144MHz,配置4000Hz的正确周期值为:
uint32_t period = 144000000 / 4000; // = 36000
EPWM_ConfigOutputChannel(EPWM0, 0, period, 50);

用示波器检查PWM输出引脚(PA5)的实际频率。

使用特权

评论回复
地板
稳稳の幸福| | 2025-4-17 15:54 | 只看该作者
中断触发条件配置错误
EPWM_EnablePeriodInt(EPWM0, 0, 0)的第三个参数可能需指定触发时机(如上升/下降沿)。

使用特权

评论回复
5
稳稳の幸福| | 2025-4-17 15:54 | 只看该作者
中断标志未正确清除
虽然代码中调用了EPWM_ClearPeriodIntFlag,但需确认该函数是否实际清除对应寄存器标志。

使用特权

评论回复
6
稳稳の幸福| | 2025-4-17 15:54 | 只看该作者
优先级或中断使能问题
确保没有其他高优先级中断阻塞PWM中断。

检查NVIC_EnableIRQ(EPWM0P0_IRQn)是否确实启用中断。

使用特权

评论回复
7
稳稳の幸福| | 2025-4-17 15:54 | 只看该作者
验证PWM配置:
// 计算正确的周期值
uint32_t pwmFreq = 4000;
uint32_t clock = 144000000; // PLL时钟
uint32_t period = clock / pwmFreq;
EPWM_ConfigOutputChannel(EPWM0, 0, period, 50);

使用特权

评论回复
8
稳稳の幸福| | 2025-4-17 15:55 | 只看该作者
简化中断处理函数:
void EPWM0P0_IRQHandler(void) {
    if(EPWM_GetPeriodIntFlag(EPWM0, 0)) {
        PF4 = 1;
        EPWM_ClearPeriodIntFlag(EPWM0, 0);
        PF4 = 0; // 移除延时,仅测试中断触发
    }
}

使用特权

评论回复
9
syh2431| | 2025-4-17 20:08 | 只看该作者
高手云集……

使用特权

评论回复
10
j543211| | 2025-4-19 08:47 | 只看该作者
看不懂

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

6

帖子

0

粉丝