睿翼1992 发表于 2015-9-10 17:26

根据论坛中的帖子写的SVPWM的C语言代码,亲测可用

static void SVPWM_3ShuntCalcDutyCycles(void)
{       
   
       u8a,b,c;   

                  hElectrical_AngleCnt += Pwm_PutAdd_UpDT;
                  if(hElectrical_AngleCnt > 10922) hElectrical_AngleCnt =10922;//60度
                   Electrical_Angle = hElectrical_Angle - bSign*hElectrical_AngleCnt + Turn_Angle_Error+Svpwm_Angle_Error;
               Pwm_AngleA1 = (signed short)(Electrical_Angle);    //求出当前电角度

               TIM1->CCER=0x1ddd;
           if(Motor_Pwm_Aim > 2180) Motor_Pwm_Aim = 2180;      //   32768/15
           Vector_Components = Trig_Functions(Pwm_AngleA1);
   Valpha_tmp1 =Motor_Pwm_Aim*15 * Vector_Components.hCos/32768;        //
   Valpha_1 = (s16)(Valpha_tmp1);               
   
       Vbeta_tmp1 =Motor_Pwm_Aim*15 * Vector_Components.hSin/32768;                // Uout*Sin电角度
   Vbeta_1 = (s16)(Vbeta_tmp1);               
          
           UAlpha = Valpha_1 * T_SQRT3 ;   //11200*1.73205   
   UBeta= Vbeta_1 * T;   //U百塔*4*Tpwm(扩大4倍)
       
               X= UBeta;               //(X=0)Ubeta=0,就是V1(100),V4(011)所在的这条线,       (0° /180°)
               Y= ( UAlpha+ UBeta)/2;//(Y=0)Ualfa+Ubeta=0,就是V2(110),V5(001)所在的这条线 (60° /240°)
               Z= (-UAlpha+ UBeta)/2;//(Z=0)Ualfa-Ubeta=0,就是V3(010),V6(101)所在的这条线(120°/300°)
           Va = UBeta;                     //(clarke逆变换)
           Vb = ( UAlpha- UBeta)/2;
   Vc = (-UAlpha- UBeta)/2;
           if(Va>=0) {a=1;} else a=0;
               if(Vb>=0) {b=1;} else b=0;
               if(Vc>=0) {c=1;} else c=0;
               Sector=a+2*b+4*c;
          switch(Sector) //
{
    case SECTOR_3:   //扇区1
      hTimePhA = (T/8) + ((( T + Z - X)/2)/131072);    //32768*4
                                hTimePhB = hTimePhA - Z/131072;
                                hTimePhC = hTimePhB + X/131072;                  
                break;
    case SECTOR_1:   //扇区2
      hTimePhB = (T/8) + ((( T- Z - Y)/2)/131072);
                                hTimePhA = hTimePhB + Z/131072;
                                hTimePhC = hTimePhA + Y/131072;                     
                break;

    case SECTOR_5://扇区3
      hTimePhB = (T/8) + (((T - X + Y)/2)/131072);
                                hTimePhC = hTimePhB + X/131072;
                                hTimePhA = hTimePhC - Y/131072;                                       
                break;
   
    case SECTOR_4://扇区4
                                hTimePhC = (T/8) + (((T + X - Z)/2)/131072);
                                hTimePhB = hTimePhC - X/131072;
                                hTimePhA = hTimePhB + Z/131072;                              
                break;
   
    case SECTOR_6://扇区5
      hTimePhC = (T/8) + (((T + Y + Z)/2)/131072);
                                hTimePhA = hTimePhC - Y/131072;
                                hTimePhB = hTimePhA - Z/131072;                                    
                break;
               
    case SECTOR_2://扇区6
      hTimePhA = (T/8) + (((T - Y + X)/2)/131072);
                                hTimePhC = hTimePhA + Y/131072;
                                hTimePhB = hTimePhC - X/131072;                              
                break;
    default:
                break;
   }

睿翼1992 发表于 2015-9-10 17:31

本人使用在无刷电机控制中,电流0.6A左右,转动正常,但是加负载后有点抖动的感觉,正在研究中,,,,

睿翼1992 发表于 2015-9-10 17:32

https://bbs.simol.cn/forum.php?mod=viewthread&tid=130960&highlight=svpwm

xiwaspe 发表于 2016-9-21 08:51

好厉害,继续看看看看

xiaoxiao201005 发表于 2017-1-3 14:10

楼主大哥,你在干啥,这不是ST的代码吗?

Jonny0811 发表于 2017-10-20 13:27

也不完全是,是把ST的修改过的,ST的SVPWM一团糟,首先T/2部分与文档对应不上,然后扇区的判断也奇怪,我后来自己改了,跟楼主这个很类似

5494286 发表于 2018-2-4 21:43

Jonny0811 发表于 2017-10-20 13:27
也不完全是,是把ST的修改过的,ST的SVPWM一团糟,首先T/2部分与文档对应不上,然后扇区的判断也奇怪,我后 ...

你好!!!我不太理解 里面 算UBeta的时候为啥 要乘以4了??
能接讲讲么??谢谢!!!

Owen1234 发表于 2018-7-3 09:58

楼主还在么,有完整的程序给参考一下么

18201975434 发表于 2019-10-17 09:12

Owen1234 发表于 2018-7-3 09:58
**** 作者被禁止或删除 内容自动屏蔽 ****

楼主估计还活着,这点毋庸置疑
页: [1]
查看完整版本: 根据论坛中的帖子写的SVPWM的C语言代码,亲测可用