找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 15814|回复: 20
收起左侧

TMS320F28335程序SVPWM源程序

  [复制链接]
ID:325681 发表于 2018-5-9 09:41 | 显示全部楼层 |阅读模式
分享一个DSP28335的SVPWM程序源码,可供参考
0.png

单片机源程序如下:
  1. //***************************************************/
  2. //文件名:SVPWM.c
  3. //功能:调用28335内部PWM模块生成SVPWM输出测试文件
  4. //说明:输入信息采用结构体,使用时改变结构体指针即可改变输入信号。
  5. //     InitSvpwm()函数提供PWM模块初始化以及相应PIE中断的配置。
  6. //     通过park逆变换得到静止平面坐标系下的电压信号。
  7. //     在PWM定时器下溢中断中更新比较器的值,即每个PWM周期更新一次
  8. //****************************************************/

  9. #include "DSP2833x_Device.h"     // DSP2833x Headerfile Include File
  10. #include "DSP2833x_Examples.h"   // DSP2833x Examples Include File
  11. #include "math.h"
  12. #include "float.h"
  13.         extern Uint16 RamfuncsRunStart;
  14.         extern Uint16 RamfuncsLoadStart;
  15.         extern Uint16 RamfuncsLoadEnd;
  16.         
  17. typedef struct
  18. {
  19.    float ds;              // 静止平面坐标系下电压信号
  20.    float qs;
  21.    float ang;             // 电气角度 电气角度=机械角度*极对数
  22.    float de;              // 旋转坐标系下电压信号
  23.    float qe;
  24. }IPARK;
  25.   IPARK ipark1={0,0,0,0.3,0.4};
  26. //  IPARK *v=&ipark1;       //改变此处结构体指针改变输入

  27. void InitSvpwm(void);
  28. void InitEPwm1(void);
  29. void InitEPwm2(void);
  30. void InitEPwm3(void);
  31. interrupt void epwm1_isr(void);
  32. void ipark(IPARK *v);
  33. void svgen(IPARK *v);

  34. #define PRD  7500                // PWM周期寄存器
  35. #define PI 3.1415926
  36. float tmr1,tmr2,tmr3;

  37. void main(void)
  38. {

  39.    InitSysCtrl();

  40.    DINT;
  41.    InitPieCtrl();
  42.    IER = 0x0000;
  43.    IFR = 0x0000;
  44.   
  45.    InitPieVectTable();

  46.         MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart);                        //Flash operation<F28335.cmd>

  47.         InitFlash();        
  48.         
  49.         InitSvpwm();

  50.    for(;;)
  51.    {
  52.        asm("          NOP");
  53.    }

  54. }

  55. void InitSvpwm(void)
  56. {  
  57.    InitEPwm1Gpio();
  58.    InitEPwm2Gpio();
  59.    InitEPwm3Gpio();

  60.    EALLOW;
  61.    PieVectTable.EPWM1_INT = &epwm1_isr;
  62.   
  63.    EDIS;

  64.    EALLOW;
  65.    SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;
  66.    EDIS;

  67.    InitEPwm1();
  68.    InitEPwm2();
  69.    InitEPwm3();

  70.    EALLOW;
  71.    SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;
  72.    EDIS;

  73.    IER |= M_INT3;

  74. // 使能中断 EPWM INT1 位于PIE中断分组3.1
  75.    PieCtrlRegs.PIEIER3.bit.INTx1 = 1;

  76.    EINT;
  77.    ERTM;
  78. }

  79. interrupt void epwm1_isr(void)
  80. {
  81.    // 更新 CMPA 和 CMPB 寄存器值
  82.    svgen(&ipark1);
  83.    EPwm1Regs.CMPA.half.CMPA=tmr1;
  84.    EPwm2Regs.CMPA.half.CMPA=tmr2;
  85.    EPwm3Regs.CMPA.half.CMPA=tmr3;
  86.    EPwm1Regs.CMPB=tmr1;
  87.    EPwm2Regs.CMPB=tmr2;
  88.    EPwm3Regs.CMPB=tmr3;
  89.    
  90.    // 清除中断标志
  91.    EPwm1Regs.ETCLR.bit.INT = 1;

  92.    // 清除中断响应
  93.    PieCtrlRegs.PIEACK.all = PIEACK_GROUP3;
  94. }


  95. void ipark(IPARK *v)
  96. {
  97.   float  ang;
  98.   ang=(v->ang/360)*2*PI;                    //角度转化为弧度
  99.   v->ds=v->de*cos(ang)-v->qe*sin(ang);      //得到静止平面坐标系下d轴电压
  100.   v->qs=v->qe*cos(ang)+v->de*sin(ang);      //得到静止平面坐标系下q轴电压
  101. }

  102. void svgen(IPARK *v)
  103. {
  104.    float Va,Vb,Vc,t1,t2,Ta,Tb,Tc;
  105.    Uint32 sector=0;                                               // sector=a+2b+4c 扇区状态标示 注意:setor的值1~6与扇区不是顺序对应
  106.    ipark(v);
  107.    Va=v->qs;                                                      // Va = Uq
  108.    Vb=(-0.5) * v->qs + (0.8660254) * v->ds;                       // Vb = 1/2*(sqrt(3)*Ud - Uq)         sqrt(3)/2=0.866
  109.    Vc=(-0.5) * v->qs - (0.8660254) * v->ds;                       // Vc = -1/2*(sqrt(3)Ud + Uq)
  110.    if(Va>0.0000001)                                               // 判断属于哪个扇区        
  111.    sector=1;                                                      // Va>0 则 a=1;否则a=0
  112.    if(Vb>0.0000001)                                               //
  113.    sector=sector+2;                                               // Vb>0 则 b=1;否则b=0
  114.    if(Vc>0.0000001)                                               //
  115.    sector=sector+4;                                               // Vc>0 则 c=1; 否则c=0
  116.    Va=v->qs;                                                     
  117.    Vb=(-0.5) * v->qs + (0.8660254) * v->ds;                     
  118.    Vc=(-0.5) * v->qs - (0.8660254) * v->ds;  

  119.    switch(sector){
  120.      case 1:                               //sector==1 对应扇区II
  121.        t1=Vc;
  122.        t2=Vb;
  123.        Tb=(0.25)*(1-t1-t2);
  124.        Ta=Tb+(0.5)*t1;
  125.        Tc=Ta+(0.5)*t2;
  126.            break;
  127.      case 2:                               //sector==2 对应扇区VI
  128.        t1=Vb;
  129.        t2=-Va;
  130.        Ta=(0.25)*(1-t1-t2);
  131.        Tc=Ta+(0.5)*t1;
  132.        Tb=Tc+(0.5)*t2;
  133.        break;
  134.      case 3:                               //sector==3 对应扇区I
  135.        t1=-Vc;
  136.        t2=Va;
  137.        Ta=(0.25)*(1-t1-t2);
  138.        Tb=Ta+(0.5)*t1;
  139.        Tc=Tb+(0.5)*t2;
  140.        break;
  141.      case 4:                               //sector==4 对应扇区IV
  142.        t1=-Va;
  143.        t2=Vc;
  144.        Tc=(0.25)*(1-t1-t2);
  145.        Tb=Tc+(0.5)*t1;
  146.        Ta=Tb+(0.5)*t2;
  147.        break;
  148.      case 5:                               //sector==5 对应扇区III
  149.        t1=Va;
  150.        t2=-Vb;
  151.        Tb=(0.25)*(1-t1-t2);
  152.        Tc=Tb+(0.5)*t1;
  153.        Ta=Tc+(0.5)*t2;
  154.        break;
  155.      case 6:                              //sector==6 对应扇区V   
  156.        t1=-Vb;
  157.        t2=-Vc;
  158.        Tc=(0.25)*(1-t1-t2);
  159.        Ta=Tc+(0.5)*t1;
  160.        Tb=Ta+(0.5)*t2;
  161.        break;
  162.      default:                             //sector=0和sector=7时错误
  163.        Ta=0.5;
  164.        Tb=0.5;
  165.        Tc=0.5;
  166.    }
  167.    tmr1=Ta*PRD;
  168.    tmr2=Tb*PRD;
  169.    tmr3=Tc*PRD;
  170. }
  171. void InitEPwm1()
  172. {
  173.    // 配置时钟
  174.    EPwm1Regs.TBCTL.bit.CTRMODE = 0x2;             // 增减计数模式
  175.    EPwm1Regs.TBPRD = PRD;                         // 设置周期
  176.    EPwm1Regs.TBCTL.bit.PHSEN = 0x0;               // 禁用相位加载同步
  177.    EPwm1Regs.TBPHS.half.TBPHS = 0x0000;           // 相位初值
  178.    EPwm1Regs.TBCTR = 0x0000;                      // 计数初值
  179.    EPwm1Regs.TBCTL.bit.HSPCLKDIV = 0x1;           // TBCLK = SYSCLKOUT / (HSPCLKDIV × CLKDIV)
  180.    EPwm1Regs.TBCTL.bit.CLKDIV = 0x1;

  181.    // 配置比较寄存器
  182.    EPwm1Regs.CMPCTL.bit.SHDWAMODE = 0x0;          //使用阴影寄存器      
  183.    EPwm1Regs.CMPCTL.bit.SHDWBMODE = 0x0;
  184.    EPwm1Regs.CMPCTL.bit.LOADAMODE = 0x0;          //计数器值为0时更新比较器值
  185.    EPwm1Regs.CMPCTL.bit.LOADBMODE = 0x0;

  186.    // 设置比较器初值
  187.    EPwm1Regs.CMPA.half.CMPA = 1875;               
  188.    EPwm1Regs.CMPB = 1875;                        

  189.    // 模式设定
  190.    EPwm1Regs.AQCTLA.bit.ZRO = 0x1;               // 等于0时输出低
  191.    EPwm1Regs.AQCTLA.bit.CAU = 0x3;               // 计数值=比较值时输出取反
  192.    EPwm1Regs.AQCTLB.bit.ZRO = 0x2;               // 等于0时输出高
  193.    EPwm1Regs.AQCTLB.bit.CBU = 0x3;               // 计数值=比较值时输出取反

  194.    // 配置中断
  195.    EPwm1Regs.ETSEL.bit.INTSEL = 0x1;             // 计数值到0触发事件
  196.    EPwm1Regs.ETSEL.bit.INTEN = 1;                // 使能中断
  197.    EPwm1Regs.ETPS.bit.INTPRD = 0x1;              // 每次事件发生都触发中断
  198. }


  199. void InitEPwm2()
  200. {
  201.    EPwm2Regs.TBCTL.bit.CTRMODE = 0x2;        
  202.    EPwm2Regs.TBPRD = PRD;                  
  203.    EPwm2Regs.TBCTL.bit.PHSEN = 0x0;         
  204.    EPwm2Regs.TBPHS.half.TBPHS = 0x0000;        
  205.    EPwm2Regs.TBCTR = 0x0000;                  
  206.    EPwm2Regs.TBCTL.bit.HSPCLKDIV = 0x1;     
  207.    EPwm2Regs.TBCTL.bit.CLKDIV = 0x1;
  208.    EPwm2Regs.CMPCTL.bit.SHDWAMODE = 0x0;         
  209.    EPwm2Regs.CMPCTL.bit.SHDWBMODE = 0x0;
  210.    EPwm2Regs.CMPCTL.bit.LOADAMODE = 0x0;   
  211.    EPwm2Regs.CMPCTL.bit.LOADBMODE = 0x0;
  212.    EPwm2Regs.CMPA.half.CMPA = 1875;               
  213.    EPwm2Regs.CMPB = 1875;                        
  214.    EPwm2Regs.AQCTLA.bit.ZRO = 0x1;                        
  215.    EPwm2Regs.AQCTLA.bit.CAU = 0x3;               
  216.    EPwm2Regs.AQCTLB.bit.ZRO = 0x2;            
  217.    EPwm2Regs.AQCTLB.bit.CBU = 0x3;                     
  218.    EPwm2Regs.ETSEL.bit.INTEN = 0;                 //屏蔽中断            
  219.             
  220. }

  221. void InitEPwm3(void)
  222. {
  223.    EPwm3Regs.TBCTL.bit.CTRMODE = 0x2;         
  224.    EPwm3Regs.TBPRD = PRD;                     
  225.    EPwm3Regs.TBCTL.bit.PHSEN = 0x0;            
  226.    EPwm3Regs.TBPHS.half.TBPHS = 0x0000;        
  227.    EPwm3Regs.TBCTR = 0x0000;                    
  228. ……………………

  229. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
21840266SVPWM.rar (670.53 KB, 下载次数: 541)

评分

参与人数 2黑币 +56 收起 理由
AAA_MCU + 6 很给力!
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:672210 发表于 2019-12-24 17:07 | 显示全部楼层
用这个在CCS3.3上build的时候有两个错误,怎么搞呀
回复

使用道具 举报

ID:380348 发表于 2018-7-29 12:10 | 显示全部楼层
楼主威武,赞
回复

使用道具 举报

ID:259858 发表于 2018-10-30 10:01 | 显示全部楼层
参考参考,想做使stm32的,谢谢
回复

使用道具 举报

ID:452722 发表于 2019-1-10 15:59 | 显示全部楼层

非常详细,感谢楼主
回复

使用道具 举报

ID:331960 发表于 2019-2-24 16:23 | 显示全部楼层
楼主威武,赞
回复

使用道具 举报

ID:506086 发表于 2019-4-7 10:03 | 显示全部楼层
楼主威武,赞
回复

使用道具 举报

ID:389520 发表于 2019-5-13 16:20 | 显示全部楼层
筑梦者1993 发表于 2018-10-30 10:01
参考参考,想做使stm32的,谢谢

我也是想做stm32的,想问你做的咋样了
回复

使用道具 举报

ID:41347 发表于 2019-5-13 17:28 | 显示全部楼层
看上去不错
回复

使用道具 举报

ID:115379 发表于 2019-7-19 11:26 | 显示全部楼层
厉害了,善于分享的人就是帅气
回复

使用道具 举报

ID:259858 发表于 2019-8-3 21:14 | 显示全部楼层
这个是CCS的程序吧,我的头文件在那里面有红色波浪线,是啥问题
回复

使用道具 举报

ID:115379 发表于 2019-8-16 10:04 | 显示全部楼层
善于分享的人,cool
回复

使用道具 举报

ID:546399 发表于 2019-8-29 08:50 | 显示全部楼层
多谢分享,正在研究,下来看看呢
回复

使用道具 举报

ID:316022 发表于 2019-9-11 17:31 | 显示全部楼层
老大威武。。。。。。。。。
回复

使用道具 举报

ID:259858 发表于 2019-11-25 20:14 | 显示全部楼层
看着挺不错
回复

使用道具 举报

ID:650786 发表于 2019-11-27 14:48 | 显示全部楼层
楼主很棒,要从程序学起,加油!只可惜现在还不能下载
回复

使用道具 举报

ID:650786 发表于 2019-11-27 14:50 | 显示全部楼层
楼主很棒,好像下载,只可惜现在币不够
回复

使用道具 举报

ID:413261 发表于 2021-7-26 14:33 | 显示全部楼层
挺好的,有参考意义,谢谢大神
回复

使用道具 举报

ID:1039376 发表于 2022-7-13 19:39 | 显示全部楼层
定义的typedef sturct怎么用?
回复

使用道具 举报

ID:1068799 发表于 2023-3-28 21:01 | 显示全部楼层
牛啊,有借鉴意义
回复

使用道具 举报

ID:1081238 发表于 2023-5-31 22:45 | 显示全部楼层
感謝您的分享,能在我的研究上得到一些幫助
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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