打印

利用F28335 epwm生成的双极性SPWM波形,波形没问题,,

[复制链接]
4280|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Othink|  楼主 | 2015-5-14 22:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
Othink|  楼主 | 2015-5-14 22:33 | 只看该作者
本帖最后由 Othink 于 2015-5-14 22:35 编辑
#include "DSP2833x_Device.h"     // DSP2833x Headerfile Include File
#include "DSP2833x_Examples.h"   // DSP2833x Examples Include File
#include "math.h"
//===========================================================================
#define    SYSTEM_CLK  150000000        //cpu frequency                 
#define    Dead_Time           800                //dead time  
#define    PI                   3.1415926        //pi value
//===========================================================================
Uint16 CarryRatio=160;                                // carries ratio
float xn=0.0000;
Uint16 temp=0;
float ModRatio=0.6;                                        //modlation ratio
Uint16 EpwmDiv=2;                                        //epwm clock dive rate
float F_Out=50.0;                                        //frequency of output
       
//===========================================================================
interrupt void Epwm1int_isr(void); //epwm1 interrupt
interrupt void Epwm2int_isr(void); //epwm2 interrupt
interrupt void Epwm3int_isr(void); //epwm3 interrupt
void Epwm1Setup(void);
void Epwm2Setup(void);
void Epwm3Setup(void);
//===========================================================================
void main(void){
// Step 1. Initialize System Control:
   InitSysCtrl();
// Step 2. Initalize GPIO:
   InitGpio();  // Skipped for this example
   InitXintf16Gpio();        //zq
// Step 3. Clear all interrupts and initialize PIE vector table:
   DINT;
   InitPieCtrl();
   IER = 0x0000;
   IFR = 0x0000;
// Initialize the PIE vector table with pointers to the shell Interrupt
   InitPieVectTable();
// Interrupts that are used in this example are re-mapped to
   EALLOW;  // This is needed to write to EALLOW protected registers
   PieVectTable.EPWM1_INT = &Epwm1int_isr;
   PieVectTable.EPWM2_INT = &Epwm2int_isr;
   PieVectTable.EPWM3_INT = &Epwm3int_isr;
   Epwm1Setup();
   Epwm2Setup();
   Epwm3Setup();
   EPwm1Regs.TBCTR=0;
   EPwm1Regs.TBCTL.bit.SWFSYNC=1;                // generate a soft synch
   EDIS;    // This is needed to disable write to EALLOW protected registers
       
        PieCtrlRegs.PIECTRL.bit.ENPIE = 1;

        PieCtrlRegs.PIEIER3.bit.INTx1 = 1;
        PieCtrlRegs.PIEIER3.bit.INTx2 = 1;
        PieCtrlRegs.PIEIER3.bit.INTx3 = 1;
    //enable core interrupt enable register : group 3 is enabled
    IER |= M_INT3;     
    EINT;   // Enable Global interrupt INTM
    ERTM;   // Enable Global realtime interrupt DBGM
    InitEPwmGpio();
    for(; 1;)
    {
       
    }

}

//===========================================================================
void Epwm1Setup(void){
        //Time base configuration
        EPwm1Regs.TBPRD=(SYSTEM_CLK/EpwmDiv)/(CarryRatio*F_Out*2)+1;
        EPwm1Regs.TBPHS.half.TBPHS=0; //phase equal 0
        EPwm1Regs.TBCTL.bit.CTRMODE=TB_COUNT_UPDOWN;                        //UpDownMoudle
        if(EpwmDiv==1)EPwm1Regs.TBCTL.bit.HSPCLKDIV=0;
        else EPwm1Regs.TBCTL.bit.HSPCLKDIV=EpwmDiv/2;
        EPwm1Regs.TBCTL.bit.PRDLD=TB_SHADOW;         // shadow the accesses register TBPRD the to read or write  
        EPwm1Regs.TBCTL.bit.FREE_SOFT=3;                //time basic run free
        EPwm1Regs.TBCTL.bit.PHSDIR=1;//count up after a syncy
        EPwm1Regs.TBCTL.bit.PHSEN=1;                 //
        EPwm1Regs.TBCTL.bit.SYNCOSEL=TB_CTR_ZERO;        //master
        EPwm1Regs.TBCTR=0;
        //compare register configuration
        EPwm1Regs.CMPCTL.bit.SHDWAMODE         = CC_SHADOW;             // Load registers every ZERO
        //EPwm1Regs.CMPCTL.bit.SHDWBMODE         = CC_SHADOW;
        EPwm1Regs.CMPCTL.bit.LOADAMODE         = CC_CTR_PRD;
        //EPwm1Regs.CMPCTL.bit.LOADBMODE         = CC_CTR_PRD;       
        EPwm1Regs.CMPA.half.CMPA=(Uint16)((sin((xn/CarryRatio)*2*PI)*ModRatio+0.5)*((SYSTEM_CLK/EpwmDiv)/(CarryRatio*F_Out*2)+1));
        //action qualifier configuration
        EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR;               // Set PWM1A on Zero
        EPwm1Regs.AQCTLA.bit.CAD = AQ_SET;
        //EPwm1Regs.AQCTLB.bit.CAU = AQ_SET;
        //EPwm1Regs.AQCTLB.bit.CAD = AQ_CLEAR;
        //dead band register configuration
        EPwm1Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE;       
        EPwm1Regs.DBCTL.bit.POLSEL   = DB_ACTV_HIC;         
        EPwm1Regs.DBCTL.bit.IN_MODE  = DBA_ALL;                       
        EPwm1Regs.DBRED = Dead_Time;                                       
        EPwm1Regs.DBFED = Dead_Time;
        //trip zone register configuration
       
        //event trigger register configuration
        EPwm1Regs.ETSEL.bit.INTSEL        = 1;
        EPwm1Regs.ETSEL.bit.INTEN        = 1;
        EPwm1Regs.ETPS.bit.INTPRD        = 1;
        EPwm1Regs.ETCLR.bit.INT                = 1;
}
void Epwm2Setup(void){
        //Time base configuration
        EPwm2Regs.TBPRD=(SYSTEM_CLK/EpwmDiv)/(CarryRatio*F_Out*2)+1;
        EPwm2Regs.TBPHS.half.TBPHS=0; //phase equal 0
        EPwm2Regs.TBCTL.bit.CTRMODE=TB_COUNT_UPDOWN;        //UpDownMoudle
        if(EpwmDiv==1)EPwm2Regs.TBCTL.bit.HSPCLKDIV=0;
        else EPwm2Regs.TBCTL.bit.HSPCLKDIV=EpwmDiv/2;               
        EPwm2Regs.TBCTL.bit.PRDLD=TB_SHADOW;         // shadow the accesses register TBPRD the to read or write  
        EPwm2Regs.TBCTL.bit.FREE_SOFT=3;                //time basic run free
        EPwm2Regs.TBCTL.bit.PHSDIR=1;//count up after a syncy
        EPwm2Regs.TBCTL.bit.PHSEN=1;                 //
        EPwm2Regs.TBCTL.bit.SYNCOSEL=TB_SYNC_IN;        //master
        EPwm2Regs.TBCTR=0;
        //compare register configuration
        EPwm2Regs.CMPCTL.bit.SHDWAMODE         = CC_SHADOW;             // Load registers every ZERO
        //EPwm1Regs.CMPCTL.bit.SHDWBMODE         = CC_SHADOW;
        EPwm2Regs.CMPCTL.bit.LOADAMODE         = CC_CTR_PRD;
        //EPwm1Regs.CMPCTL.bit.LOADBMODE         = CC_CTR_PRD;
        EPwm2Regs.CMPA.half.CMPA=(Uint16)((sin((xn/CarryRatio+0.1/0.3)*2*PI)*ModRatio+0.5)*((SYSTEM_CLK/EpwmDiv)/(CarryRatio*F_Out*2)+1));
        //action qualifier configuration
        EPwm2Regs.AQCTLA.bit.CAU = AQ_CLEAR;               // Set PWM1A on Zero
        EPwm2Regs.AQCTLA.bit.CAD = AQ_SET;
        //EPwm2Regs.AQCTLB.bit.CAU = AQ_SET;
        //EPwm2Regs.AQCTLB.bit.CAD = AQ_CLEAR;
        //dead band register configuration
        EPwm2Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE;       
        EPwm2Regs.DBCTL.bit.POLSEL   = DB_ACTV_HIC;         
        EPwm2Regs.DBCTL.bit.IN_MODE  = DBA_ALL;                       
        EPwm2Regs.DBRED = Dead_Time;                                       
        EPwm2Regs.DBFED = Dead_Time;
        //trip zone register configuration
       
        //event trigger register configuration
        EPwm2Regs.ETSEL.bit.INTSEL        = 1;
        EPwm2Regs.ETSEL.bit.INTEN        = 1;
        EPwm2Regs.ETPS.bit.INTPRD        = 1;
        EPwm2Regs.ETCLR.bit.INT                = 1;
}
void Epwm3Setup(void){
        //Time base configuration
        EPwm3Regs.TBPRD=(SYSTEM_CLK/EpwmDiv)/(CarryRatio*F_Out*2)+1;
        EPwm3Regs.TBPHS.half.TBPHS=0; //phase equal 0
        EPwm3Regs.TBCTL.bit.CTRMODE=TB_COUNT_UPDOWN;
        if(EpwmDiv==1)EPwm3Regs.TBCTL.bit.HSPCLKDIV=0;
        else EPwm3Regs.TBCTL.bit.HSPCLKDIV=EpwmDiv/2;                        //UpDownMoudle
        EPwm3Regs.TBCTL.bit.PRDLD=TB_SHADOW;         // shadow the accesses register TBPRD the to read or write  
        EPwm3Regs.TBCTL.bit.FREE_SOFT=3;                //time basic run free
        EPwm3Regs.TBCTL.bit.PHSDIR=1;//count up after a syncy
        EPwm3Regs.TBCTL.bit.PHSEN=1;                
        EPwm3Regs.TBCTL.bit.SYNCOSEL=TB_SYNC_IN;        //slave
        EPwm3Regs.TBCTR=0;       
        //compare register configuration
        EPwm3Regs.CMPCTL.bit.SHDWAMODE         = CC_SHADOW;             // Load registers every ZERO
        //EPwm3Regs.CMPCTL.bit.SHDWBMODE         = CC_SHADOW;
        EPwm3Regs.CMPCTL.bit.LOADAMODE         = CC_CTR_PRD;
        //EPwm3Regs.CMPCTL.bit.LOADBMODE         = CC_CTR_PRD;
        EPwm3Regs.CMPA.half.CMPA=(Uint16)((sin((xn/CarryRatio+0.2/0.3)*2*PI)*ModRatio+0.5)*((SYSTEM_CLK/EpwmDiv)/(CarryRatio*F_Out*2)+1));
        //action qualifier configuration
        EPwm3Regs.AQCTLA.bit.CAU = AQ_CLEAR;               // Set PWM1A on Zero
        EPwm3Regs.AQCTLA.bit.CAD = AQ_SET;
        //EPwm1Regs.AQCTLB.bit.CAU = AQ_SET;
        //EPwm1Regs.AQCTLB.bit.CAD = AQ_CLEAR;
        //dead band register configuration
        EPwm3Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE;       
        EPwm3Regs.DBCTL.bit.POLSEL   = DB_ACTV_HIC;         
        EPwm3Regs.DBCTL.bit.IN_MODE  = DBA_ALL;                       
        EPwm3Regs.DBRED = Dead_Time;                                       
        EPwm3Regs.DBFED = Dead_Time;
        //trip zone register configuration
       
        //event trigger register configuration
        EPwm3Regs.ETSEL.bit.INTSEL        = 1;
        EPwm3Regs.ETSEL.bit.INTEN        = 1;
        EPwm3Regs.ETPS.bit.INTPRD        = 1;
        EPwm3Regs.ETCLR.bit.INT                = 1;
}
//===========================================================================
interrupt void Epwm1int_isr(void){ //epwm1 interrupt
        EALLOW;
        EPwm1Regs.ETCLR.bit.INT                = 1;               
        EDIS;
        xn++;
        if(xn==CarryRatio)xn=0;
        EPwm1Regs.CMPA.half.CMPA=(Uint16)((sin((xn/CarryRatio)*2*PI)*ModRatio+0.5)*((SYSTEM_CLK/EpwmDiv)/(CarryRatio*F_Out*2)+1));
        //enable other interrupt get be done in group 3
        PieCtrlRegs.PIEACK.all = PIEACK_GROUP3;
}
interrupt void Epwm2int_isr(void){ //epwm2 interrupt
        EALLOW;
        EPwm2Regs.ETCLR.bit.INT        = 1;               
        EDIS;
        EPwm2Regs.CMPA.half.CMPA=(Uint16)((sin((xn/CarryRatio+0.1/0.3)*2*PI)*ModRatio+0.5)*((SYSTEM_CLK/EpwmDiv)/(CarryRatio*F_Out*2)+1));
        //enable other interrupt get be done in group 3
        PieCtrlRegs.PIEACK.all = PIEACK_GROUP3;
}
interrupt void Epwm3int_isr(void){ //epwm3 interrupt
        EALLOW;
        EPwm3Regs.ETCLR.bit.INT                = 1;               
        EDIS;
        EPwm3Regs.CMPA.half.CMPA=(Uint16)((sin((xn/CarryRatio+0.2/0.3)*2*PI)*ModRatio+0.5)*((SYSTEM_CLK/EpwmDiv)/(CarryRatio*F_Out*2)+1));       
        //enable other interrupt get be done in group 3
        PieCtrlRegs.PIEACK.all = PIEACK_GROUP3;
}
//===========================================================================
// No more.
//===========================================================================




使用特权

评论回复
板凳
Othink|  楼主 | 2015-5-14 22:39 | 只看该作者
本帖最后由 Othink 于 2015-5-14 22:45 编辑

关于compare的影子寄存器,第一次写入的话直接写入compare ,再次写入的话会被写入到影子寄存器,当设置的跟新寄存器跟新点到的时候,影子寄存器就会写入到compare寄存器中,可以这样理解么?

例如我在epwm初始化的时候连续写入两个值
EPwm3Regs.CMPA.half.CMPA=aa;
EPwm3Regs.CMPA.half.CMPA=bb;
并设置到达PRD值的时候跟新寄存器,计数模式为UPDOWN;
那么第一个周期的上升沿的比较值为aa,下降沿的比较值为bb;这样说法对么?各位大神

使用特权

评论回复
地板
Othink|  楼主 | 2015-5-14 22:45 | 只看该作者
求大家看看,我能不能上强电:'(

使用特权

评论回复
5
zhangmangui| | 2015-5-14 23:03 | 只看该作者
建议你先价格弱电看看输出的效果   没问题了   再加强电吧

使用特权

评论回复
6
edishen| | 2015-5-18 23:03 | 只看该作者
应该是没有问题,楼主有试过吗

使用特权

评论回复
7
zhangjin_comeon| | 2015-5-18 23:10 | 只看该作者
好多代码  啊     

使用特权

评论回复
8
zhangjin_comeon| | 2015-5-18 23:10 | 只看该作者
这些寄存器一般人都记不住    也不能帮你看出问题   

使用特权

评论回复
9
zhangjin_comeon| | 2015-5-18 23:11 | 只看该作者
建议你别加负载     县看波形

使用特权

评论回复
10
309030106| | 2015-5-20 22:26 | 只看该作者
准备加多少伏多少安的,

使用特权

评论回复
11
smilingangel| | 2015-5-21 13:42 | 只看该作者

这个程序代码的看着挺复杂的。

使用特权

评论回复
12
Othink|  楼主 | 2015-5-25 17:01 | 只看该作者
谢谢大家回复。。。。原工程师离职了,,我一个新手被叫去做其他工作了,,,,项目估计烂尾吧,,,好烦好烦

使用特权

评论回复
13
玛尼玛尼哄| | 2015-5-25 20:22 | 只看该作者
PieCtrlRegs.PIEIER3.bit.INTx1 = 1;
        PieCtrlRegs.PIEIER3.bit.INTx2 = 1;
        PieCtrlRegs.PIEIER3.bit.INTx3 = 1;
这个应该是用啥写的?阑尾的项目不好弄啊。

使用特权

评论回复
14
玛尼玛尼哄| | 2015-5-25 20:22 | 只看该作者
不知道一个月开多少工资,开一万以上,我愿意接受这个阑尾。

使用特权

评论回复
15
Thor9| | 2015-5-29 20:26 | 只看该作者
楼主这个问题怎么样了

使用特权

评论回复
16
wool羊| | 2015-10-8 15:42 | 只看该作者
你好,你的周期寄存器和CMPA的值的那两个公式没有理解,可以说一下嘛,谢谢啦

使用特权

评论回复
17
埃十多个特| | 2015-12-27 12:07 | 只看该作者
可不可以把例程发给我一下,急需,跪谢,1138613169@qq.com

使用特权

评论回复
18
weisuo2015| | 2016-10-9 17:29 | 只看该作者
Othink 发表于 2015-5-14 22:39
关于compare的影子寄存器,第一次写入的话直接写入compare ,再次写入的话会被写入到影子寄存器,当设置的 ...

CMPA.half.CMPA这个值好像应该不能设置成两次,而且本身就是左右对称的值,通过这个来求占空比,我感觉要实现间距不同的pwm应该用别的方法设置。。

使用特权

评论回复
19
茫然闲| | 2018-8-29 13:29 | 只看该作者
问一下这个比较器值怎么得来的,EPwm1Regs.CMPA.half.CMPA=(Uint16)((sin((xn/CarryRatio)*2*PI)*ModRatio+0.5)*((SYSTEM_CLK/EpwmDiv)/(CarryRatio*F_Out*2)+1));

使用特权

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

本版积分规则

4

主题

39

帖子

0

粉丝