This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

急求28335EPWM与外部脉冲同步的设置方法



各位老师好!

我想利用外部的脉冲通过GPIO6口输入,实现Epwm与外部信号同步的功能,并且想将Epwm2与Epwm3之间的同步信号断开,使Epwm3之后的同步信号仅与Epwm3关联。苦于对Epwm及GPIO设置不熟练,一直无法实现,且没有找到相关例程,想求助一下各位老师,希望获得一个详细的设置步骤,万分感谢!

  • 1、设置GPIO6功能为EPWMSYNCI(其它I/O引脚的功能不能为EPWMSYNCI)

    2、设置EPWM2、EPWM3及...对应的IO引脚功能

    3、初始化EPWM1关于外部同步信号的设置

    EPwm1Regs.TBPHS.half.TBPHS = 0x0000;

    EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN;  // TB_SYNC_IN = 0

    其它设置自己参考datesheet

    4、设置EPWM2关于外部同步信号的设置

    EPwm2Regs.TBPHS.half.TBPHS = 0x0000;

    EPwm2Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_DISABLE;  // TB_SYNC_DISABLE = 3

    5、设置EPWM3关于外部同步信号的设置

    EPwm3Regs.TBPHS.half.TBPHS = 0x0000;

    EPwm3Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO;  // TB_CTR_ZERO = 1

    5、设置EPWM4关于外部同步信号的设置

    EPwm4Regs.TBPHS.half.TBPHS = 0x0000;

    EPwm4Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN;  // TB_SYNC_IN = 0

  • onebyte老师您好,感谢您的回复。

    现在可以同步了,由于GPIO6口和GPIO32口都被占用了,因此是通过ECap将外部同步信号输入,再在ECap1的中断中加入语句:
    EALLOW;
    EPwm1Regs.TBCTL.bit.SWFSYNC = 1;
    EDIS;

    通过软件置位的方式将预设相位值EPwm1Regs.TBPHS.half.TBPHS载入。
    但目前实现的现象是外部同步信号和片内PWM1信号基本同步,两个方波基本相对静止,但有90度左右的相位差,且这个相位差还有10多度左右的不稳定偏移。

    不知道这种软件置位的方法是否比直接EPWMxSynci引脚输入的效果差?产生同步相位差的原因是否是主程序中其他中断造成的延时引起?
    烦请老师指点一下,谢谢!!

  • 我尝试了不用EPwm1Regs.TBCTL.bit.SWFSYNC = 1; 语句触发相位重置,而改通过GPIO32输入同步信号,结果同步PWM波形中的不稳定偏移消失了,分析其原因可能是高频信号杂波干扰了输入的同步信号,造成ECAP1的误触发(原来同步信号是通过ECAP1输入的,软件重置PWM1相位的语句写在ECAP1的中断中)。

    但是,外部同步脉冲和产生的PWM1波形之间仍然有90度的相位差。请教各位老师是何原因?

  • 问题解决了,是PWM1初相设置的问题,自己马虎大意了。谢谢各位老师。

  • 你有QQ吗,我也需要EPWM外部同步,能留个QQ交流下不
    (*ePWM[n]).TBCTL.bit.PRDLD = 1; // set Immediate load
    (*ePWM[n]).TBPRD = period;
    (*ePWM[n]).CMPA.half.CMPA = period/2; // Fix duty at 50%
    (*ePWM[n]).TBPHS.half.TBPHS = 0;
    (*ePWM[n]).TBCTR = 0;

    (*ePWM[n]).TBCTL.bit.PHSEN = 1;
    (*ePWM[n]).TBCTL.bit.SYNCOSEL =TB_SYNC_IN;
    (*ePWM[n]).TBCTL.bit.CTRMODE = TB_COUNT_UP;
    //used to sync EPWM(n+1) "down-stream"
    (*ePWM[n]).TBCTL.bit.HSPCLKDIV = TB_DIV1;
    (*ePWM[n]).TBCTL.bit.CLKDIV = TB_DIV1;
    (*ePWM[n]).AQCTLA.bit.PRD = AQ_SET;
    (*ePWM[n]).AQCTLA.bit.CAU = AQ_CLEAR;
    (*ePWM[n]).DBCTL.bit.OUT_MODE = DB_FULL_ENABLE;
    (*ePWM[n]).DBCTL.bit.POLSEL = DB_ACTV_LOC; // Active Hi Complimentary
    (*ePWM[n]).DBRED = 200; // dummy value for now
    (*ePWM[n]).DBFED = 200; // dummy value for now
    N=1,我从片的设置,用的GPIO32输入的,不知道为什么还是同步不了
  • 我现在EPwm1Regs.TBSTS.bit.SYNCI=1 状态检测有同步信号输入,示波器测同步波形也正常
    (*ePWM[n]).TBCTL.bit.PRDLD = 1; // set Immediate load
    (*ePWM[n]).TBPRD = period;
    (*ePWM[n]).CMPA.half.CMPA = period/2; // Fix duty at 50%
    (*ePWM[n]).TBPHS.half.TBPHS = 0;
    (*ePWM[n]).TBCTR = 0;

    (*ePWM[n]).TBCTL.bit.PHSEN = 1;
    (*ePWM[n]).TBCTL.bit.SYNCOSEL =TB_SYNC_IN;
    (*ePWM[n]).TBCTL.bit.CTRMODE = TB_COUNT_UP;
    //used to sync EPWM(n+1) "down-stream"
    (*ePWM[n]).TBCTL.bit.HSPCLKDIV = TB_DIV1;
    (*ePWM[n]).TBCTL.bit.CLKDIV = TB_DIV1;
    (*ePWM[n]).AQCTLA.bit.PRD = AQ_SET;
    (*ePWM[n]).AQCTLA.bit.CAU = AQ_CLEAR;
    (*ePWM[n]).DBCTL.bit.OUT_MODE = DB_FULL_ENABLE;
    (*ePWM[n]).DBCTL.bit.POLSEL = DB_ACTV_LOC; // Active Hi Complimentary
    (*ePWM[n]).DBRED = 200; // dummy value for now
    (*ePWM[n]).DBFED = 200; // dummy value for now
    这是我的配置,表笔也共地了,两块DSP的EPWM1还是无法同步,是配置错了还是少了个什么必要条件,能帮忙解答下吗