社区导航

 
查看: 1890|回复: 13

[求助] 28027 spwm程序无法进入中断

[复制链接]

11

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2017-2-27 13:07:53 | 显示全部楼层 |阅读模式
问题如上spwm程序无法进入中断执行数组赋值导致出不来spwm
这是程序的仿真波形,不是swpm波,没进中断,各位大神帮忙看下啥问题,谢!
QQ截图20170227130559.jpg

#include "DSP28x_Project.h"     // Device Headerfile and Examples Include File
#define uint unsigned int
void InitEPwm1(void);
void InitEPwm2(void);
void InitEPwm1Gpio(void);
void InitEPwm2Gpio(void);

interrupt void epwm1_timer_isr(void);

#define tablesize 200                //一个周期正弦表大小
uint Num=0;
//正弦表
const uint sinetable[tablesize]={
                1462,        1415,        1369,        1322,        1276,        1230,        1184,        1138,        1093,        1048,
                1004,        960,        917,        874,        832,        791,        750,        710,        671,        633,
                595,        559,        523,        488,        455,        422,        391,        360,        331,        303,
                276,        250,        226,        202,        181,        160,        141,        123,        106,         91,
                 77,         65,         54,         44,         36,         30,         25,         21,         19,         18,
                 19,         21,         25,         30,         36,         44,         54,         65,         77,         91,
                106,        123,        141,        160,        181,        202,        226,        250,        276,        303,
                331,        360,        391,        422,        455,        488,        523,        559,        595,        633,
                671,        710,        750,        791,        832,        874,        917,        960,        1004,        1048,
                1093,        1138,        1184,        1230,        1276,        1322,        1369,        1415,        1462,        1509,
                1556,        1603,        1649,        1696,        1742,        1788,        1834,        1880,        1925,        1970,
                2014,        2058,        2101,        2144,        2186,        2227,        2268,        2308,        2347,        2385,
                2423,        2459,        2495,        2530,        2563,        2596,        2627,        2658,        2687,        2715,
                2742,        2768,        2792,        2816,        2837,        2858,        2877,        2895,        2912,        2927,
                2941,        2953,        2964,        2974,        2982,        2988,        2993,        2997,        2999,        3000,
                2999,        2997,        2993,        2988,        2982,        2974,        2964,        2953,        2941,        2927,
                2912,        2895,        2877,        2858,        2837,        2816,        2792,        2768,        2742,        2715,
                2687,        2658,        2627,        2596,        2563,        2530,        2495,        2459,        2423,        2385,
                2347,        2308,        2268,        2227,        2186,        2144,        2101,        2058,        2014,        1970,
                1925,        1880,        1834,        1788,        1742,        1696,        1649,        1603,        1556,        1509
};

void main(void)
{
   InitSysCtrl();//1、初始化系统
   InitEPwm1Gpio();
   InitEPwm2Gpio();

   DINT;//Disable interrupt 清除所有中断,并禁用CPU中断
   InitPieCtrl();//PIE初始化
   IER = 0x0000;
   IFR = 0x0000;//禁用CPU中断和清除所有CPU中断
   InitPieVectTable();//PIE向量表初始化

   EALLOW;//Edit allow
   PieVectTable.EPWM1_INT = &epwm1_timer_isr;
   EDIS; //Edit disable

   InitEPwm1();
   InitEPwm2();

   IER |= M_INT3;
   PieCtrlRegs.PIEIER3.bit.INTx1 = 1;// PWM1中断
   EINT; // 启用全局中断INTM
   ERTM;//使能做全局实时中断DBGM

   for(;;)
      {
          __asm("NOP");
      }
}

interrupt void epwm1_timer_isr(void)
{

        if(Num==tablesize)
                Num=0;

        EPwm1Regs.CMPA.half.CMPA=sinetable[Num];
        Num++;

        EPwm1Regs.ETCLR.bit.INT = 1;
        PieCtrlRegs.PIEACK.all = PIEACK_GROUP3;//写1清0
}

void InitEPwm1()
{
        EPwm1Regs.TBPRD = 3000;                        // Set timer period
           EPwm1Regs.TBPHS.half.TBPHS = 0x0000;           // Phase is 0
           EPwm1Regs.TBCTR = 0x0000;                      // Clear counter

           // Setup TBCLK
           EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // Count up
           EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE;        // Disable phase loading
           EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;       // Clock ratio to SYSCLKOUT
           EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1;          // Slow just to observe on the scope

           EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;    // Load registers every ZERO
           EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
           EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO_PRD;
           EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO_PRD;
           // Setup compare
           EPwm1Regs.CMPA.half.CMPA = 800;                                //占空比设置为0,防止上电瞬间电压值达到最大

           // Set actions
           EPwm1Regs.AQCTLA.bit.CAU = AQ_SET;             // Set PWM2A on Zero
           EPwm1Regs.AQCTLA.bit.CAD = AQ_CLEAR;

           // Interrupt where we will modify the deadband
           EPwm1Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO;      // Select INT on Zero event
           EPwm1Regs.ETSEL.bit.INTEN = 1;                 // Enable INT
           EPwm1Regs.ETPS.bit.INTPRD = ET_1ST;            // Generate INT on 3rd event
}

void InitEPwm2()
{
        //TBCLK=SYSCLKOUT/(HSPCLKDIV*CLKDIV)=(1/60M)/(1*1)
                //Tpwm=2*TBPRD*T_TBCLK (For Updown mode)
                //1/40K=2*TBPRD*(1/60M)==>TBPRD=750
           EPwm2Regs.TBPRD = 750;                        // Set timer period
           EPwm2Regs.TBPHS.half.TBPHS = 0x0000;           // Phase is 0
           EPwm2Regs.TBCTR = 0x0000;                      // Clear counter

           // Setup TBCLK
           EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // Count updown
           EPwm2Regs.TBCTL.bit.PHSEN = TB_DISABLE;        // Disable phase loading
           EPwm2Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;       // Clock ratio to SYSCLKOUT
           EPwm2Regs.TBCTL.bit.CLKDIV = TB_DIV1;

           EPwm2Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;    // Load registers every ZERO
           EPwm2Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
           EPwm2Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
           EPwm2Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;

           // Setup compare
           EPwm2Regs.CMPA.half.CMPA = 375;

           // Set actions
           EPwm2Regs.AQCTLA.bit.CAU = AQ_CLEAR;             // Set PWM1A on Zero
           EPwm2Regs.AQCTLA.bit.CAD = AQ_SET;

           // Interrupt where we will change the Deadband
           EPwm2Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO;     // Select INT on Zero event
           EPwm2Regs.ETSEL.bit.INTEN = 1;                // Enable INT
           EPwm2Regs.ETPS.bit.INTPRD = ET_3RD;           // Generate INT on 3rd event

}
void InitEPwm1Gpio(void)
{
   EALLOW;

    GpioCtrlRegs.GPAPUD.bit.GPIO0 = 1;    // Disable pull-up on GPIO0 (EPWM1A)
    GpioCtrlRegs.GPAPUD.bit.GPIO1 = 1;    // Disable pull-up on GPIO1 (EPWM1B)

    GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1;   // Configure GPIO0 as EPWM1A
    GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 1;   // Configure GPIO1 as EPWM1B

    EDIS;
}

void InitEPwm2Gpio(void)
{
   EALLOW;

    GpioCtrlRegs.GPAPUD.bit.GPIO2 = 1;    // Disable pull-up on GPIO2 (EPWM2A)
    GpioCtrlRegs.GPAPUD.bit.GPIO3 = 1;    // Disable pull-up on GPIO3 (EPWM2B)

    GpioCtrlRegs.GPAMUX1.bit.GPIO2 = 1;   // Configure GPIO2 as EPWM2A
    GpioCtrlRegs.GPAMUX1.bit.GPIO3 = 1;   // Configure GPIO3 as EPWM2B

    EDIS;
}


此帖出自DSP论坛


回复

使用道具 举报

11

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

 楼主| 发表于 2017-2-27 13:30:15 | 显示全部楼层
怎么没人来,大神快来快来


回复

使用道具 举报

2734

TA的帖子

0

TA的资源

五彩晶圆(初级)

Rank: 7Rank: 7Rank: 7

发表于 2017-2-27 20:19:44 | 显示全部楼层
确认一下epwm模块的时钟使能了没有,芯片复位之后默认是关闭的。然后对比一下TI的官方例程。
作为一个水军,就是尽量的多回帖,因为懂的技术少,所以回帖水分大,见谅!
EEWORLD开发板置换群:309018200,——电工们免费装β的天堂,商家勿入!加群暗号:喵


回复

使用道具 举报

11

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

 楼主| 发表于 2017-2-27 21:04:44 | 显示全部楼层
elvike 发表于 2017-2-27 20:19
确认一下epwm模块的时钟使能了没有,芯片复位之后默认是关闭的。然后对比一下TI的官方例程。

好的,谢


回复

使用道具 举报

1万

TA的帖子

33

TA的资源

版主

Rank: 6Rank: 6

发表于 2017-2-27 22:56:09 | 显示全部楼层
嗯,跟踪一下InitSysCtrl函数,看看时钟打开了没有。
在仿真时可以看到,如果时钟没有打开,相关的寄存器就没办法写入。


回复

使用道具 举报

11

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

 楼主| 发表于 2017-2-28 09:16:25 | 显示全部楼层
dontium 发表于 2017-2-27 22:56
嗯,跟踪一下InitSysCtrl函数,看看时钟打开了没有。
在仿真时可以看到,如果时钟没有打开,相关的寄存器 ...

哈哈哈,好的,终于等到你了,之前就看了好几个你的28027的帖子,我也一直怀疑是时钟的问题,其他的对了好几遍,谢谢大神


回复

使用道具 举报

1万

TA的帖子

33

TA的资源

版主

Rank: 6Rank: 6

发表于 2017-2-28 21:20:17 | 显示全部楼层
TI器件的PWM很容易掌握的。PWM的帖子我也写过一篇。

顺便说一下,28系列的CPU,内部已经固化了正弦波表。可以看看 BOOT ROM这篇文档。

点评

版主老厉害了!!!!  详情 回复 发表于 2017-5-4 14:42


回复

使用道具 举报

50

TA的帖子

2

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2017-5-4 14:42:46 | 显示全部楼层
dontium 发表于 2017-2-28 21:20
TI器件的PWM很容易掌握的。PWM的帖子我也写过一篇。

顺便说一下,28系列的CPU,内部已经固化了正弦波表 ...

版主老厉害了!!!!


回复

使用道具 举报

2

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2018-6-4 23:15:16 | 显示全部楼层
你好,我想了解一下,你是用什么版本的proteus来做DSP的仿真,我也要使用proteus仿真DSP2407的电路,但是没有找到相应的元件,你有什么解决办法?谢谢


回复

使用道具 举报

15

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2018-7-29 09:47:01 | 显示全部楼层
正如7楼,28xx可以直接利用sin函数取点产生比较值,不需要用table


回复

使用道具 举报

6

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2018-8-4 23:54:17 | 显示全部楼层
正如7楼,28xx可以直接利用sin函数取点产生比较值,不需要用table


回复

使用道具 举报

6

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2018-8-4 23:54:51 | 显示全部楼层
正如7楼,28xx可以直接利用sin函数取点产生比较值,不需要用table


回复

使用道具 举报

6

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2018-8-4 23:55:17 | 显示全部楼层
正如7楼,28xx可以直接利用sin函数取点产生比较值,不需要用table


回复

使用道具 举报

6

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2018-8-4 23:55:28 | 显示全部楼层
正如7楼,28xx可以直接利用sin函数取点产生比较值,不需要用table


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

小黑屋|手机版|Archiver|电子工程世界 ( 京ICP证 060456

GMT+8, 2018-8-16 23:37 , Processed in 0.366596 second(s), 17 queries , Gzip On, Redis On.

快速回复 返回顶部 返回列表