西莫电机圈

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

手机号码,快捷登录

查看: 3345|回复: 4

[分享] 网上找的svpwm程序

 关闭 [复制链接]

该用户从未签到

发表于 2010-4-25 15:19 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
该程序用于简单的SVPWM演示,产生3相互差120度电角度的正弦交流电压,未考虑其他因素,仅供参考,大家一起学习下吧,我也刚开始看……

附件为c语言编写的主程序,其他.h,.c,.cmd文件略

西莫电机论坛微信公众平台正式上线!★详情请点击★ 西莫电机论坛会员交流专用群欢迎您西莫电机论坛加群请注明论坛用户名及所从事专业,否则不予通过

该用户从未签到

 楼主| 发表于 2010-4-25 15:28 | 显示全部楼层
  1. // 该程序用于简单的SVPWM演示,产生3相互差120度电角度的正弦交流电压,此程序实时计算cmp1和cmp2的值
  2. #include         "register.h"  
  3. #include         "float.h"
  4. #include         "math.h"
  5. float            ualfa[200],ubeta[200]; // 存储电压矢量Uout的(α,β)轴分量ualfa、ubeta的数组
  6. int            sector[200];              // 定义存储扇区数的数组
  7. #define         PI2        2*3.1415926    // 定义2π的值   
  8. #define         DETA    PI2/200           // 定义相临两个Uout之间的电角度的差值
  9. #define         INIA        3.1415926/180 // 定义Uout的初始电角度  
  10. #define         TP       1200             // t1的周期寄存器的值,其值等于SVPWM调制周期T的一半,
  11.                                           // 因为在该程序中2π电角度内Uout的点数一定,故改变此值
  12.                                           // 可以改变输出的3相正弦交流电压的频率
  13. #define         KP      0.7               // 定义Uout的标幺值,KP的值在0和1之间,改变此值可以
  14.                                           // 改变逆变桥输出电压的幅值
  15. //  屏蔽中断子程序         
  16. void inline disable()
  17. {
  18.     asm(" setc INTM");
  19. }
  20. // 系统初始化子程序
  21. viod  initial()
  22. {
  23.     *IFR=0xFFFF;                         //  清除所有的中断标志        
  24.     *IMR=0X0;                            // 屏蔽所有中断
  25.     *SCSR1=0x81FE;                       // CLKIN=6M,CLKOUT=24M
  26.         *WDCR=0xE8;                      // 不使能看门狗
  27.     *T3PER=TP;                           // 通用定时器1的周期=PWM的周期/指令周期/2
  28.     *T3CON=0X0802;                       // 设置通用定时器1为连续增减模式,以产生对称的PWM,
  29.                                           // 且为了便于调试,使仿真一挂起时时钟就停止运行
  30.     *ACTRB=0X666;                        // PWM7、9、11高有效,PWM8、10、12低有效
  31.     *COMCONB=0X9200;                     // 使能PWM输出和比较动作
  32.      *EVBIMRA=0X00;                      // 禁止EVB和时钟及比较有关的中断
  33.     *T3CNT=0X00;                         // T1的计数器清0  
  34.     *EVBIFRA=0x0FFFF;                    // 清除EVB相应的中断标志  
  35.     *MCRC=*MCRC|0X7E;                    // PWM7-PWM12输出使能,使能IOPE1-IOPE6第二功能      
  36.      WSGR=0x0000;                        // 不使能所有的等待状态
  37. }
  38. // 根据Uout的标幺值KP计算ualfa,ubeta子程序
  39. void  calu()
  40. {
  41.     int    i;
  42.     for(i=0;i&lt200;i++)
  43.     {
  44.         ualfa=KP*cos(INIA+i*DETA);
  45.         ubeta=KP*sin(INIA+i*DETA);
  46.     }
  47. }
  48. // 各点的扇区确定子程序
  49. void  SECTOR()
  50. {
  51.     int    i,a,b,c;
  52.     float    vref1,vref2,vref3;
  53.     for(i=0;i&lt200;i++)
  54.     {
  55.         vref1=ubeta;
  56.         vref2=(-ubeta+ualfa*1.732051)/2;   
  57.         vref3=(-ubeta-ualfa*1.732051)/2;    // 计算确定扇区数需要的3个参考量
  58. // vref1、vref2、vref3
  59.         if(vref1&gt0)        a=1;
  60.         else    a=0;   
  61.         if(vref2&gt0)        b=1;
  62.         else    b=0;
  63.         if(vref3&gt0)        c=1;
  64.         else    c=0;
  65.         a=4*c+2*b+a;
  66.         switch(a){
  67. case 1:sector=1;break;            
  68.             case 2:sector=5;break;
  69.             case 3:sector=0;break;
  70.             case 4:sector=3;break;
  71.             case 5:sector=2;break;
  72.             case 6:sector=4;break;
  73.             default:break;
  74.         }                        // 根据相应的关系确定各个Uout所在的扇区
  75.     }
  76. }
  77. // 主程序
  78. main()
  79. {
  80. int    anticlk[6]={0x1666,0x3666,0x2666,0x6666,0x4666,0x5666};
  81. // 逆时针旋转的6个基本矢量
  82. int    i,k=0,cmp1,cmp2;
  83. float     x,y,z;   
  84.     disable();                            // 屏蔽所有中断
  85.     initial();                            // 系统初始化
  86.     calu();                               // 计算ualfa,ubeta的值
  87.     SECTOR();                             // 确定各点的扇区,在实际应用时应该由即时
  88. // 的ualfa和ubeta即时算出
  89. while(1)    {
  90.         for(i=0;i&lt200;i++)    {
  91.             *ACTRB=anticlk[sector];        // 重新装配ACTRA
  92.             x=ubeta;
  93.             y=(1.732051*ualfa+ubeta)/2;
  94.             z=(-1.732051*ualfa+ubeta)/2;   // 以上3句计算3个相应的参考量
  95.             switch(sector)    {
  96.                 case 0 :cmp1=(int)(-z*TP),cmp2=(int)(x*TP);break;
  97.                 case 1 :cmp1=(int)(y*TP),cmp2=(int)(z*TP);break;
  98.                 case 2 :cmp1=(int)(x*TP),cmp2=(int)(-y*TP);break;
  99.                 case 3 :cmp1=(int)(z*TP),cmp2=(int)(-x*TP);break;
  100.                 case 4 :cmp1=(int)(-y*TP),cmp2=(int)(-z*TP);break;
  101.                 case 5 :cmp1=(int)(-x*TP),cmp2=(int)(y*TP);break;
  102.                 default : break;
  103.             }    // 以上根据uout所处的扇区计算相应的cmp1和cmp2的值
  104.             *CMPR4=cmp1;            // 比较寄存器4赋值
  105.             *CMPR5=cmp1+cmp2;        // 比较寄存器5赋值
  106.             if((i+k)==0)        *T3CON=*T3CON|0X040;    // 启动定时器,只启动一次
  107. while(1)    {
  108.                 k=*EVBIFRA&0X0200;
  109.                 if(k==0x0200)    break;    // 如果T3的中断标志建立,则停止等待
  110.             }   
  111. }
  112. }
  113. }
  114. // 如果由于干扰引起中断,则执行此直接返回程序
  115. void interrupt nothing()
  116. {
  117.     return;
  118. }
复制代码
西莫电机论坛微信公众平台正式上线!★详情请点击★ 西莫电机论坛会员交流专用群欢迎您西莫电机论坛加群请注明论坛用户名及所从事专业,否则不予通过
回复

使用道具 举报

该用户从未签到

发表于 2010-5-23 13:30 | 显示全部楼层
这是开什么飞机!
有没有文本文件呀,那样可以更好的参照呀!
西莫电机论坛微信公众平台正式上线!★详情请点击★ 西莫电机论坛会员交流专用群欢迎您西莫电机论坛加群请注明论坛用户名及所从事专业,否则不予通过
回复

使用道具 举报

签到天数: 4 天

连续签到: 1 天

[LV.2]偶尔看看I

发表于 2010-5-26 10:08 | 显示全部楼层
很多芯片厂商的官网上都有样例代码的 美芯 TI 什么的都有
西莫电机论坛微信公众平台正式上线!★详情请点击★ 西莫电机论坛会员交流专用群欢迎您西莫电机论坛加群请注明论坛用户名及所从事专业,否则不予通过
回复

使用道具 举报

该用户从未签到

发表于 2010-5-27 22:36 | 显示全部楼层
晕倒,这样的东西还是别发的好!
西莫电机论坛微信公众平台正式上线!★详情请点击★ 西莫电机论坛会员交流专用群欢迎您西莫电机论坛加群请注明论坛用户名及所从事专业,否则不予通过
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|手机版|Archiver|西莫电机圈 ( 浙ICP备10025899号-3 浙公网安备:33028202000436号

GMT+8, 2024-5-20 00:16 , Processed in 0.298026 second(s), 26 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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