草庐IT

嵌入式--所有电机控制的FOC的总结

landyjzlai 2023-05-01 原文

嵌入式–FOC的总结

 我们在很多设计上会用到FPGA控制电机,比如伺服电机,直流无刷电机,也有很多人用STM32来控制的,但是总的来说,一通百通,都没有离开控制的精华:FOC矢量控制,在此再次感谢那些默默无闻的数学家。还是那句话:不要迷恋哥,哥只是一个努力的永无止境开发者。

第一节:背景知识
第二节:永磁电机的FOC和SVPWM
第三节:死区。

1.1物理背景

(2)右手法则(想起了高中的物理老师)
如左图所示,当一条导线通上电之后,在其周围将会产生一个磁场,这个时候如果我们在导线周围施加一个定向磁场,那么导线将会受到一个力的作用,如左图中的红色箭头所示。
我们可以采用右手定则来确定这种力的方向,如右图所示。

1.2 磁场定向控制理论FOC

FOC在整个交流电机控制技术中,具有能够使电机平稳运行和快速的瞬态响应的特点。
假设我们现在手头上的电机是两相或者三相的交流电机,那么我们只要适当的实时去控制通向定子绕组的三相正弦电流(相为差120º),在定子内部将会产生一个旋转磁场,如左图动画所示。
旋转磁场的旋转的频率等于三相正弦交流电的频率。
从中间的动画中我们可以看出,假如此时我们把嵌有永磁体的转子放置在定子内部,那么由于产生的旋转磁场与转子内部永磁体的磁场的相互吸引,转子将会在旋转磁场的带动下开始旋转。
如右边的动画所示,黑色的旋转矢量是合成的定
子磁链的方向。
1.2 磁场定向控制理论FOC
从左图的动画中,我们可以看到,定子磁链与转子磁链在同一条直线上,即两者角度为0或者180度。而从中间的这张图,我们可以看出此时转子受到的力矩是最小的。
但是在FOC中,我们往往希望转子能够得到最大的力矩,从中间这张图我们可以知道当定子磁链与转子磁链成+/-90度时,转子能够获得最大的力矩。
以电机逆时针转动为例,启动电机之后,转子磁链方向将滞后定子磁链90度,如右边的动画所示;当电机顺时针转动的时候,将超前90度。
如果我们把转子磁链所在的方向定义为d轴,那么我们要做的就是时刻检测d轴所在的位置,并根据这个信息,我们要控制流入定子的三相正弦电流,使合成的定子磁链的方向始终与转子磁链的方向成+/-90度的关系,而合成的定子磁链与d轴成90度时的那个轴方向,我们称之为q轴。
如上所述,当转子逆时针转动时,d轴也跟着转动。所以,我们需要实时的校正定子电流,从而使定子电流合成的定子磁链的方向始终超前d轴90度。这种关系,我们可以从右边的动画中看出,红色的d轴代表转子磁链,绿色的q轴代表定子磁链。
所以,当我们想要获得更大的转矩的时候,我们只需要实时的增大定子电流,以增大定子磁链的强度,即使右图动画中的绿色q轴变长,但同时我们也要时刻保证q轴超前d轴90度。

1.3 两相混合式步进电机工作原理

从左边的图,我们可以看到两相混合式步进电机的定子上有四个绕有线圈的磁极,相对磁极的线圈串联 组成两相绕组。
由于同一相绕组两个线圈绕线的方向相反,所以通过同一电流时,电流从相反方向流过同一相绕组产生的磁场方向也相反。
中间的动画是满步(Full Stepping)操作方式下的运行情况,右边的动画是半步(Half-stepping)操作方式的运行情况,后面将做一下简要描述。

满步操作方式如左图的动画所示,就是分四步使转子转动一圈,一步转动90度,同时又分为单满步和双满步,四步一个循环。
单满步就是一步只通一相线圈的电,通电波形图如右上角的图所示,各相通电顺序为A–》B–》A’–》B’–》A–》……
双满步就是一步同时通两相线圈的电,通点波形图如右下角的图所示通电顺序为AB–》BA’–》A’B’–》B’A–》AB–》……

半步操作方式如左边的动画所示,就是以“单相—双相—单相—双相”的通电方式,使转子每一步转动45度角,八步一个循环。
通电波形图如中间的图所示,分别为A–》AB–》B–》BA’
–》A’–》A’B’–》B’–》B’A–》A–》……
定子绕组一般制成多相(三、四、五相不等),通常为三相绕组。三相绕组沿定子铁心对称分布,在空间互差120度电角度,通入三相交流电时,产生旋转磁场。
这一部分可以说是非常重要的,从下图动画中我们可以看到通向定子绕组的三相交流电相互影响,并产生一个旋转磁场。
并且,我们同时将三相定子绕组各自通以交流电后的效果图(空间相差120度)和三相正弦交流电(相位相差120度)的效果图给展现了出来。
从动画中,我们可以看到三相绕组各自产生的电磁矢量随着各自电流随正弦波向前跳变的过程中做同步变化。
从右下角的动画中,我们可以看到,如果我们把这三个随电流变化的电磁矢量相加在一起,那么将会同步合成一个旋转的电磁矢量,也就是我们的定子磁链,并且这个电磁矢量的幅值时刻保持不变,如动画中的粉红色矢量所示。
并且,合成的旋转电磁矢量的频率等于正弦交流电的频率。
所以,从这些动画中,我们可以得到的一个非常重要的结论,即我们可以通过适当的调整定子的三相交流电来合成任意一个角度的旋转电磁矢量。
这就是FOC( field-oriented control )最最基础的本质原则。换句话说,就是我们必须以转子磁链的方向为参考基准,定向的控制由三相交流电合成定子磁链的方向超前或滞后于转子磁链90度的方向,以使电机能够更稳定的运转。

第二节 永磁同步电机的FOC及SVPWM

待续。

有关嵌入式--所有电机控制的FOC的总结的更多相关文章

  1. ruby - 如何以所有可能的方式将字符串拆分为长度最多为 3 的连续子字符串? - 2

    我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123

  2. Ruby Readline 在向上箭头上使控制台崩溃 - 2

    当我在Rails控制台中按向上或向左箭头时,出现此错误:irb(main):001:0>/Users/me/.rvm/gems/ruby-2.0.0-p247/gems/rb-readline-0.4.2/lib/rbreadline.rb:4269:in`blockin_rl_dispatch_subseq':invalidbytesequenceinUTF-8(ArgumentError)我使用rvm来管理我的ruby​​安装。我正在使用=>ruby-2.0.0-p247[x86_64]我使用bundle来管理我的gem,并且我有rb-readline(0.4.2)(人们推荐的最少

  3. ruby-on-rails - 带 Spring 锁的 Rails 4 控制台 - 2

    我正在使用Ruby2.1.1和Rails4.1.0.rc1。当执行railsc时,它被锁定了。使用Ctrl-C停止,我得到以下错误日志:~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`gets':Interruptfrom~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`verify_server_version'from~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.

  4. ruby-on-rails - 跳过状态机方法的所有验证 - 2

    当我的预订模型通过rake任务在状态机上转换时,我试图找出如何跳过对ActiveRecord对象的特定实例的验证。我想在reservation.close时跳过所有验证!叫做。希望调用reservation.close!(:validate=>false)之类的东西。仅供引用,我们正在使用https://github.com/pluginaweek/state_machine用于状态机。这是我的预订模型的示例。classReservation["requested","negotiating","approved"])}state_machine:initial=>'requested

  5. ruby-on-rails - openshift 上的 rails 控制台 - 2

    我将我的Rails应用程序部署到OpenShift,它运行良好,但我无法在生产服务器上运行“Rails控制台”。它给了我这个错误。我该如何解决这个问题?我尝试更新ruby​​gems,但它也给出了权限被拒绝的错误,我也无法做到。railsc错误:Warning:You'reusingRubygems1.8.24withSpring.UpgradetoatleastRubygems2.1.0andrun`gempristine--all`forbetterstartupperformance./opt/rh/ruby193/root/usr/share/rubygems/rubygems

  6. ruby - Nokogiri 剥离所有属性 - 2

    我有这个html标记:我想得到这个:我如何使用Nokogiri做到这一点? 最佳答案 require'nokogiri'doc=Nokogiri::HTML('')您可以通过xpath删除所有属性:doc.xpath('//@*').remove或者,如果您需要做一些更复杂的事情,有时使用以下方法遍历所有元素会更容易:doc.traversedo|node|node.keys.eachdo|attribute|node.deleteattributeendend 关于ruby-Nokog

  7. ruby - 获取模块中定义的所有常量的值 - 2

    我想获取模块中定义的所有常量的值:moduleLettersA='apple'.freezeB='boy'.freezeendconstants给了我常量的名字:Letters.constants(false)#=>[:A,:B]如何获取它们的值的数组,即["apple","boy"]? 最佳答案 为了做到这一点,请使用mapLetters.constants(false).map&Letters.method(:const_get)这将返回["a","b"]第二种方式:Letters.constants(false).map{|c

  8. C51单片机——实现用独立按键控制LED亮灭(调用函数篇) - 2

    说在前面这部分我本来是合为一篇来写的,因为目的是一样的,都是通过独立按键来控制LED闪灭本质上是起到开关的作用,即调用函数和中断函数。但是写一篇太累了,我还是决定分为两篇写,这篇是调用函数篇。在本篇中你主要看到这些东西!!!1.调用函数的方法(主要讲语法和格式)2.独立按键如何控制LED亮灭3.程序中的一些细节(软件消抖等)1.调用函数的方法思路还是比较清晰地,就是通过按下按键来控制LED闪灭,即每按下一次,LED取反一次。重要的是,把按键与LED联系在一起。我打算用K1来作为开关,看了一下开发板原理图,K1连接的是单片机的P31口,当按下K1时,P31是与GND相连的,也就是说,当我按下去时

  9. SPI接收数据异常问题总结 - 2

    SPI接收数据左移一位问题目录SPI接收数据左移一位问题一、问题描述二、问题分析三、探究原理四、经验总结最近在工作在学习调试SPI的过程中遇到一个问题——接收数据整体向左移了一位(1bit)。SPI数据收发是数据交换,因此接收数据时从第二个字节开始才是有效数据,也就是数据整体向右移一个字节(1byte)。请教前辈之后也没有得到解决,通过在网上查阅前人经验终于解决问题,所以写一个避坑经验总结。实际背景:MCU与一款芯片使用spi通信,MCU作为主机,芯片作为从机。这款芯片采用的是它规定的六线SPI,多了两根线:RDY和INT,这样从机就可以主动请求主机给主机发送数据了。一、问题描述根据从机芯片手

  10. ruby-on-rails - 在 Rails 控制台中使用 asset_path - 2

    在我的Character模型中,我添加了:字符.rbbefore_savedoself.profile_picture_url=asset_path('icon.png')end但是,对于数据库中已存在的所有角色,它们的profile_picture_url为nil。因此,我想进入控制台并遍历所有这些并进行设置。在我试过的控制台中:Character.find_eachdo|c|c.profile_picture_url=asset_path('icon.png')end但这给出了错误:NoMethodError:undefinedmethod`asset_path'formain:O

随机推荐