打印
[逆变器]

请教一个关于SVPWM的简单问题!

[复制链接]
1308|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lvystdy|  楼主 | 2016-10-17 14:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
lvystdy|  楼主 | 2016-10-17 14:45 | 只看该作者
太简单了,没人愿意帮忙啊! 但是我确实想不明白!

使用特权

评论回复
板凳
lvystdy|  楼主 | 2016-10-17 16:50 | 只看该作者
谁能提供个思路呢!谢谢了!

使用特权

评论回复
地板
123654789| | 2016-10-18 09:19 | 只看该作者
选择扇区 = 扇区判断
只不过叫法不一样而已

使用特权

评论回复
5
lvystdy|  楼主 | 2016-10-18 09:25 | 只看该作者
本帖最后由 lvystdy 于 2016-10-18 09:27 编辑

好的。谢谢!结贴不会,链接在哪里?

使用特权

评论回复
6
ZYXUCBA| | 2016-10-18 13:47 | 只看该作者
扇区并不是你想怎么给就怎么给的,我是做电机控制的,需要根据电机的真实位置给出相应相位的电压

使用特权

评论回复
7
lvystdy|  楼主 | 2016-10-20 13:55 | 只看该作者
ZYXUCBA 发表于 2016-10-18 13:47
扇区并不是你想怎么给就怎么给的,我是做电机控制的,需要根据电机的真实位置给出相应相位的电压 ...

您好! 看到了您回答。您说,需要根据具体的位置来定扇区,这个我可以理解。但是在启动时,具体位置怎么确定呢?因为6个管均为导通(逆变),那么电压的采样值是0啊!

使用特权

评论回复
8
kelei999999| | 2016-11-14 08:28 | 只看该作者
本帖最后由 kelei999999 于 2016-11-14 08:30 编辑

SVPWM的目标轨迹是圆形的,初始扇区可以随意定,但是只要初始扇区定下来了,随后的电压矢量就必须按圆周的规律旋转,那么旋转的电压矢量每一个小步径(就是PWM频率)就需要判断当前矢量落在了那个扇区,因为不同的扇区其表达式不相同。看代码:
void SVPWMGenerator(float Ualafax,float Ubeitay)//P的定义域为0-1.0f
{
float Ualafa = Ualafax * 0.57735027f,Ubeita = Ubeitay * 0.57735027f;
//--------------------------------------------------------------------------------确定三个分区基准向量
Uref1 = Ubeita;
Uref2 =  (1.7320508f * Ualafa - Ubeita) * 0.5f;
Uref3 = -(1.7320508f * Ualafa + Ubeita) * 0.5f;
if(Uref1>0.001f)Ar = 1;
else Ar = 0;
if(Uref2>0.001f)Br = 1;
else Br = 0;
if(Uref3>0.001f)Cr = 1;
else Cr = 0;
//--------------------------------------------------------------------------------生成扇区向量表
N = (Cr*4) + (Br*2) + Ar;
//--------------------------------------------------------------------------------扇区选择
if(3==N)//-----------------------------------------------------------------------目标矢量在1扇区
  {
   //LED2(1);
   Ux = Ualafa - Ubeita * 0.57735f;
   Ux_60 = Ubeita * 1.1547f;
   U0 = PWM1.PWMperiod - Ux - Ux_60;
   PDC1G = (int)(PWM1.PWMperiod - U0 * DOF);
   PDC2G = (int)(PWM1.PWMperiod - U0 * DOF - Ux);
   PDC3G = (int)(PWM1.PWMperiod - U0 * DOF - Ux - Ux_60);
   DutyCycle(PDC1G,PDC2G,PDC3G);
  }
else if(1==N)//------------------------------------------------------------------目标矢量在2扇区
  {
   //-----------------------------------------------------------------------
   Ux = Ualafa + 0.57735f * Ubeita;
   Ux_60 = 0.57735f * Ubeita - Ualafa;
   U0 = PWM1.PWMperiod - Ux - Ux_60;
   PDC1G = (int)(PWM1.PWMperiod - U0 * DOF - Ux_60);
   PDC2G = (int)(PWM1.PWMperiod - U0 * DOF);
   PDC3G = (int)(PWM1.PWMperiod - U0 * DOF - Ux - Ux_60);
   DutyCycle(PDC1G,PDC2G,PDC3G);
  }
else if(5==N)//------------------------------------------------------------------目标矢量在3扇区
  {
   //-----------------------------------------------------------------------
   Ux = Ubeita * 1.1547f;
   Ux_60 = -Ualafa - Ubeita * 0.57735f;
   U0 = PWM1.PWMperiod - Ux - Ux_60;
   PDC1G = (int)(PWM1.PWMperiod - U0 * DOF - Ux - Ux_60);
   PDC2G = (int)(PWM1.PWMperiod - U0 * DOF);
   PDC3G = (int)(PWM1.PWMperiod - U0 * DOF - Ux);
   DutyCycle(PDC1G,PDC2G,PDC3G);
  }
else if(4==N)//------------------------------------------------------------------目标矢量在4扇区
  {
   //LED2(0);
   //-----------------------------------------------------------------------
   Ux = -Ualafa + Ubeita * 0.57735f;
   Ux_60 = -Ubeita * 1.1547f;
   U0 = PWM1.PWMperiod - Ux - Ux_60;
   PDC1G = (int)(PWM1.PWMperiod - U0 * DOF - Ux - Ux_60);
   PDC2G = (int)(PWM1.PWMperiod - U0 * DOF - Ux_60);
   PDC3G = (int)(PWM1.PWMperiod - U0 * DOF);
   DutyCycle(PDC1G,PDC2G,PDC3G);
  }
else if(6==N)//------------------------------------------------------------------目标矢量在5扇区
  {
   //-----------------------------------------------------------------------
   Ux = -Ualafa - 0.57735f * Ubeita;
   Ux_60 = Ualafa -0.57735f * Ubeita;
   U0 = PWM1.PWMperiod - Ux - Ux_60;
   PDC1G = (int)(PWM1.PWMperiod - U0 * DOF - Ux);
   PDC2G = (int)(PWM1.PWMperiod - U0 * DOF - Ux - Ux_60);
   PDC3G = (int)(PWM1.PWMperiod - U0 * DOF);
   DutyCycle(PDC1G,PDC2G,PDC3G);
   
  }
else if(2==N)//------------------------------------------------------------------目标矢量在6扇区
  {
   //-----------------------------------------------------------------------
   Ux = -Ubeita * 1.1547f;
   Ux_60 = Ualafa + Ubeita * 0.57735f;
   U0 = PWM1.PWMperiod - Ux - Ux_60;
   PDC1G = (int)(PWM1.PWMperiod - U0 * DOF);
   PDC2G = (int)(PWM1.PWMperiod - U0 * DOF - Ux - Ux_60);
   PDC3G = (int)(PWM1.PWMperiod - U0 * DOF - Ux_60);
   DutyCycle(PDC1G,PDC2G,PDC3G);
  }
else if(0==N)//------------------------------------------------------------------目标矢量为0
{
  PDC1G = (int)(PWM1.PWMperiod * DOF);
  PDC2G = (int)(PWM1.PWMperiod * DOF);
  PDC3G = (int)(PWM1.PWMperiod * DOF);
  DutyCycle(PDC1G,PDC2G,PDC3G);
}
}
PDC1G,PDC2G,PDC3G即PWM占空比的值!你可以看到,每一个扇区他们的表达式是不尽相同的。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

5

帖子

0

粉丝