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.

[参考译文] TMS320F2.8377万S:TMS320F2.8377万S

Guru**** 2484615 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/638646/tms320f28377s-tms320f28377s

部件号:TMS320F2.8377万S

你(们)好

我需要生成一个40 kHz的PWM正弦曲线。 PWM频率设置为160 kHz。 根据Matlab的说法,信号应该是周期性的,在一个正弦波周期内,PWM变化不多。 但我收到的信号不是周期性的,看起来像是工作周期的持续变化。 它也在示波器的屏幕上滚动。 仅当我禁用中断时,来自EPWM7/9的两个信号都是稳定的正方形。 我附上了示波器的两个屏幕截图。 我浏览了关于这个问题的许多文章,但仍然无法找到解决我的问题的办法。 我怀疑该问题可能与正弦波高频的中断延迟有关。

非常感谢!

Vadim

//###################################################################
//###################################################################
//
//包含的文件
//
#include "F28x_Project.h"
包含"math.h"
//
//函数原型
//
void ConfigureEPwm7(void);
void ConfigureEPwm9 (void);
中断无效EPwm9_ISR(void);
//
//定义
//
#Define PI 3.141
//
//全局
//
UINT16 A;
UINT16 TBPRD = 512;//160 kHz ePWM
UINT16正弦= 4;// 40 kHz正弦
UINT16 SineLUT [512/4];
Void主(void)
  InitSysCtrl();
  此示例跳过InitGpio();//
  EALLOW;  //在sysctrl文件中设置时钟81.875 MHz IMULT =32 FMULT =.75 dev/4
/*    GpioCtrlRegs.GPCPUD.bit.GPIO71 = 0; //禁用上拉
    gpioCtrlRegs.GPCDIR.bit.GPIO71 = 1;//配置为输出
    GpioCtrlRegs.GPCMUX1.bit.GPIO73=3;//外部CLC
    ClkCfgRegs.CLKSRCCTL3.bit.XCLKOUTSEL = 2;//010 SYSCLK
    ClkCfgRegs.XCLKOUTDIVSEL.bit.XCLKOUTDIV = 0;//3 div x 8
  EDIS;
*/
  InitEPwm7Gpio();//检查ePWM
  Initepwm9Gpio();
  EALLOW;
  ClkCfgRegs.PERCLKDIVSEL.bit.EPWMCLKDIV = 0;
  EDIS;
  色调;
  InitPieCtrl();
  IER = 0x0000;
  IFR = 0x0000;
  InitPieVectorTable();
  //
  //映射ISR功能
  //
    EALLOW;
    PieVectorTable.EPWM9_INT =&EPwm9_ISR;
    EDIS;
    EALLOW;
    CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 0;
    EDIS;
  //
  //启用全局中断和更高优先级的实时调试事件:
  //
    IER || M_INT3;//启用组3中断
    EINT; //启用全局中断INTM
    ERTM; //启用全局实时中断DBGM
    //
    //启用PIE中断
    //
    PieCtrlRegs.PIEIER3.bit.INTx9 = 1;//组3 INTx2 = EPwm2
  配置EPwm7();
  配置EPwm9();
  //正弦LUT
  for (A = 0;A < TBPRD/Sine;A++)
  {
    SineLUT[A]= ROUND (TBPRD/2*SIN (2*PI*SINE / TBPRD*A)+TBPRD/2);
    }
  EALLOW;
  CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 1;
  EDIS;
  做
  {
  }同时(1);
}
void配置EPwm7 (void)
  EPwm7Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP; //计数
  EPwm7Regs.TBPRD = TBPRD;            //设置计时器周期
  EPwm7Regs.CMPA.bit.CMPA = TBPRD/2;       //设置比较值
  EPwm7Regs.TBPHS.ALL = 0;
  EPwm7Regs.AQCTLA.bit.PRD = AQ_CLEAR;      //在句点清除PWM2A
  EPwm7Regs.AQCTLA.bit.CAU = AQ_SET;       //在事件A上设置PWM2A,
}
 void配置EPwm9()
  EPwm9Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;    //计数
  EPwm9Regs.TBPRD = TBPRD;              //设置计时器周期
  EPwm9Regs.CMPA.bit.CMPA = TBPRD/2;         //设置比较值
  EPwm9Regs.ETSEL.bit.inten = 1;           //int启用
  EPwm9Regs.ETSEL.bit.INTSEL = ET_CTR_PRD;     //计数期间在计数器中中断
  EPwm9Regs.ETPS.bit.INTPRD =ET_1ST;         //中断每个周期
  EPwm9Regs.AQCTLA.bit.PRD = AQ_CLEAR;        //在句点清除PWM2A
  EPwm9Regs.AQCTLA.bit.CAU = AQ_SET;        //在事件A上设置PWM2A,
}
中断无效EPwm9_ISR(void)
  EPwm9Regs.CMPA.bit.CMPA = SineLUT [A];// 40 kHz正弦
  如果(a<TBPRD/Sine) a++;
  否则A=0;
  EPwm9Regs.ETCLR.bit.INT = 1;//清除INT1标志
  PieCtrlRegs.PIEACG.ALL = PIEACK_Group3;
}
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Vadim,

    如果没有更多信息,我无法肯定问题是什么,但我可以从您的代码中看到您的行为顺序错误。  在启用中断并开始使用其内容之前,需要初始化LUT。  将EINT和ERTM指令移至While (1)循环之前,查看这是否会改善情况。

    此致,

    Richard

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Richard:
    感谢您的支持! 我尝试了你的建议。 它没有解决问题。
    谢谢Vadim
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Vadim,

    我需要更多信息。 您说您想使用160kHz PWM频率生成40kHz频率正弦波。 因此,您有一个重复模式,即工作周期的四个变化。 是这样吗?

    此致,

    Richard
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

      您好,Richard:

    我在我的代码中发现了一个错误。 A应该是每160 kHz只有四个样本。 我得到了更多的TBPRD/Sine。 不管怎样,我纠正了它,它给了我一个适当调制的PWM波。 但是,这种波形在示波器上从不像不改变比较值的蓝色方波那样稳定。 要正确查看,我必须在单模式下使用示波触发器。 FFT也不显示40 kHz。 如何计算中断延迟以及波形抖动的来源是什么?

    谢谢Vadim

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

     蓝色迹线的FFT是正确的160 kHz

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Vadim,

    很抱歉回复您的时间延迟。 如果您认为问题可能与中断计时有关,我建议切换一个I/O引脚(在ISR开始时将引脚设置为高,在结束时将其设置为低),并在示波器上与PWM一起观察。 这将告诉您ISR正在占用的CPU带宽,并可能为您提供有关正在发生的情况的提示。

    此致,

    Richard
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Richard:
    我想验证一下我的时钟的数学。 我在InitSysPll中有IMULT_32,FMULT_0pt75,PLLCLK_by。 如果我看一下XCLKOUT GPIO,我可以确认163.75MHz时钟。
    TBPRD为512,EPWMCLKDIV = 0。 根据该数据,我预计PWM的周期为31.98万,但我有该值的一半15.99万。 另一个/2发生在哪里?
    谢谢Vadim
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Vadim,

    如果您已将PWM计数器配置为向上向下计数模式,频率将减半,因为它必须在一个时间段内双向计数。

    此致,

    Richard

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Richard:
    我是这样配置的
    EPwm7Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;//计数
    谢谢Vadim
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Vadim,

    我注意到你在你的帖子中提到CLKDIV是/1,但HSPCLKDIV怎么样?  请注意,此寄存器位在设备重置时设置为/2。

    (请注意,此设备上ePWM的最大时钟速度应配置为100MHz -这是此外设在此特定设备系列上可以支持的最大时钟。  这就是为什么在复位时将HSPCLKDIV位配置为/2的原因)

    希望这能有所帮助!


    谢谢!
    Brett

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢Bret!
    这是额外的。 最后一件事,我使用的是哪种偏差:CLKDIV或HSPCLKDIV?
    谢谢Vadim
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    不,关键是ePWM的时钟频率不会高于数据表规格。

    谢谢!
    Brett