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

[复制链接]
 楼主| Othink 发表于 2015-5-14 22:32 | 显示全部楼层 |阅读模式
28335 epwm生成的双极性SPWM波形,波形没问题,,能加强电么
 楼主| Othink 发表于 2015-5-14 22:33 | 显示全部楼层
本帖最后由 Othink 于 2015-5-14 22:35 编辑
  1. #include "DSP2833x_Device.h"     // DSP2833x Headerfile Include File
  2. #include "DSP2833x_Examples.h"   // DSP2833x Examples Include File
  3. #include "math.h"
  4. //===========================================================================
  5. #define    SYSTEM_CLK  150000000        //cpu frequency                 
  6. #define    Dead_Time           800                //dead time  
  7. #define    PI                   3.1415926        //pi value
  8. //===========================================================================
  9. Uint16 CarryRatio=160;                                // carries ratio
  10. float xn=0.0000;
  11. Uint16 temp=0;
  12. float ModRatio=0.6;                                        //modlation ratio
  13. Uint16 EpwmDiv=2;                                        //epwm clock dive rate
  14. float F_Out=50.0;                                        //frequency of output
  15.        
  16. //===========================================================================
  17. interrupt void Epwm1int_isr(void); //epwm1 interrupt
  18. interrupt void Epwm2int_isr(void); //epwm2 interrupt
  19. interrupt void Epwm3int_isr(void); //epwm3 interrupt
  20. void Epwm1Setup(void);
  21. void Epwm2Setup(void);
  22. void Epwm3Setup(void);
  23. //===========================================================================
  24. void main(void){
  25. // Step 1. Initialize System Control:
  26.    InitSysCtrl();
  27. // Step 2. Initalize GPIO:
  28.    InitGpio();  // Skipped for this example
  29.    InitXintf16Gpio();        //zq
  30. // Step 3. Clear all interrupts and initialize PIE vector table:
  31.    DINT;
  32.    InitPieCtrl();
  33.    IER = 0x0000;
  34.    IFR = 0x0000;
  35. // Initialize the PIE vector table with pointers to the shell Interrupt
  36.    InitPieVectTable();
  37. // Interrupts that are used in this example are re-mapped to
  38.    EALLOW;  // This is needed to write to EALLOW protected registers
  39.    PieVectTable.EPWM1_INT = &Epwm1int_isr;
  40.    PieVectTable.EPWM2_INT = &Epwm2int_isr;
  41.    PieVectTable.EPWM3_INT = &Epwm3int_isr;
  42.    Epwm1Setup();
  43.    Epwm2Setup();
  44.    Epwm3Setup();
  45.    EPwm1Regs.TBCTR=0;
  46.    EPwm1Regs.TBCTL.bit.SWFSYNC=1;                // generate a soft synch
  47.    EDIS;    // This is needed to disable write to EALLOW protected registers
  48.        
  49.         PieCtrlRegs.PIECTRL.bit.ENPIE = 1;

  50.         PieCtrlRegs.PIEIER3.bit.INTx1 = 1;
  51.         PieCtrlRegs.PIEIER3.bit.INTx2 = 1;
  52.         PieCtrlRegs.PIEIER3.bit.INTx3 = 1;
  53.     //enable core interrupt enable register : group 3 is enabled
  54.     IER |= M_INT3;     
  55.     EINT;   // Enable Global interrupt INTM
  56.     ERTM;   // Enable Global realtime interrupt DBGM
  57.     InitEPwmGpio();
  58.     for(; 1;)
  59.     {
  60.        
  61.     }

  62. }

  63. //===========================================================================
  64. void Epwm1Setup(void){
  65.         //Time base configuration
  66.         EPwm1Regs.TBPRD=(SYSTEM_CLK/EpwmDiv)/(CarryRatio*F_Out*2)+1;
  67.         EPwm1Regs.TBPHS.half.TBPHS=0; //phase equal 0
  68.         EPwm1Regs.TBCTL.bit.CTRMODE=TB_COUNT_UPDOWN;                        //UpDownMoudle
  69.         if(EpwmDiv==1)EPwm1Regs.TBCTL.bit.HSPCLKDIV=0;
  70.         else EPwm1Regs.TBCTL.bit.HSPCLKDIV=EpwmDiv/2;
  71.         EPwm1Regs.TBCTL.bit.PRDLD=TB_SHADOW;         // shadow the accesses register TBPRD the to read or write  
  72.         EPwm1Regs.TBCTL.bit.FREE_SOFT=3;                //time basic run free
  73.         EPwm1Regs.TBCTL.bit.PHSDIR=1;//count up after a syncy
  74.         EPwm1Regs.TBCTL.bit.PHSEN=1;                 //
  75.         EPwm1Regs.TBCTL.bit.SYNCOSEL=TB_CTR_ZERO;        //master
  76.         EPwm1Regs.TBCTR=0;
  77.         //compare register configuration
  78.         EPwm1Regs.CMPCTL.bit.SHDWAMODE         = CC_SHADOW;             // Load registers every ZERO
  79.         //EPwm1Regs.CMPCTL.bit.SHDWBMODE         = CC_SHADOW;
  80.         EPwm1Regs.CMPCTL.bit.LOADAMODE         = CC_CTR_PRD;
  81.         //EPwm1Regs.CMPCTL.bit.LOADBMODE         = CC_CTR_PRD;       
  82.         EPwm1Regs.CMPA.half.CMPA=(Uint16)((sin((xn/CarryRatio)*2*PI)*ModRatio+0.5)*((SYSTEM_CLK/EpwmDiv)/(CarryRatio*F_Out*2)+1));
  83.         //action qualifier configuration
  84.         EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR;               // Set PWM1A on Zero
  85.         EPwm1Regs.AQCTLA.bit.CAD = AQ_SET;
  86.         //EPwm1Regs.AQCTLB.bit.CAU = AQ_SET;
  87.         //EPwm1Regs.AQCTLB.bit.CAD = AQ_CLEAR;
  88.         //dead band register configuration
  89.         EPwm1Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE;       
  90.         EPwm1Regs.DBCTL.bit.POLSEL   = DB_ACTV_HIC;         
  91.         EPwm1Regs.DBCTL.bit.IN_MODE  = DBA_ALL;                       
  92.         EPwm1Regs.DBRED = Dead_Time;                                       
  93.         EPwm1Regs.DBFED = Dead_Time;
  94.         //trip zone register configuration
  95.        
  96.         //event trigger register configuration
  97.         EPwm1Regs.ETSEL.bit.INTSEL        = 1;
  98.         EPwm1Regs.ETSEL.bit.INTEN        = 1;
  99.         EPwm1Regs.ETPS.bit.INTPRD        = 1;
  100.         EPwm1Regs.ETCLR.bit.INT                = 1;
  101. }
  102. void Epwm2Setup(void){
  103.         //Time base configuration
  104.         EPwm2Regs.TBPRD=(SYSTEM_CLK/EpwmDiv)/(CarryRatio*F_Out*2)+1;
  105.         EPwm2Regs.TBPHS.half.TBPHS=0; //phase equal 0
  106.         EPwm2Regs.TBCTL.bit.CTRMODE=TB_COUNT_UPDOWN;        //UpDownMoudle
  107.         if(EpwmDiv==1)EPwm2Regs.TBCTL.bit.HSPCLKDIV=0;
  108.         else EPwm2Regs.TBCTL.bit.HSPCLKDIV=EpwmDiv/2;               
  109.         EPwm2Regs.TBCTL.bit.PRDLD=TB_SHADOW;         // shadow the accesses register TBPRD the to read or write  
  110.         EPwm2Regs.TBCTL.bit.FREE_SOFT=3;                //time basic run free
  111.         EPwm2Regs.TBCTL.bit.PHSDIR=1;//count up after a syncy
  112.         EPwm2Regs.TBCTL.bit.PHSEN=1;                 //
  113.         EPwm2Regs.TBCTL.bit.SYNCOSEL=TB_SYNC_IN;        //master
  114.         EPwm2Regs.TBCTR=0;
  115.         //compare register configuration
  116.         EPwm2Regs.CMPCTL.bit.SHDWAMODE         = CC_SHADOW;             // Load registers every ZERO
  117.         //EPwm1Regs.CMPCTL.bit.SHDWBMODE         = CC_SHADOW;
  118.         EPwm2Regs.CMPCTL.bit.LOADAMODE         = CC_CTR_PRD;
  119.         //EPwm1Regs.CMPCTL.bit.LOADBMODE         = CC_CTR_PRD;
  120.         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));
  121.         //action qualifier configuration
  122.         EPwm2Regs.AQCTLA.bit.CAU = AQ_CLEAR;               // Set PWM1A on Zero
  123.         EPwm2Regs.AQCTLA.bit.CAD = AQ_SET;
  124.         //EPwm2Regs.AQCTLB.bit.CAU = AQ_SET;
  125.         //EPwm2Regs.AQCTLB.bit.CAD = AQ_CLEAR;
  126.         //dead band register configuration
  127.         EPwm2Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE;       
  128.         EPwm2Regs.DBCTL.bit.POLSEL   = DB_ACTV_HIC;         
  129.         EPwm2Regs.DBCTL.bit.IN_MODE  = DBA_ALL;                       
  130.         EPwm2Regs.DBRED = Dead_Time;                                       
  131.         EPwm2Regs.DBFED = Dead_Time;
  132.         //trip zone register configuration
  133.        
  134.         //event trigger register configuration
  135.         EPwm2Regs.ETSEL.bit.INTSEL        = 1;
  136.         EPwm2Regs.ETSEL.bit.INTEN        = 1;
  137.         EPwm2Regs.ETPS.bit.INTPRD        = 1;
  138.         EPwm2Regs.ETCLR.bit.INT                = 1;
  139. }
  140. void Epwm3Setup(void){
  141.         //Time base configuration
  142.         EPwm3Regs.TBPRD=(SYSTEM_CLK/EpwmDiv)/(CarryRatio*F_Out*2)+1;
  143.         EPwm3Regs.TBPHS.half.TBPHS=0; //phase equal 0
  144.         EPwm3Regs.TBCTL.bit.CTRMODE=TB_COUNT_UPDOWN;
  145.         if(EpwmDiv==1)EPwm3Regs.TBCTL.bit.HSPCLKDIV=0;
  146.         else EPwm3Regs.TBCTL.bit.HSPCLKDIV=EpwmDiv/2;                        //UpDownMoudle
  147.         EPwm3Regs.TBCTL.bit.PRDLD=TB_SHADOW;         // shadow the accesses register TBPRD the to read or write  
  148.         EPwm3Regs.TBCTL.bit.FREE_SOFT=3;                //time basic run free
  149.         EPwm3Regs.TBCTL.bit.PHSDIR=1;//count up after a syncy
  150.         EPwm3Regs.TBCTL.bit.PHSEN=1;                
  151.         EPwm3Regs.TBCTL.bit.SYNCOSEL=TB_SYNC_IN;        //slave
  152.         EPwm3Regs.TBCTR=0;       
  153.         //compare register configuration
  154.         EPwm3Regs.CMPCTL.bit.SHDWAMODE         = CC_SHADOW;             // Load registers every ZERO
  155.         //EPwm3Regs.CMPCTL.bit.SHDWBMODE         = CC_SHADOW;
  156.         EPwm3Regs.CMPCTL.bit.LOADAMODE         = CC_CTR_PRD;
  157.         //EPwm3Regs.CMPCTL.bit.LOADBMODE         = CC_CTR_PRD;
  158.         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));
  159.         //action qualifier configuration
  160.         EPwm3Regs.AQCTLA.bit.CAU = AQ_CLEAR;               // Set PWM1A on Zero
  161.         EPwm3Regs.AQCTLA.bit.CAD = AQ_SET;
  162.         //EPwm1Regs.AQCTLB.bit.CAU = AQ_SET;
  163.         //EPwm1Regs.AQCTLB.bit.CAD = AQ_CLEAR;
  164.         //dead band register configuration
  165.         EPwm3Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE;       
  166.         EPwm3Regs.DBCTL.bit.POLSEL   = DB_ACTV_HIC;         
  167.         EPwm3Regs.DBCTL.bit.IN_MODE  = DBA_ALL;                       
  168.         EPwm3Regs.DBRED = Dead_Time;                                       
  169.         EPwm3Regs.DBFED = Dead_Time;
  170.         //trip zone register configuration
  171.        
  172.         //event trigger register configuration
  173.         EPwm3Regs.ETSEL.bit.INTSEL        = 1;
  174.         EPwm3Regs.ETSEL.bit.INTEN        = 1;
  175.         EPwm3Regs.ETPS.bit.INTPRD        = 1;
  176.         EPwm3Regs.ETCLR.bit.INT                = 1;
  177. }
  178. //===========================================================================
  179. interrupt void Epwm1int_isr(void){ //epwm1 interrupt
  180.         EALLOW;
  181.         EPwm1Regs.ETCLR.bit.INT                = 1;               
  182.         EDIS;
  183.         xn++;
  184.         if(xn==CarryRatio)xn=0;
  185.         EPwm1Regs.CMPA.half.CMPA=(Uint16)((sin((xn/CarryRatio)*2*PI)*ModRatio+0.5)*((SYSTEM_CLK/EpwmDiv)/(CarryRatio*F_Out*2)+1));
  186.         //enable other interrupt get be done in group 3
  187.         PieCtrlRegs.PIEACK.all = PIEACK_GROUP3;
  188. }
  189. interrupt void Epwm2int_isr(void){ //epwm2 interrupt
  190.         EALLOW;
  191.         EPwm2Regs.ETCLR.bit.INT        = 1;               
  192.         EDIS;
  193.         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));
  194.         //enable other interrupt get be done in group 3
  195.         PieCtrlRegs.PIEACK.all = PIEACK_GROUP3;
  196. }
  197. interrupt void Epwm3int_isr(void){ //epwm3 interrupt
  198.         EALLOW;
  199.         EPwm3Regs.ETCLR.bit.INT                = 1;               
  200.         EDIS;
  201.         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));       
  202.         //enable other interrupt get be done in group 3
  203.         PieCtrlRegs.PIEACK.all = PIEACK_GROUP3;
  204. }
  205. //===========================================================================
  206. // No more.
  207. //===========================================================================




 楼主| 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 | 显示全部楼层
求大家看看,我能不能上强电:'(
zhangmangui 发表于 2015-5-14 23:03 | 显示全部楼层
建议你先价格弱电看看输出的效果   没问题了   再加强电吧
edishen 发表于 2015-5-18 23:03 | 显示全部楼层
应该是没有问题,楼主有试过吗
zhangjin_comeon 发表于 2015-5-18 23:10 | 显示全部楼层
好多代码  啊     
zhangjin_comeon 发表于 2015-5-18 23:10 | 显示全部楼层
这些寄存器一般人都记不住    也不能帮你看出问题   
zhangjin_comeon 发表于 2015-5-18 23:11 | 显示全部楼层
建议你别加负载     县看波形
309030106 发表于 2015-5-20 22:26 | 显示全部楼层
准备加多少伏多少安的,
smilingangel 发表于 2015-5-21 13:42 | 显示全部楼层

这个程序代码的看着挺复杂的。
 楼主| Othink 发表于 2015-5-25 17:01 | 显示全部楼层
谢谢大家回复。。。。原工程师离职了,,我一个新手被叫去做其他工作了,,,,项目估计烂尾吧,,,好烦好烦
玛尼玛尼哄 发表于 2015-5-25 20:22 | 显示全部楼层
PieCtrlRegs.PIEIER3.bit.INTx1 = 1;
        PieCtrlRegs.PIEIER3.bit.INTx2 = 1;
        PieCtrlRegs.PIEIER3.bit.INTx3 = 1;
这个应该是用啥写的?阑尾的项目不好弄啊。
玛尼玛尼哄 发表于 2015-5-25 20:22 | 显示全部楼层
不知道一个月开多少工资,开一万以上,我愿意接受这个阑尾。
Thor9 发表于 2015-5-29 20:26 | 显示全部楼层
楼主这个问题怎么样了
wool羊 发表于 2015-10-8 15:42 | 显示全部楼层
你好,你的周期寄存器和CMPA的值的那两个公式没有理解,可以说一下嘛,谢谢啦
埃十多个特 发表于 2015-12-27 12:07 | 显示全部楼层
可不可以把例程发给我一下,急需,跪谢,1138613169@qq.com
weisuo2015 发表于 2016-10-9 17:29 | 显示全部楼层
Othink 发表于 2015-5-14 22:39
关于compare的影子寄存器,第一次写入的话直接写入compare ,再次写入的话会被写入到影子寄存器,当设置的 ...

CMPA.half.CMPA这个值好像应该不能设置成两次,而且本身就是左右对称的值,通过这个来求占空比,我感觉要实现间距不同的pwm应该用别的方法设置。。
茫然闲 发表于 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

粉丝
快速回复 在线客服 返回列表 返回顶部

4

主题

39

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部