SimpleFOC(八)—— 理论+实践 深度分析SVPWM

SimpleFOC的教程比较多,做了一个总的链接,欢迎点击阅读:SimpleFOC教程链接汇总

说明

  SimpleFOC的基本操作在前几节都已经演示过了,虽然还有很多没演示的例程,但是触类旁通,仔细琢磨下难度不大。
  网上关于FOC和SVPWM的文章很多,但大都偏理论,最多用matlab验证下,本文通过程序演示验证SVPWM算法,有助于对理论的理解。对理论没兴趣的同学可以跳过。

一、有感FOC控制原理

有感foc控制原理
1、测量电机三相定子电流,可得到Ia 和Ib。将三相电流通过Clark变换至两相电流Iα和Iβ ,
2、按照控制环上一次迭代计算出的电机角度, 通过Park变换得到旋转坐标系下相互正交的电流Id和Iq,
3、Id、Iq与设定值进行比较得到电流环PI控制器的输入。调节PI控制器的参数,得到Vd 和Vq ,即要施加到电机上的电压矢量,
4、通过位置传感器得到新的电机位置,从而得到新的角度和转速。新的电机角度可告知 FOC算法下一个电压矢量在何处,
5、通过使用新的电机角度,Vd 和Vq经过Park逆变换产生下一个正交电压值Vα、Vβ,
6、采用SVPWM算法判定其合成的电压矢量位于哪个扇区,计算出三相各桥臂开关管的导通时间,最后经过三相逆变器驱动模块输出电机所需的三相电压。

二、SVPWM原理

  由三相功率逆变器的六个功率开关元件组成的特定开关模式产生的脉宽调制波,能够使电机电流波形尽可能接近于理想的正弦波形。
  请看下面这两片文章:
《SVPWM算法原理及详解》https://blog.csdn.net/qlexcel/article/details/74787619,
《SVPWM分析、各个扇区详细计算以及Matlab仿真》https://blog.csdn.net/michaelf/article/details/94013805,
  推导的结果是一样的,
在这里插入图片描述
在这里插入图片描述
  实际上大部分文章的SVPWM的算法结果都是这样。我觉得这个结果主要是针对无感FOC的算法,无感FOC需要根据Vα和Vβ来确定扇区和角度,但是对于有位置传感器,特别是有编码器的电机来说可以直接获取角度,上面的推导计算过头了。

三、SimpleFOC(不带电流采样)的控制原理:

在这里插入图片描述
  首先去掉了电流采样,所以简单了很多,有位置传感器,所以不用观测器估算位置。对空间矢量作用时间可以直接利用下面的公式(这些公式来自《SVPWM分析、各个扇区详细计算以及Matlab仿真》算法推导的中间状态,《SVPWM算法原理及详解》只写了第一个扇区):
在这里插入图片描述
对照矢量图,可以总结如下:
在这里插入图片描述
Udc表示电源电压(在代码中是voltage_limit),Uref表示设置的力矩大小(在代码中是target_voltage),Ts表示PWM周期(代码中没有把Ts体现出来,代码中的T1、T2是周期的百分比)。
  

四、SimpleFOC核心代码

  在simpleFOC工程中,先来看下被创作者称之为核心的代码(代码路径: …\Arduino-FOC-minimal\library_source\ BLDCMotor.cpp)
在这里插入图片描述
  输入变量Uq、Ud和角度θ,计算出3路PWM占空比。对照上面的SimpleFOC原理框图,一个函数基本就把主要工作做完了,确实是核心。
  

五、代码实验

5.1、实验目的

  通过设置不同的Ud和θ角度实现不同的波形输出,并将三相输出波形与SVPWM的理论波形做对比。
  本实验分两个阶段来完成,第一阶段先直观感受下SVPWM参数对电机运转的影响,第二阶段电机三相输出波形与理论做对比。

5.2、硬件准备

序号名称数量
1Arduino UNO1
2simpleFOCShield V2.0.31
3云台电机1
412V电源1
5方口USB线1

在这里插入图片描述
按照开环模式连接
在这里插入图片描述
  

5.3、修改代码 第一阶段

5.3.1 打开例程

在这里插入图片描述

5.3.2 修改代码

  simpleFOC工程以库的形式安装到Arduino中,不能修改底层代码,所以只能把代码复制出来,以子程序的形式放到当前程序中。之所以选择standalone例程,是因为这个例程比较简单,而且本身就是演示矢量控制的。
  ①、增加SVPWM算法的子程序
  ②、loop循环中调用子程序
  例程为只读文件,可以验证上传,如需保存要“另存为”。
在这里插入图片描述
SVPWM子程序(为了让代码看起来更简洁,所以程序中没有约束条件,参数设置一定要按要求范围输入):

void setPhaseVoltage(float Uq, float Ud, float angle_el) {
  
  int sector = (angle_el / _PI_3) + 1;    // find the sector we are in currently
  float T1 = _SQRT3*_sin(sector*_PI_3 - angle_el) * Uq/driver.voltage_limit;
  float T2 = _SQRT3*_sin(angle_el - (sector-1)*_PI_3) * Uq/driver.voltage_limit;
  float T0 = 1 - T1 - T2;
  
  float Ta,Tb,Tc; 
  switch(sector){
    case 1:
      Ta = T1 + T2 + T0/2;
      Tb = T2 + T0/2;
      Tc = T0/2;
      break;
    case 2:
      Ta = T1 +  T0/2;
      Tb = T1 + T2 + T0/2;
      Tc = T0/2;
      break;
    case 3:
      Ta = T0/2;
      Tb = T1 + T2 + T0/2;
      Tc = T2 + T0/2;
      break;
    case 4:
      Ta = T0/2;
      Tb = T1+ T0/2;
      Tc = T1 + T2 + T0/2;
      break;
    case 5:
      Ta = T2 + T0/2;
      Tb = T0/2;
      Tc = T1 + T2 + T0/2;
      break;
    case 6:
      Ta = T1 + T2 + T0/2;
      Tb = T0/2;
      Tc = T1 + T0/2;
      break;
    default:  // possible error state
      Ta = 0;
      Tb = 0;
      Tc = 0;
  }
  // calculate the phase voltages and center
  float Ua = Ta*driver.voltage_limit;
  float Ub = Tb*driver.voltage_limit;
  float Uc = Tc*driver.voltage_limit;
  
  driver.setPwm(Ua,Ub,Uc);
}

5.3.3 验证上传

在这里插入图片描述

5.3.4 电机观测

  上电后电机开始转动,当前的转动方式其实就是开环速度模式。

5.3.5 修改力矩

在这里插入图片描述
  修改Uq值(范围0—6.928),重新验证上传,会发现电机的力矩改变了,如果有万用表会发现电机的工作电流随Uq等比例改变。
在这里插入图片描述

  注意:Uq值设置越大,力矩越大,电流越大,电机发热越严重。

5.3.6 修改转速

在这里插入图片描述
  修改角度增量,重新验证上传,会发现电机的转速改变了,
  注意:增量越大电机转速越快,增量太大电机会因失步变振动。
  

5.4、修改代码 第二阶段

  

5.4.1 修改代码

  在第一阶段程序的基础上,
  ①、增加了串口通信子程序,实现通过串口设置电机的电角度,
  ②、通信程序放入主循环
  ③、角度值由上一节的循环增加变为串口设置。注意为了更加直观,串口设置的角度单位为“度”,所以会有“度”转换为“弧度”的计算。
在这里插入图片描述
串口通信子程序:

void serialReceiveUserCommand() {

  // a string to hold incoming data
  static String received_chars;

  while (Serial.available()) {
    // get the new byte:
    char inChar = (char)Serial.read();
    // add it to the string buffer:
    received_chars += inChar;
    // end of user input
    if (inChar == '\n') {

      // change the motor target
      theta = received_chars.toFloat();
      Serial.print("Target Angle:");
      Serial.println(theta);

      // reset the command buffer
      received_chars = "";
    }
  }
}

5.4.2 验证上传

在这里插入图片描述

5.4.3 电机观测

  程序运行后,电机固定在0度位置,类似开环位置模式。

5.4.4 串口操作

  通过串口发送角度值(直接发送数字,范围0—359),电机运动到指定的角度。(此时的角度为电角度,所以电机在一个很小的范围内运动。比如当前用的电机为7对极,电机从0转动到360度,转过了电机的1/7圈。电角度和机械角度的概念请自行百度。)
在这里插入图片描述

5.4.5 观察三相波形

  串口输入角度,示波器查看三相输出波形,并与理论做对比。(示波器只有两个通道,所以三相波形只能通过拼接得到)
在这里插入图片描述
①、30度
在这里插入图片描述

②、90度
在这里插入图片描述

③、150度
在这里插入图片描述

④、210度
在这里插入图片描述

⑤、270度
在这里插入图片描述

⑥、330度
在这里插入图片描述
  
  顺便说下,Arduino UNO 的PWM频率是31.25KHz。16MHz晶振,时钟不分频,PWM模式为相位校正模式(Phase Correct PWM Mode,在STM32中称之为 中央对齐模式),16000/256/2=31.25KHz。
  下面是PWM的配置代码(代码路径:…\Arduino-FOC-minimal\library_source\drivers\hardware_specific\atmega328_mcu)
在这里插入图片描述


  本文涉及理论的部分写的很笼统,存在用词不准确,语句不通顺的问题,请大家不要太纠结,做为一名合格的工程师就是要把科研人员的理论转变为可以落地的代码,理论不是我的强项也不是我的目标。


(完)

欢迎加入simpleFOC技术交流群:923734429 群已满根据提示添加新群 (入群申请写:CSDN)

请继续阅读相关文章:
SimpleFOC(一)—— 简介(附有文件下载链接)
SimpleFOC(二)—— 快速入门 (开环控制)
SimpleFOC(三)—— AS5600角度读取
SimpleFOC(四)—— 闭环控制
SimpleFOC(五)—— 双电机控制
SimpleFOC(六)—— PowerShield和AS5047P
SimpleFOC(七)——STM32(Bluepill)的应用
SimpleFOC(八)—— 理论+实践 深度分析SVPWM
SimpleFOC(九)—— 霍尔电机控制

  • 44
    点赞
  • 234
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
七段式 SVPWM(Space Vector Pulse Width Modulation)是一种基于空间矢量的PWM技术,具有较高的动态性能和效率。其动态性能可以通过以下几个方面进行分析: 1. 输出电压响应速度:七段式 SVPWM 可以在短时间内对输出电压进行快速响应,因为它可以精确计算矢量合成,从而产生最优的PWM信号。这使得它适用于对输出电压要求高的应用,如电机驱动器。 2. 输出电压波形质量:七段式 SVPWM 产生的PWM信号可以有效地减少谐波分量,从而提高输出电压波形质量。这有助于减少电机噪声、振动和损耗。 3. 输出电压稳定性:七段式 SVPWM 可以通过调整矢量合成比例系数来实现输出电压的稳定性控制。这种控制方法可以在转速变化或负载变化时自动调整输出电压,从而保证系统的稳定性。 4. 电流响应速度:七段式 SVPWM 可以快速响应电机电流的变化,从而提高系统的动态性能。这对于高速转动的电机和快速响应的负载是特别重要的。 5. 动态响应能力:七段式 SVPWM 可以通过矢量合成比例系数的调整来实现动态响应能力的控制。这使得它适用于需要快速响应的应用,如电机控制和电力转换器。 6. 效率:由于七段式 SVPWM 可以减少输出电压的谐波分量,从而减少电机的损耗,提高系统的效率。 7. 控制精度:七段式 SVPWM 通过精确计算矢量合成比例系数来实现电机控制的精度。这使得它适用于对控制精度要求高的应用,如精密机械和自动化系统。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值