【电机控制】FOC电机控制

news2024/11/24 2:39:18

FOC(Field-Oriented Control,磁场定向控制)是一种电机控制策略,又称矢量控制,是通过控制变频器输出电压的幅值和频率控制三相直流无刷电机的一种变频驱动控制方法。

FOC 的实质是运用坐标变换将三相静止坐标系下的电机相电流转换到相对于转子磁极轴线静止的旋转坐标系上,通过控制旋转坐标系下的矢量大小和方向达到控制电机目的。

无刷电机

直流有刷电机指的是电机工作的时候,线圈和转换器一起旋转,磁钢和碳刷不转,通过电机转动换向器和电刷来完成线圈电流方向的交替变化。

而直流无刷电机使用电子换向器取代了机械的电刷和机械的换向器装置,保留了直流电机线性机械性优秀、起动转矩大、调速范围宽、控制电路简单等优点,所以当直流无刷电机一经出现就以很快的速度发展和普及。

无刷直流电机的三相绕组之间一般呈三角形连接或 Y 型连接,其控制电路常采用桥式电路,通过 Y 型连接和桥式电路的组合,可以实现对无刷直流电机的转速和转向进行精确控制,以满足各种应用需求。

下图是电机绕组按照 Y 型连接,通过控制不同MOS管的通断组合, 电机线圈电流大小和方向就能够被改变。

图片

当打开Q1管和Q4管时,电流的方向由A相流向B相,再流出到负极。根据右手螺旋定则,在这一过程中,电机的定子A相线圈会产生对内的N级磁场,同时B相线圈会产生对内的S级磁场。

由于同性相斥和异性相吸的原理,这将导致定子线圈吸引转子上的磁铁并引起转动。

随后,当打开Q5管和Q4管时,电流的方向发生变化,使得电机的定子C相线圈产生对内的N级磁场,同时B相线圈产生对内的S级磁场。

根据右手螺旋定则,转子磁极会发生进一步的旋转。通过交替地开关不同的MOS管,可以实现电机磁极的交替运动,从而驱动电机的转动。

以下为动图展示了内转子无刷电机的旋转过程【来自matlab电机控制视频】

图片

这就是无刷电机旋转运动的基本原理。通过精确控制MOS管的通断状态,可以实现电机转速和转向的精确控制。

这种无刷电机的设计结构和控制方法,使其在诸多应用中得到广泛应用。

而MOS管的开关规律是需要用到单片机程序进行控制的,因此这就引出了FOC控制算法,FOC控制是一种通过对电机运动模型进行抽象化和简化的控制方法。

它基于电机的数学模型,通过测量电流、转速和位置等参数来计算最优的MOS管开关和通断状态,以实现对电机的精确控制。

FOC控制使得各个MOS管的开关和通断过程变得有规律可循,从而确保电机的稳定运行和高效性能。

在满足假设:

图片

FOC控制

磁场定向控制(FOC)也叫做矢量控制,它的基本思想是选取电机的某个旋转磁场轴作为设定的同步旋转坐标轴。

在无刷直流电机中,可以选择转子磁场、气隙磁场和定子磁场三种旋转磁场轴。一般来说,选择转子磁场作为FOC控制的同步旋转轴。

FOC的基本做法是通过坐标变换,将正弦波定子电流分解成与磁场平行的磁场分量电流和与磁场垂直的转矩分量电流,分别称为直轴电流和交轴电流,并对这两种电流进行控制。

这种分解让磁通电流分量和转矩电流分量完全解耦,类似于方波驱动控制,从而实现了稳定和高性能的控制。

FOC 控制主要由 Clark 变换、Park 变换、Park 逆变换、PID 控制、SVPWM控制五个模块组成。

图片

图片

坐标变换

无刷直流电机的方程比较复杂,为了方便处理,一般采用坐标变换理论对其进行相应的处理。

处理的方式基本上就是,利用坐标变化将电机转子变量和定子变量变换到一个旋转的坐标系当中,该坐标系就是实现 FOC 算法必须选取的磁场定向轴,它的旋转速度为w。

克拉克变换(Clark):

Clark变换是将三相定子坐标系变换到两相静止坐标系中的过程:

图片

在三相定子坐标系中,电机三相电流相位差 120°,即如图所示:

图片

显然,针对α-β坐标系中的α轴

图片

针对α-β坐标系中的β轴

图片

写成矩阵的形式:

图片

图片

图片

根据基尔霍夫电流定律:

图片

最终得到:

图片

克拉克逆变换:

图片

最终得到:

图片

帕克变换(Park):

图片

图片

图片

对于映射到d轴上的α,β分量:

图片

对于映射到q轴上的α,β分量:

图片

写成矩阵形式:

图片

帕克逆变换:

图片

写成电压形式:

图片

PI 控制器

图片

SVPWM 技术

SVPWM(Space Vector Pulse Width Modulation) 算法已广泛应用于交流变频调速系统中,该算法以电机为研究对象,主要研究如何控制定子绕组的电压使电机获得圆形恒定磁场。

与其他控制方法相比,SVPWM 控制三相逆变器具有直流母线电压利用率高、在调节输出电压基波大小的同时降低输出电压谐波、并且可以降低逆变器状态转换过程中的开关动作频率。

采用SVPWM 矢量控制可以快速控制电机输出转矩和转速,使其具有更好的动态性能。

要实现一个恒定大小的旋转磁场,我们可以先获得一个恒定大小的旋转电压矢量。

通过使用相位互差120度的三个矢量,我们可以合成一个大小不变的旋转电压矢量。

实际上,电机的三个绕组本身就是相互相位差120度的,因此,通过按正弦变化的方式控制电压,我们可以得到这个合成电压矢量,从而实现恒定大小的旋转磁场。

图片来自【T.Davies 2002】

图片

图片

图片

图片

将八个电压矢量画到电压空间矢量图中,六个非零矢量放在坐标轴线上,两个零矢量放在坐标轴的中心处,并且基本矢量的幅值均为直流测电压的 2/3 倍:

图片

电压空间矢量图是一种图形表示方法,用于合成和控制三相电压。

根据该图,我们可以知道非零电压矢量之间的夹角为60度,它们平均分布在整个平面上,将平面分为六个扇区。

对于任意一个扇区,我们可以利用该扇区边界上的两个非零矢量和相应的零矢量,按照一定的关系合成该扇区内的任何矢量。通过这种方法,我们可以合成任意矢量。

图片

图片

实现 SVPWM 调制需要先确定此时参考电压所处的扇区位置,然后才能根据平衡等效原理确定相邻电压矢量以及零矢量的作用时间。

扇区的确定:

图片

引进三个决策变量 A、B、C,通过分析可以得出:

图片

令N=4C+2B+A,则可以得到如表所示的 N与扇区的关系。

因此,对于任意一个给定的空间电压矢量,通过该表就可以确定其所处的扇区。

图片

合成矢量作用时间:

以扇区 I 为例,空间电压矢量在αβ坐标上的合成方式如下图所示

图片

可得到:

图片

对时间变量进行求解,得到:

图片

即为每个扇区内,合成电压所需要的作用时间,当需要合成的电压矢量位于不同的扇区时都存在相同的运算方式。

因此,令:

图片

图片

图片

图片

图片

例如,当合成矢量位于第Ⅰ扇区时,采用表中的开关切换顺序可以得到一个调制周期中的三相波形,如上图所示。

到了下一个调制周期后,合成矢量的角度增加一份,利用式 33 和 34 可以算出新的矢量作用时间,得到新的三相 PWM 波形。

随着电压矢量的旋转角度逐步增加,合成矢量将会依次通过各个扇区。所以,SVPWM会在每个载波周期进行一次计算。

因此,要实现 SVPWM 波形的调制,首先要判断出当前矢量所处的扇区,然后根据该扇区的两个非零矢量和零矢量的关系,通过 SVPWM 算法得出各个矢量的作用时间,接着就能够确定出该扇区的开关切换时间,从而生成调制的三相 SVPWM 波形。

当合成矢量在空间转过一圈后,同时也就生成了一个周期的正弦电压波形。

下面动态展示工作流程(图中是以三角波为例,正弦波与之类似)

图片

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1091190.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

什么是 CSRF 、原理及其解决方式

什么是 CSRF ? 跨站请求伪造(CSRF,Cross-site request forgery),也称为 XSRF,Sea Surf 或Session Riding,是一个攻击向量,它欺骗 Web 浏览器在登录用户的应用程序中执行不需要的动作…

如何处理前端国际化和本地化?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

“比特币市场风起云涌:第三季度报告揭示表现和未来趋势“

要点: 比特币的季度价格表现较差,为 -11.5%,但今年迄今为止的表现仍优于大多数资产类别; 截至撰写本文时,上半年推动比特币上涨的美国购买力已完全减弱; 交易量、流动性、波动性和搜索趋势均继续…

idea安装汉化插件

settings plugins 插件搜索chinese 重启 成功

第五十五章 学习常用技能 - 删除存储的数据

文章目录 第五十五章 学习常用技能 - 删除存储的数据删除存储的数据重置存储Storage浏览表格 第五十五章 学习常用技能 - 删除存储的数据 删除存储的数据 在开发过程中,可能需要删除某个类的所有现有测试数据,然后重新生成它(例如&#xff…

基于SSM的校园音乐平台系统

基于SSM的校园音乐平台系统~ 开发语言:Java数据库:MySQL技术:SpringSpringMVCMyBatisVue工具:IDEA/Ecilpse、Navicat、Maven 系统展示 主页 登录界面 管理员界面 歌手管理 歌曲管理 摘要 校园音乐平台系统(Campus Mu…

三、RocketMQ的JAVAAPI的基础概念

消息(Message) 生产者和消费者数据流转的基础数据模型,主要属性有 字段名默认值必要性说明Topicnull必填消息所属topic的名称Bodynull必填消息体Tagsnull选填消息标签,方便服务器过滤使用。目前只支持每个消息设置一个Keysnull选填代表这条消息的业务关…

飞花令游戏(Python)

飞花令是古时候人们经常玩一种“行酒令”的游戏,是中国古代酒令之一,属雅令。“飞花”一词则出自唐代诗人韩翃《寒食》中 春城无处不飞花 一句。行飞花令时选用诗和词,也可用曲,但选择的句子一般不超过7个字。 在《中国诗词大会》…

四、RocketMQ发送普通消息、批量消息和延迟消息

Producer发送普通消息的方式 1.同步发送消息 同步消息代表发送端发送消息到broker之后,等待消息发送结果后,再次发送消息 实现步骤 创建生产端,声明在哪个生产组注册NameServer地址构建Message实体,指定topic、tag、body启动…

论文阅读之《Learn to see in the dark》

Learning to See in the Dark-CVPR2018 Chen ChenUIUC(伊利诺伊大学厄巴纳-香槟分校) Qifeng Chen, Jia Xu, Vladlen Koltun Intel Labs(英特尔研究院) 文章链接:https://arxiv.org/pdf/1805.01934.pdfhttps://arxiv.org/pdf/1805.01934.p…

使用hugging face开源库accelerate进行多GPU训练(单机多卡)时,在保存模型结构的时候出现的问题

目录 问题描述问题分析问题解决 问题描述 我在保存模型结构的时候,先获取模型参数,然后再保存,代码如下: 图示代码是在训练主循环中的: 这种情况下会出现报错: nboundLocalError: UnboundLocalErrorloc…

计算机毕业设计选什么题目好?springboot 医院门诊在线预约挂号系统

✍✍计算机编程指导师 ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡ Java实战 |…

《C++ Primer》练习9.52:使用栈实现四则运算

栈可以用来使用四则运算,是一个稍微有点复杂的题目,去学习了一下用栈实现四则运算的原理,用C实现了一下。首先要把常见的中缀表达式改成后缀表达式,然后通过后缀表达式计算,具体的原理可以参考这位博主的文章&#xff…

本、硕、博区别真的辣么大吗?

61: 发际线已经说明了一切…… Super Mario: 小学,老师告诉学生:“森林里有只老虎,已经被我关在笼子里,我会带你去那个地方,然后给你一把猎枪,告诉你猎枪怎么用,并开枪…

RFID拓展的相关问答

基于: Research Reading: Smart Parking Applications Using RFID Technology-CSDN博客这篇文章总结了无线射频识别(RFID)技术在自动化中的应用及其在停车场管理系统中的解决方案。文章提到,RFID技术在自动化中可以降低交易成本&…

4. redis排名系统之C++实战操作对比MySQL

一、MySQL实现方法 假设我们要设计一款排名系统,那必然要涉及到两大类数据:武器数据和非武器的通用数据,它他通常有一个共用的属性:那就是主键唯一的,例如玩家的数字编号,通常在MySQL中是自增的无符号整数…

【牛客面试必刷TOP101】Day9.BM37 二叉搜索树的最近公共祖先和BM42 用两个栈实现队列

作者简介:大家好,我是未央; 博客首页:未央.303 系列专栏:牛客面试必刷TOP101 每日一句:人的一生,可以有所作为的时机只有一次,那就是现在!!!&…

pycharm安装汉化包失败解决方法

在pycharm -setting-plugins-搜索“Chinese”进入此界面: 点击install,在安装时出现:Plugin "Chinese (Simplified) Language Pack / 中文语言包" was not installed: Invalid filename returned by a server 解决方法&#xff1a…

boot分页

List<ElectricDispatchTodoPO> todoList electricDispatchTodoService.queryTodlList(vo, sysStaffVO);// 计算总记录数int total todoList.size();// 如果总记录数大于0PageInfo<ElectricDispatchTodoPO> pageInfo new PageInfo<>();if (total > 0) {…