首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

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

  • 23-09-28 03:41
  • 3791
  • 8692
blog.csdn.net

目录

  • 说明
  • 一、有感FOC控制原理
  • 二、SVPWM原理
  • 三、SimpleFOC(不带电流采样)的控制原理:
  • 四、SimpleFOC核心代码
  • 五、代码实验
    • 5.1、实验目的
    • 5.2、硬件准备
    • 5.3、修改代码 第一阶段
      • 5.3.1 打开例程
      • 5.3.2 修改代码
      • 5.3.3 验证上传
      • 5.3.4 电机观测
      • 5.3.5 修改力矩
      • 5.3.6 修改转速
    • 5.4、修改代码 第二阶段
      • 5.4.1 修改代码
      • 5.4.2 验证上传
      • 5.4.3 电机观测
      • 5.4.4 串口操作
      • 5.4.5 观察三相波形

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-minimallibrary_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);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51

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 == '
') {

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

      // reset the command buffer
      received_chars = "";
    }
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

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-minimallibrary_sourcedrivershardware_specificatmega328_mcu)
在这里插入图片描述
 
 
  本文涉及理论的部分写的很笼统,存在用词不准确,语句不通顺的问题,请大家不要太纠结,做为一名合格的工程师就是要把科研人员的理论转变为可以落地的代码,理论不是我的强项也不是我的目标。
 
 
(完)
 
欢迎加入simpleFOC技术交流群:923734429 群已满根据提示添加新群 (入群申请写:CSDN)
 
请继续阅读相关文章:
SimpleFOC(一)—— 简介(附有文件下载链接)
SimpleFOC(二)—— 快速入门 (开环控制)
SimpleFOC(三)—— AS5600角度读取
SimpleFOC(四)—— 闭环控制
SimpleFOC(五)—— 双电机控制
SimpleFOC(六)—— PowerShield和AS5047P
SimpleFOC(七)——STM32(Bluepill)的应用
SimpleFOC(八)—— 理论+实践 深度分析SVPWM
SimpleFOC(九)—— 霍尔电机控制

注:本文转载自blog.csdn.net的loop222的文章"https://blog.csdn.net/loop222/article/details/117468766"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top