久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 18989|回復: 21
收起左側

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, 下載次數: 572)

評分

參與人數 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 | 顯示全部樓層
感謝您的分享,能在我的研究上得到一些幫助
回復

使用道具 舉報

ID:1137817 發表于 2024-11-27 16:03 | 顯示全部樓層
感謝大佬的分享
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品久久av | 粉嫩一区二区三区性色av | 91中文字幕在线 | 亚洲精品国产综合区久久久久久久 | 亚洲网在线 | 毛片一级片 | 欧洲一区视频 | 亚洲不卡在线观看 | 精品一区二区三区四区五区 | 中文在线一区二区 | 国产精品伦一区二区三级视频 | 欧美久久久网站 | 亚洲精品视频导航 | 欧美午夜一区 | av香蕉| 91精品国产92 | 久久国产传媒 | 午夜精品一区二区三区在线视频 | 国产综合第一页 | 日韩精品一区二区三区 | 999免费视频 | 国产欧美精品区一区二区三区 | 亚洲网站在线观看 | 高清免费av | 妖精视频一区二区三区 | 成人av免费网站 | 久久久新视频 | 免费在线a视频 | 激情欧美一区二区三区中文字幕 | 亚洲欧洲一区二区 | 亚洲精品在线观看网站 | 亚洲精品国产一区 | 国产又色又爽又黄又免费 | 亚州一区二区三区 | 97精品国产97久久久久久免费 | 一区二区三区在线 | 夜夜摸天天操 | 亚洲精品www久久久久久广东 | 成人av免费| 欧美在线小视频 | 成人av片在线观看 |