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.

[参考译文] CCS/TMS320F28379D:TMS320F28379D

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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/882683/ccs-tms320f28379d-tms320f28379d

器件型号:TMS320F28379D

工具/软件:Code Composer Studio

主席先生,

   我正在尝试使用正弦查找表生成正弦 PWM。 但我没有得到任何输出、您能告诉我错误的地方。 我从 e2e.ti.com 的另一个链接中引用的查找表。

谢谢你

Bighnaraj Panda

  1. #include "F28x_Project.h"
  2. //
  3. // 定义
  4. //
  5. #define sine_table_length 100
  6. #define EPWM1_TIMER_TBPRD  2500  // 周期 寄存器
  7. #define EPWM2_TIMER_TBPRD  2500
  8. #define EPWM3_TIMER_TBPRD  2500
  9.  
  10. #pragma DATA_SECTION (SineTable、"SineTableSection")
  11. uint32_t SineTable[sine_table_length]=
  12.  0x000000000000、0x41bc646b0x423c5e7a0x428d3f6d0x42b46b4、0x42eb421a0x430d1754、0x432484b3、0x433be7b1、0x435decd4、0x436a88a2、0x4380e1d24b、0x4324b、0x4424b、0x4324b、0x4324b、0x4324b、0x4324b、0x4324b、0x4324b、0x4324b、0x4324b、0x43a、0x43b、0x43b、0x43b、0x4324b、0x43b、0x43b、0x43b、0x43b、0x43b、0x43b、0x43b、0x43b、0x43b、0x43b、0x43b、0x43b、0x43b、0x43a、0x43b、0x43b、0x43b、0x43b、0x43b、0x43b、0x43b、0x43b、0x43b、0x43b、0x
  13.  0x44bb1ef7、0x44bb48f4、0x44bb6720、0x44bb7978、0x44bb7ffc
  14.  
  15. 对于         50% 占空 比、// CMPA 和 CMPB 总和应该为2500
  16. //
  17. int interrupt_count  =  1
  18. unsigned  long IntCount;
  19.  
  20. // 函数 原型
  21. void GPIO_setup  (void)
  22. void InitEPwm1Examples(void);
  23. void InitEPwm2Examples(void);
  24. void InitEPwm3Examples(void);
  25. _interrupt  void epwm1_ISR (void)
  26. _interrupt  void epwm2_ISR (void)
  27. _interrupt  void epwm3_ISR (void)
  28. //
  29. // 主函
  30. //
  31. void main (void)
  32.     InitSysCtrl()
  33.  
  34.     InitGpio()
  35.     GPIO_setup  ()
  36.  
  37.     CpuSysRegs.PCLKCR2.bit.EPWM1=1
  38.     CpuSysRegs.PCLKCR2.bit.EPWM2=1
  39.     CpuSysRegs.PCLKCR2.bit.EPWM3=1
  40.  
  41.     InitEPwm1Gpio()
  42.     InitEPwm2Gpio()
  43.     InitEPwm3Gpio()
  44.  
  45.     Dint
  46.  
  47.     InitPieCtrl()
  48.  
  49.     IER  =  0x0000
  50.     IFR  =  0x0000
  51.  
  52.     InitPieVectTable()
  53. //
  54.     EALLOW //     这是写入  EALLOW 受保护 寄存器所必需的
  55.     PieVectTable.EPWM1_INT  = &epwm1_ISR
  56.     PieVectTable.EPWM2_INT  = &epwm2_ISR
  57.     PieVectTable.EPWM3_INT  = &epwm3/ISR
  58.     EDIS   //     这是禁止 写入  EALLOW 受保护 寄存器所必需的
  59.  
  60.     EALLOW
  61.     CpuSysRegs.PCLKCR0.bit.TBCLKSYNC=0  
  62.     EDIS
  63.  
  64.     InitEPwm1Examples()
  65.     InitEPwm2Examples()
  66.     InitEPwm3Examples()
  67.  
  68.     EALLOW
  69.     CpuSysRegs.PCLKCR0.bit.TBCLKSYNC=1  
  70.     EDIS
  71.  
  72.     IER  |= M_INT3
  73.  
  74.     PieCtrlRegs.PIEIER3.bit.INTx1  =  1
  75.     PieCtrlRegs.PIEIER3.bit.INTx2  =  1
  76.     PieCtrlRegs.PIEIER3.bit.INTx3=1  
  77.  
  78. //
  79. // 启用 全局 中断 和  更高优先级 的实时 调试 事件:
  80. //
  81.     EINT  // 启用 全局 中断 INTM
  82.     ERTM  // 启用 全局 实时 中断 DBGM
  83.  
  84. //
  85. // 步骤   5.空闲 循环。  只 需坐下来  循环 ( 可选):
  86.  
  87.     while (1)
  88.     
  89.     
  90.  
  91. //
  92. // epwm1_ISR - EPWM1 ISR
  93. //
  94. _interrupt  void epwm1_ISR (void)
  95.     interrupt_count++
  96.  
  97.     当     计数器 递减 计数 = CMPB 时、//生成第二个中断
  98.     if (interrupt_count  =  2)
  99.         
  100.             GpioDataRegs.GPBDAT.bit.GPIO63  =  1 //将 GPIO-63设置 为高电平
  101. //            GpioDataRegs.GPBSET.BIO63 = 1; //将 GPIO-63设置 为高电平
  102. //            GpioDataRegs.GPADD.bit.GPIO14 = 1; //将 GPIO-14 设置为高电平
  103. //            GpioDataRegs.GPASET.bit.GPIO14 = 1; //将 GPIO-14 置为高电平
  104.             EPwm1Regs.ETSEL.bit.INTSEL  =  7
  105.         
  106.  
  107.     //     当计数器 递减 计数 = CMPB 时生成中断
  108.     // 当        计数 器递增 计数 = CMPA 时、复位下一个中断以再次生成
  109.     其他
  110.     
  111.         GpioDataRegs.GPBDAT.bit.GPIO63  =  0 //将 GPIO-63设置 为低电平
  112. //            GpioDataRegs.GPBCLEAR.bit.GPIO63 = 1; //将 GPIO-63设置 为低电平
  113. //            GpioDataRegs.GPADAT.bit.GPIO14 = 0; //将 GPIO-14 设置为低电平
  114. //            GpioDataRegs.GPACLEAR.bit.GPIO14 = 1; //将 GPIO-14 置为低电平
  115.         EPwm1Regs.ETSEL.bit.INTSEL  =  4
  116.         INTERRUPT_COUNT  =  1
  117.     
  118.  
  119.     EPwm1Regs.ETCLR.bit.INT  =  1
  120.     PieCtrlRegs.PIEACX.ALL  = PIEACK_Group3
  121.     if ( IntCount  <  100)
  122.         
  123.            IntCount++
  124.         
  125.         其他
  126.             IntCount  =  0
  127. _interrupt  void epwm2_ISR (void)
  128. EPwm2Regs.ETCLR.bit.INT  =  1
  129. PieCtrlRegs.PIEACX.ALL  = PIEACK_Group3
  130. if ( IntCount  <  100)
  131.     
  132.        IntCount++
  133.     
  134.     其他
  135.         IntCount  =  0
  136. _interrupt  void epwm3_ISR (void)
  137.     // 清除     此计时器的 INT 标志
  138.     //
  139.     EPwm3Regs.ETCLR.bit.INT  =  1
  140.  
  141.     //
  142.     // 确认 此 中断 以 接收 来自   组 3的更多中断
  143.     //
  144.     PieCtrlRegs.PIEACX.ALL  = PIEACK_Group3
  145.     if ( IntCount  <  100)
  146.         
  147.            IntCount++
  148.         
  149.         其他
  150.             IntCount  =  0
  151. //
  152. // InitEPwm1Example-Initialize   EPWM1 配置
  153. //
  154.  InitEPwm1Examples()
  155.     //
  156.     // 设置 TBCLK
  157.     //
  158.  
  159.     EPwm1Regs.TBPRD  = EPWM1_TIMER_TBPRD       // 设置 计时 器周期 801 TBCLK
  160.     EPwm1Regs.TBPHS.bit.TBPHS  =  0x0000        // 相 位为 0
  161.     EPwm1Regs.TBCTR  =  0x0000                  // 清除 计数器
  162.  
  163.     //
  164.     // 设置 比较 值
  165.     //
  166.     EPwm1Regs.CMPA.bit.CMPA  = SineTable[IntCount]    // 设置 比较 A 值
  167.     EPwm1Regs.CMPB.BIT.CMPB  = SineTable[IntCount]    // 设置 比较 B 值
  168.  
  169.     //
  170.     // 设置 计数 器模式
  171.     //
  172.     EPwm1Regs.TBCTL.bit.CTRMODE  = TB_COUNT_UPDOWN // 向上和   向下计数
  173.     EPwm1Regs.TBCTL.bit.PHSEN  = TB_DISABLE        // 禁用 相 位加载
  174.     EPwm1Regs.TBCTL.bit.HSPCLKDIV  = TB_DIV1       // 时钟  与 SYSCLKOUT 的比率
  175.     EPwm1Regs.TBCTL.bit.CLKDIV  = TB_DIV1
  176.  
  177.     //
  178.     // 设置 操作
  179.     //
  180.     EPwm1Regs.AQCTLA.bit.CAU  = AQ_SET            // 在   事件 A 上设置 PWM1A、递增
  181.                                                   // 计数
  182.     EPwm1Regs.AQCTLA.bit.CAD  = AQ_CLEAR          //    在事件 A 上清除 PWM1A、
  183.                                                   // 倒计数  
  184.  
  185.     EPwm1Regs.AQCTLB.bit.CBU  = AQ_SET            // 在   事件 B 上设置 PWM1B、向上
  186.                                                   // 计数
  187.     EPwm1Regs.AQCTLB.bit.CBD  = AQ_CLEAR          //    在事件 B 上清除 PWM1B、
  188.                                                   // 倒计数  
  189.  
  190.     //
  191.     // 中断 ,我们将   在其中更改  比较 值
  192.     //
  193.     EPwm1Regs.ETSEL.bit.INTSEL  =  4     // 在   TBCTR 上选择 INT = CMPA 递增计数
  194.     EPwm1Regs.ETSEL.bit.INTEN  =  1                // 启用 INT
  195.     EPwm1Regs.ETPS.bit.INTPRD  =  1           //    在发生第3 个事件时生成 INT
  196.  
  197.  InitEPwm2Examples()
  198.     //
  199.     // 设置 TBCLK
  200.     //
  201.     EPwm2Regs.TBPRD  = EPWM2_TIMER_TBPRD       // 设置 计时 器周期 801 TBCLK
  202.     EPwm2Regs.TBPHS.bit.TBPHS  =  0x0000        // 相 位为 0
  203.     EPwm2Regs.TBCTR  =  0x0000                  // 清除 计数器
  204.  
  205.     //
  206.     // 设置 比较 值
  207.     //
  208.     EPwm2Regs.CMPA.bit.CMPA  = SineTable[IntCount]    // 设置 比较 A 值
  209.     EPwm2Regs.CMPB.BIT.CMPB  = SineTable[IntCount]    // 设置 比较 B 值
  210.  
  211.     //
  212.     // 设置 计数 器模式
  213.     //
  214.     EPwm2Regs.TBCTL.bit.CTRMODE  = TB_COUNT_UPDOWN // 向上和   向下计数
  215.     EPwm2Regs.TBCTL.bit.PHSEN  = TB_DISABLE        // 禁用 相 位加载
  216.     EPwm2Regs.TBCTL.bit.HSPCLKDIV  = TB_DIV1       // 时钟  与 SYSCLKOUT 的比率
  217.     EPwm2Regs.TBCTL.bit.CLKDIV  = TB_DIV1
  218.  
  219.     //
  220.     // 设置 操作
  221.     //
  222.     EPwm2Regs.AQCTLA.bit.CAU  = AQ_SET            // 在   事件 A 上设置 PWM1A、递增
  223.                                                   // 计数
  224.     EPwm2Regs.AQCTLA.bit.CAD  = AQ_CLEAR          //    在事件 A 上清除 PWM1A、
  225.                                                   // 倒计数  
  226.  
  227.     EPwm2Regs.AQCTLB.bit.CBU  = AQ_SET            // 在   事件 B 上设置 PWM1B、向上
  228.                                                   // 计数
  229.     EPwm2Regs.AQCTLB.bit.CBD  = AQ_CLEAR          //    在事件 B 上清除 PWM1B、
  230.                                                   // 倒计数  
  231.  
  232.     //
  233.     // 中断 ,我们将   在其中更改  比较 值
  234.     //
  235.     EPwm2Regs.ETSEL.bit.INTSEL  =  4     // 在   TBCTR 上选择 INT = CMPA 递增计数
  236.     EPwm2Regs.ETSEL.bit.INTEN  =  1                // 启用 INT
  237.     EPwm2Regs.ETPS.bit.INTPRD  =  1           //    在发生第3 个事件时生成 INT
  238.  
  239.  InitEPwm3Examples()
  240.     //
  241.     // 设置 TBCLK
  242.     //
  243.     EPwm3Regs.TBPRD  = EPWM3_TIMER_TBPRD       // 设置 计时 器周期 801 TBCLK
  244.     EPwm3Regs.TBPHS.bit.TBPHS  =  0x0000        // 相 位为 0
  245.     EPwm3Regs.TBCTR  =  0x0000                  // 清除 计数器
  246.  
  247.     //
  248.     // 设置 比较 值
  249.     //
  250.     EPwm3Regs.CMPA.bit.CMPA  = SineTable[IntCount]    // 设置 比较 A 值
  251.     EPwm3Regs.CMPB.BIT.CMPB  = SineTable[IntCount]    // 设置 比较 B 值
  252.  
  253.     //
  254.     // 设置 计数 器模式
  255.     //
  256.     EPwm3Regs.TBCTL.bit.CTRMODE  = TB_COUNT_UPDOWN // 向上和   向下计数
  257.     EPwm3Regs.TBCTL.bit.PHSEN  = TB_DISABLE        // 禁用 相 位加载
  258.     EPwm3Regs.TBCTL.bit.HSPCLKDIV  = TB_DIV1       // 时钟  与 SYSCLKOUT 的比率
  259.     EPwm3Regs.TBCTL.bit.CLKDIV  = TB_DIV1
  260.     //
  261.     // 设置 操作
  262.     //
  263.     EPwm3Regs.AQCTLA.bit.CAU  = AQ_SET            // 在   事件 A 上设置 PWM1A、递增
  264.                                                   // 计数
  265.     EPwm3Regs.AQCTLA.bit.CAD  = AQ_CLEAR          //    在事件 A 上清除 PWM1A、
  266.                                                   // 倒计数  
  267.  
  268.     EPwm3Regs.AQCTLB.bit.CBU  = AQ_SET            // 在   事件 B 上设置 PWM1B、向上
  269.                                                   // 计数
  270.     EPwm3Regs.AQCTLB.bit.CBD  = AQ_CLEAR          //    在事件 B 上清除 PWM1B、
  271.                                                   // 倒计数  
  272.     //
  273.     // 中断 ,我们将   在其中更改  比较 值
  274.     //
  275.     EPwm3Regs.ETSEL.bit.INTSEL  =  4     // 在   TBCTR 上选择 INT = CMPA 递增计数
  276.     EPwm3Regs.ETSEL.bit.INTEN  =  1                // 启用 INT
  277.     EPwm3Regs.ETPS.bit.INTPRD  =  1           //    在发生第3 个事件时生成 INT
  278. void GPIO_setup  (void)
  279.     EALLOW
  280.     GpioCtrlRegs.GPBMUX2.bit.GPIO63  =  0/GPIO
  281.     GpioCtrlRegs.GPBDIR.bit.GPIO63  =  1 //输出
  282.     EDIS
  283.  

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

    您已将 PWM 1中断分配给在比较 A 匹配时发生。  由于 CMPA 已设置为大于时基周期的值、因此不会发生中断、因此永远不会发生匹配。  原因在第175行中、您使用未初始化的变量"IntCount"索引到正弦表中。

    由于您在不同的 INTSEL 值之间来回跳转、因此 CMPB 也是如此。  纠正这些问题、您将开始看到中断。   

    我假设您要更改 ISR 内部的 CMPA/B 设置、在这种情况下、您需要确保查找表条目始终低于 TBPRD、否则不会发生中断。

    此致、

    Richard

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

    Richard、

    很抱歉我的答复很晚,但我用各种不同的方式来理解你的答复。 请解释一下我的 CMPA 值是如何大于时基周期的设置值的。 我已初始化  

    IntCount = 0;

    但我没有得到任何结果。   

    感谢你的答复

    Bighnaraj Panda

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

    Bighnaraj、

    您在哪里初始化了"IntCount"?  在您提供的代码中、该变量在第18行中声明、而没有初始化程序、因此它采用未知值。

    在第175行中、您使用此未知偏移量索引到正弦表中、那么 EPwm1Regs.CMPA.bit.CMPA 取什么值?  未知、对吧?  如果它大于 PWM1 TBPRD 寄存器、则永远不会看到任何中断、PWM2和 PWM3也是如此。

    如果您只是在 第18行初始化"IntCount"、它将起作用。  

    此致、

    Richard

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

    Richard、

    我将 IntCount 初始化为

    _interrupt void epwm1_ISR (void)

    interrupt_count++;
    unsigned long IntCount = 0;

    也在 ePWM 的定义范围内  

    空 InitEPwm1Examples()

    unsigned long IntCount = 0;

    (笑声)

    但是、现在我得到了一条直线。 因为我认为它没有得到比较、所以请您详细说明为什么它没有得到比较。  

    谢谢你

    Bighnaraj Panda

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

    Bighnaraj、

    您现在获得中断的唯一原因是您已在 Pwm1Examples()中初始化 IntCount,而 IntCount 是在该函数中首次使用的。  但是、当您再次将其初始化为 ISR 内部的局部变量时、每次触发中断时、它始终为零、并且您始终访问正弦阵列中的第一个元素。 IntCount 必须是全局变量、而不是局部变量。

    我建议您删除这两个本地声明、返回到此线程顶部的原始代码、然后在第18行初始化 IntCount。  我在我的机器上运行它。

    此致、

    Richard

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

    Richard、

     是的、我执行了相应的操作、但我获得了恒定输出。

    空 InitEPwm1Examples()

    unsigned long IntCount = 0;
    //
    //设置 TBCLK
    //

    EPwm1Regs.TBPRD = EPWM1_TIMER_TBPRD;//设置计时器周期801 TBCLK
    EPwm1Regs.TBPHS.bit.TBPHS = 0x0000;//相位为0
    EPwm1Regs.TBCTR = 0x0000;//清除计数器

    (笑声)

    空 InitEPwm2Examples()

    unsigned long IntCount = 0;
    //
    //设置 TBCLK
    //
    EPwm2Regs.TBPRD = EPWM2_TIMER_TBPRD;//设置计时器周期801 TBCLK
    EPwm2Regs.TBPHS.bit.TBPHS = 0x0000;//相位为0
    EPwm2Regs.TBCTR = 0x0000;//清除计数器

    (笑声)

    空 InitEPwm3Examples()

    unsigned long IntCount = 0;
    //
    //设置 TBCLK
    //
    EPwm3Regs.TBPRD = EPWM3_TIMER_TBPRD;//设置计时器周期801 TBCLK
    EPwm3Regs.TBPHS.bit.TBPHS = 0x0000;//相位为0
    EPwm3Regs.TBCTR = 0x0000;//清除计数器

    (笑声)

    我是否正确更改了它。

    谢谢你

    Bighnaraj Panda

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

    您现在应该会获得中断、但最好去掉这些局部变量、然后按照我所说的操作-即具有一个全局 IntCount 变量、该变量在第18行中初始化。

    如果您在每个 ISR 的第一行放置一个断点、您应该能够单步执行每个断点-会发生什么情况?

    您能解释一下恒定输出的含义吗?"  

    谢谢。

    此致、

    Richard

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

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

    Richard、

    是的、我也尝试了生成全局变量  

    int interrupt_count = 1;
    unsigned long IntCount=0;

    谢谢你

    Bighnaraj Panda

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

    Bighnaraj、

    好的、谢谢。  您不需要局部变量"IntCount" anWhere。

    我看到了'scope 布线、但它是什么?  PWM 输出?

    这是一件事: 我认为这是一个 PWM 输出、您的意思是使用正弦表调制 PWM 占空比、但您的代码中没有任何地方会写入 ISR 内的 PWM 比较寄存器、因此我不确定您会看到什么。  可以详细说明吗?

    此致、

    Richard  

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

    Richard、

    是的、它是 EPWM1上的输出。 我想我已经把它与 InitEPwm1Example 定义中的比较寄存器进行了比较、如下所示

    空 InitEPwm1Examples()

    //unsigned long IntCount = 0;
    //
    //设置 TBCLK
    //

    EPwm1Regs.TBPRD = EPWM1_TIMER_TBPRD;//设置计时器周期801 TBCLK
    EPwm1Regs.TBPHS.bit.TBPHS = 0x0000;//相位为0
    EPwm1Regs.TBCTR = 0x0000;//清除计数器

    //
    //设置比较值
    //
    EPwm1Regs.CMPA.bit.CMPA = SineTable[IntCount];//设置比较 A 值
    EPwm1Regs.CMPB.BIT.CMPB = SineTable[IntCount];//设置比较 B 值

    您能不能建议我需要在 ISR 内部进行哪些更改

    谢谢你

    Bighnaraj Panda

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

    Bighnaraj、

    您已经初始化了占空比、但如果希望在程序运行时更改占空比、则必须在 ISR 中写入该占空比。  将上面设置比较值的两行复制到 PWM1 ISR 末尾。  

    此致、

    Richard

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

    Richard、

    是的、我已经执行了相应的操作、但仍然、输出是恒定的

    _interrupt void epwm1_ISR (void)

    interrupt_count++;

    当计数器递减计数= CMPB 时、//生成第二个中断
    if (interrupt_count = 2)

    GpioDataRegs.GPBDAT.bit.GPIO63 = 1;//将 GPIO-63设置为高电平
    // GpioDataRegs.GPBSET.BIO63 = 1;//将 GPIO-63设置为高电平
    // GpioDataRegs.GPADD.bit.GPIO14 = 1;//将 GPIO-14设置为高电平
    // GpioDataRegs.GPASET.bit.GPIO14 = 1;//将 GPIO-14置为高电平
    EPwm1Regs.ETSEL.bit.INTSEL = 7;

    //当计数器递减计数= CMPB 时生成中断
    //当计数器递增计数= CMPA 时、复位下一个中断以再次生成
    其他

    GpioDataRegs.GPBDAT.bit.GPIO63 = 0;//将 GPIO-63设置为低电平
    // GpioDataRegs.GPBCLEAR.bit.GPIO63 = 1;//将 GPIO-63设置为低电平
    // GpioDataRegs.GPADAT.bit.GPIO14 = 0;//将 GPIO-14设置为低电平
    // GpioDataRegs.GPACLEAR.bit.GPIO14 = 1;//将 GPIO-14置为低电平
    EPwm1Regs.ETSEL.bit.INTSEL = 4;
    INTERRUPT_COUNT = 1;

    EPwm1Regs.ETCLR.bit.INT = 1;
    PieCtrlRegs.PIEACX.ALL = PIEACK_Group3;
    //if (IntCount < 100)
    //{
    // IntCount++;
    //}
    //else
    // IntCount = 0;
    EPwm1Regs.CMPA.bit.CMPA = SineTable[IntCount];//设置比较 A 值
    EPwm1Regs.CMPB.bit.CMPB = SineTable[IntCount];

    谢谢你

    Bighnaraj Panda

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

    尊敬的 Bighnaraj:

    这将会变得有点复杂。 您所做的基本上是正常的、但您需要更改一些内容。 首先、让我们尝试一个实验。 将 CMPA/CMPB 设置更改为低于 TBPRD 的某个固定值。 您需要在 ISR 和初始化例程中执行此操作。 使用如下内容:

    EPwm1Regs.CMPA.bit.CMPA = 0x200;
    EPwm1Regs.CMPB.bit.CMPB = 0x300;

    现在构建并运行该程序。 您看到输出了吗? 我想您会看到一个不同于以前的固定值。 然后、在 ePWM1 ISR 的第一行放置一个断点、并检查它在您每次运行程序时是否触发。 请告诉我它是否执行此操作以及您发现的内容。 谢谢。

    此致、

    Richard

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

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

    Richard、

    我知道、如果我将进行设置  

    EPwm1Regs.CMPA.bit.CMPA,TBPRD 周期内的值,那么我将得到一个方波脉冲响应。 但我无法理解如何使 sine_table 的查找表值与"EPwm1Regs.CMPA.bit.CMPA"寄存器相比较。  

    谢谢你

    Bighnaraj Panda

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

    Bighnaraj、

    您能否首先确认您是否在 PWM1 ISR 开始处重复到达断点?  我想你应该是这样的。

    此致、

    Richard

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

    Richard、

           是的、这是通过 EPWM1 (J4引脚40)获取的 PWM 输出。 我想通过将输出 PWM 占空比与正弦波进行比较来调制输出 PWM 占空比。 如果您可以建议我如何在 ISR 内调制占空比、 以书面形式  

    EPwm3Regs.CMPA.bit.CMPA = SineTable[IntCount];

    我尝试将当前正弦值分配给比较位寄存器、以便产生调制 PWM 波。

    谢谢你

    Bighnaraj Panda

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

    Bighnaraj、

    请回答我关于在 PWM1 ISR 上重复触发的问题吗?

    在 epw1_ISR 的第一行放置一个断点、然后运行程序。  你可以到达吗?

    再次运行程序。 您是否再次访问它?

    在发生这种情况之前、查找表是不相关的。

    此致、

    Richard

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

    Richard、

          我研究了一些示例程序和有关正弦查找表的链接。 根据您的建议、我尝试为比较值集修改 ISR 内的占空比。 现在、我将获得占空比相等的方波脉冲。 您是否可以建议进行任何修改。 以下是我所做的修改

    1.  
    2. // epwm1_ISR - EPWM1 ISR
    3. //
    4. _interrupt  void epwm1_ISR (void)
    5.     interrupt_count++
    6.  
    7.     当     计数器 递减 计数 = CMPB 时、//生成第二个中断
    8.     if (interrupt_count  =  2)
    9.         
    10.             GpioDataRegs.GPBDAT.bit.GPIO63  =  1 //将 GPIO-63设置 为高电平
    11. //            GpioDataRegs.GPBSET.BIO63 = 1; //将 GPIO-63设置 为高电平
    12. //            GpioDataRegs.GPADD.bit.GPIO14 = 1; //将 GPIO-14 设置为高电平
    13. //            GpioDataRegs.GPASET.bit.GPIO14 = 1; //将 GPIO-14 置为高电平
    14.             EPwm1Regs.ETSEL.bit.INTSEL  =  7
    15.         
    16.  
    17.     //     当计数器 递减 计数 = CMPB 时生成中断
    18.     // 当        计数 器递增 计数 = CMPA 时、复位下一个中断以再次生成
    19.     其他
    20.     
    21.         GpioDataRegs.GPBDAT.bit.GPIO63  =  0 //将 GPIO-63设置 为低电平
    22. //            GpioDataRegs.GPBCLEAR.bit.GPIO63 = 1; //将 GPIO-63设置 为低电平
    23. //            GpioDataRegs.GPADAT.bit.GPIO14 = 0; //将 GPIO-14 设置为低电平
    24. //            GpioDataRegs.GPACLEAR.bit.GPIO14 = 1; //将 GPIO-14 置为低电平
    25.         EPwm1Regs.ETSEL.bit.INTSEL  =  4
    26.         INTERRUPT_COUNT  =  1
    27.     
    28.     if ( IntCount  <  100)
    29.        
    30.          IntCount++
    31.       
    32.       其他
    33.         IntCount  =  0
    34.     EPwm1Regs.CMPA.bit.CMPA  = EPwm1Regs.TBPRD-SineTable[IntCount]/2    // 设置 比较 A 值
    35.       EPwm1Regs.CMPB.bit.CMPB  = EPwm1Regs.TBPRD-SineTable[IntCount]/2
    36.  
    37.       if ( IntCount  <  100)
    38.          
    39.            IntCount++
    40.         
    41.         其他
    42.           IntCount  =  0
    43.       EPwm1Regs.ETCLR.bit.INT  =  1
    44.       PieCtrlRegs.PIEACX.ALL  = PIEACK_Group3
    45.     //EPwm1Regs.CMPA.bit.CMPA = 0x200;
    46.       //  EPwm1Regs.CMPB.bit.CMPB = 0x300;
    47. _interrupt  void epwm2_ISR (void)
    48. EPwm2Regs.CMPA.bit.CMPA  = EPwm2Regs.TBPRD-SineTable[IntCount]/2    // 设置 比较 A 值
    49.     EPwm2Regs.CMPB.BIT.CMPB  = EPwm2Regs.TBPRD-SineTable[IntCount]/2    // 设置 比较 B 值
    50.  
    51.     if ( IntCount  <  100)
    52.       
    53.        IntCount++
    54.      
    55.     其他
    56.       IntCount  =  0
    57.  
    58.     EPwm2Regs.ETCLR.bit.INT  =  1
    59. PieCtrlRegs.PIEACX.ALL  = PIEACK_Group3
    60. _interrupt  void epwm3_ISR (void)
    61.     EPwm3Regs.CMPA.bit.CMPA  = EPwm3Regs.TBPRD-SineTable[IntCount]/2    // 设置 比较 A 值
    62.             EPwm3Regs.CMPB.BIT.CMPB  = EPwm3Regs.TBPRD-SineTable[IntCount]/2    // 设置 比较 B 值
    63.             if ( IntCount  <  100)
    64.               
    65.                IntCount++
    66.            
    67.            其他
    68.             IntCount  =  0
    69.     // 清除     此计时器的 INT 标志
    70.     //
    71.     EPwm3Regs.ETCLR.bit.INT  =  1
    72.  
    73.     //
    74.     // 确认 此 中断 以 接收 来自   组 3的更多中断
    75.     //
    76.     PieCtrlRegs.PIEACX.ALL  = PIEACK_Group3
    77. //
    78. // InitEPwm1Example-Initialize   EPWM1 配置
    79. //
    80.  InitEPwm1Examples()
    81.     //unsigned long IntCount = 0;
    82.     //
    83.     // 设置 TBCLK
    84.     //
    85.  
    86.     EPwm1Regs.TBPRD  = EPWM1_TIMER_TBPRD       // 设置 计时 器周期 801 TBCLK
    87.     EPwm1Regs.TBPHS.bit.TBPHS  =  0x0000        // 相 位为 0
    88.     EPwm1Regs.TBCTR  =  0x0000                  // 清除 计数器
    89.  
    90.     //
    91.     // 设置 比较 值
    92.     //
    93.     EPwm1Regs.CMPA.bit.CMPA  = EPwm1Regs.TBPRD/2 //SineTable[IntCount];    // 设置 比较 A 值
    94.     EPwm1Regs.CMPB.bit.CMPB  = EPwm1Regs.TBPRD/2 //SineTable[IntCount];    // 设置 比较 B 值
    95.     //EPwm1Regs.CMPA.bit.CMPA = 0x200;
    96.       //      EPwm1Regs.CMPB.bit.CMPB = 0x300;
    97.  InitEPwm2Examples()
    98.     //unsigned long IntCount = 0;
    99.     //
    100.     // 设置 TBCLK
    101.     //
    102.     EPwm2Regs.TBPRD  = EPWM2_TIMER_TBPRD       // 设置 计时 器周期 801 TBCLK
    103.     EPwm2Regs.TBPHS.bit.TBPHS  =  0x0000        // 相 位为 0
    104.     EPwm2Regs.TBCTR  =  0x0000                  // 清除 计数器
    105.  
    106.     //
    107.     // 设置 比较 值
    108.     //
    109.     EPwm2Regs.CMPA.bit.CMPA  = EPwm2Regs.TBPRD/2 //SineTable[IntCount];    // 设置 比较 A 值
    110.     EPwm2Regs.CMPB.BIT.CMPB  = EPwm2Regs.TBPRD/2 //SineTable[IntCount];    // 设置 比较 B 值
    111.  InitEPwm3Examples()
    112.     //unsigned long IntCount = 0;
    113.     //
    114.     // 设置 TBCLK
    115.     //
    116.     EPwm3Regs.TBPRD  = EPWM3_TIMER_TBPRD       // 设置 计时 器周期 801 TBCLK
    117.     EPwm3Regs.TBPHS.bit.TBPHS  =  0x0000        // 相 位为 0
    118.     EPwm3Regs.TBCTR  =  0x0000                  // 清除 计数器
    119.  
    120.     //
    121.     // 设置 比较 值
    122.     //
    123.     EPwm3Regs.CMPA.bit.CMPA  = EPwm3Regs.TBPRD/2 //SineTable[IntCount];    // 设置 比较 A 值
    124.     EPwm3Regs.CMPB.BIT.CMPB  = EPwm3Regs.TBPRD/2 //SineTable[IntCount];    // 设置 比较 B 值
    125.  

    谢谢你

    Bighnaraj Panda

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

    Richard、

           我将断点放在这里  

      interrupt_count++;

    当我运行程序时、它将停止。 它未到达断点。 我是否应该更改查找表。

    谢谢你

    Bighnaraj Panda

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

    Bighnaraj、

    您的代码有两个问题。 其中一个涉及正弦表、但在我们到达该表之前、我需要确保您的代码反复到达这些 ISR、否则没有意义。

    前面我要求您对代码进行一些更改、以删除对正弦表的读取并检查 ISR 条目。 回顾一下这个帖子-这是这个主题中的第五个帖子。 请删除这些读数、运行测试、并告知我是否正常工作。 现在忘记输出、我只想知道它是否进入 ISR。 谢谢。

    此致、

    Richard

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

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

    Richard、

          我删除了 CMPA 寄存器内的 sine_Table[IntCount]的读数、但 ISR 处的断点仍然不会随着所附图像更新寄存器

    EPwm1Regs.CMPA.bit.CMPA = EPwm1Regs.TBPRD/2;//SineTable[IntCount];//设置比较 A 值
    EPwm1Regs.CMPB.bit.CMPB = EPwm1Regs.TBPRD/2;//SineTable[IntCount];//设置比较 B 值

    谢谢你

    Bighnaraj Panda

     

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

    Bighnaraj、

    对代码进行了大量更改、我很难跟上步伐、因此我想尝试另一种方法。  我附加了一个 C 文件、我认为它与您现在拥有的文件非常接近。  我希望您用这个替换您正在处理的文件。

    然后、照常编译和加载、并在第99行上放置一个断点、然后运行程序。  您应该在每次运行时都达到此断点。  请确认发生了这种情况。  谢谢。

    此致、

    Richard

    e2e.ti.com/.../forum2.c

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

    Richard、

           我在第99行放置一个断点。 当我运行代码时、该断点处的寄存器值不会递增或显示任何值。

    谢谢你

    Bighnaraj Panda  

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

    Bighnaraj、

    我没有问过寄存器。 我想知道的是、每次运行程序时、您是否达到了断点。  我将假定您已到达 BP。  如果这是错误的、请告诉我;否则、您需要查看以下内容。

    您的初始问题是 CMPA/B 被载入大于 TBPRD 的值。 这意味着 PWM 中断最初是在 CMPA 递增计数事件上配置的、但从未发生过。 错误加载 CMPx 寄存器的原因是 IntCount 变量未初始化。 我解释说您需要初始化全局变量、我相信您现在已经这样做了。

    查找表中的第一个条目为零。 通常、这不会导致问题、但您的代码正在 CMPA 递增计数和 CMPB 递减计数之间切换中断触发器。 当阈值为零时、这会导致生成一个在 PIE 级别未确认的中断、并且中断停止。 如果您注释掉第109行和第120行、您可能会发现中断正常工作。 我尚未分析您丢失中断的原因、但我建议首先尝试这样做、以确保您在继续之前获得可靠的中断。

    我不知道查找表的完整性。 我知道您在另一个论坛主题中找到了它。 我观察到您使用2500加载 TBPRD、并且表中大多数条目的高16位大于该值、这意味着当您将这些值加载到 CMPx 寄存器中时不会获得中断。 您需要考虑表中与 TBPRD 寄存器相关的内容。

    如果感兴趣、您可能希望查看您所使用器件的1天技术讲座实验4中的正弦表。 我已附上该文件、您可以在此处找到其他实验课程材料:
    training.ti.com/c2000-workshops

    但愿这对您有所帮助。

    此致、

    Richard

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

    附加文件。

    e2e.ti.com/.../sinetab.c