FOC控制算法

目录

一、FOC介绍

二、FOC基本概念

1、为什么是三相?

2、FOC矢量控制总体算法简述

3、为什么FOC不一定需要电流采样?参考链接

4、FOC的分类

(1)有感FOC与无感FOC

三、FOC中电流采样 参考链接

1、高端采样

2、低端采样

(1)单电阻采样

(2)双电阻采样

(3)三电阻采样

3、采样方式的选取

四、FOC原理

1、Clark变换

2、Park变换

3、PID控制

(1)电流环(最内环)

(2)速度环(第二层)

(3)位置环(最外层)

(4)位置控制时采用 位置环+电流环 控制

4、SVPWM变换

五、FOC控制算法调试


一、FOC介绍

        最近为了精确控制电机旋转的角度、速度、力矩,采用三相直流无刷电机控制,采用FOC磁场定向控制算法,在这里记录一下自己的学习过程。

        从家电到汽车和重工业机器人——都采用无刷直流(BLDC)和交流电机,因为它们能效高,可定制性更广。交流和BLDC电机在许多应用中都是首选,因为它们的缺点很少,如微控制器成本和复杂的控制算法。

        FOC是驱动电动马达的最有效方式之一。FOC的主要目标是保持正交的定子和转子磁场以产生最大扭矩。一种方法是不断监测三个时变相电流,并调制每个施加的相电压以实现正确的时变定子磁场方向。

二、FOC基本概念

1、为什么是三相?

        无刷直流电机(BLDC:Brushless Direct Current Motor),也被称为电子换向电机(ECM或EC电机)或同步直流电机,是一种使用直流电(DC)的同步电机。无刷直流电机实质上为采用直流电源输入,并用逆变器变为三相交流电源,带位置反馈的,永磁同步电机。

        一个典型的永磁同步电机的3相绕组在空间120°电角度布置,绕组里面分别通相位相差120°的三相交流电。为什么需要通相位相差120°的三相交流电?为了产生一个幅值大小不变的圆形旋转磁动势。

        三相交流电通定子线圈,定子线圈是静止的,但线圈产生的磁场是与转子永磁体产生的磁场相互作用,转子在转,线圈产生的磁场也在同步转。

2、FOC矢量控制总体算法简述

输入:位置信息,两相采样电流值(或3相电流、电机位置或者电机速度)

输出:三相PWM波

所需硬件:ADC至少需要一到三个电流检测输入,一个光电或磁编码器,主控,依据电压等级的不同有mosfet或者IGBT或者SiC功率模块组成的三个半桥

        FOC算法在本质上就是一些线性代数中的矩阵变换,我在这里讲述的是有传感器的FOC算法,转子的位置信息是通过绝对式磁编码器反馈的,直接是数字量。

3、为什么FOC不一定需要电流采样?参考链接

        FOC磁场定向控制。其原理在于调制电机三相的电压,使电流产生的磁场矢量方向与定子磁铁(励磁产生或永磁铁)成90度。为什么成90度?因为90度的时候力矩最大。如果小于90或者大于90,实际上电机也能转,只是达不到最大力矩而已。基本上60-120度都能转。

        我们先不考虑电流,因为我们能直接控制的实际上只有ABC三相的电压(怎么控制呢?SVPWM)。我们通过控制这三相电压的大小,就可以得到一个方向和幅值都可以控制的电压矢量。

        电压采样:把目标v_q直接经过坐标变换和svpwm输出而不经过pid运算,而v_d则直接赋予0,确实可以达到还行的效果。这样做的问题在于并不能保证i_d为零,i_q等于目标值,因此电机并不能工作在效率最高的状态,力矩控制也是不准确的, 只是这样磁场矢量与定子磁铁的角度不是90度,而是略小一点。

        如果没有电流环没有电流采样也可以工作,电流采样的作用是获取三相电流做坐标变换后得到实际的id,iq,如果不要电流环,只有速度环反馈或者位置环反馈其实也可以达到还行的效果。

4、FOC的分类

(1)有感FOC与无感FOC

        在FOC算法中,转子的磁场角必须是已知的,以保持正交的定子和转子磁场。这可通过编码器或旋转变压器的位置反馈来实现(有感FOC),也可通过反电动势/磁通观测器软件来测量相电流以估计转子角(无感FOC)。

三、FOC中电流采样 参考链接

1、高端采样

        直接采样桥臂输出电流,软件上无需再进行电流重构计算,采样值即真实输出电流,使用方便简单高效,较为稳定,但成本过高。由于该位置采样所选器件需要承受母线电压,在电源非隔离条件下,运放的抗共模电压指标需要大于等于母线电压(多数选母线电压的2倍),否则无法正常工作。而电源隔离条件下,其参考地(GND)不同,所以无需考虑该问题。因为电机三相电流遵循Ia+Ib+Ic=0,故实际实现时只需采样任意两相电流即可获得完整三相输出电流。

2、低端采样

        分为单、双、三电阻采样,易受公共地噪声影响。

(1)单电阻采样

        单电阻采样又称为母线电流采样,一般将采样电阻串联在直流母线来进行采样,受逆变桥开关状态影响,其采样电流与相输出电流有差异,且在特定占空比条件下难以获取输出电流,故需在一个周期内至少采样2次,并对采样电流重构补偿,同时把握好采样时刻才能获取有效电流数据,因而过程复杂,难度过大,不过由于成本低廉(仅使用一个运放,且不需要考虑高共模电压影响)。

(2)双电阻采样

        通过采样逆变任意2个下桥臂电流来获取有效数据。在实际操作过程中,需要在下桥臂开关管开通时采样(蓝色波形),并在软件上对采样数据重构获取输出电流。

(3)三电阻采样

        如果我们使用的是三电阻方式采样的话,选用的ADC模块必须至少要有三个通道同时采样的功能,这样才能确保采样得到的三相相电流是同一时刻的电流,此时才能保证Iu+Iv+Iw=0,这个公式成立。这样的话,可以对采样窗口小的一相电流进行重新计算,这样得到的结果准确度是最高的

3、采样方式的选取

    在电机控制中,对电流采样的采样转换方式一般都是使用PWM触发ADC来转换

    当PWM模块设置的触发点匹配之后,触发信号就会给到ADC模块,此时采样开关就会断开,然后ADC模块开始转换,转换完成即可得到对应的采样电流的电压信号的AD数值,在程序中使用这个数值进行算法编写验证即可。

四、FOC原理

1、Clark变换

        三相交流电,我们是否可以把它整成两相?就好比我们看一个三维的问题,我总是倾向于转化到二维去解决。三相交流电相互间相位相差120°,那我们是否可以构建一个坐标系α-β,使用它来表示三相交流电。

Ia,Ib,Ic投影到该坐标系α-β,则有:

写成矩阵形式为:

2、Park变换

        虽然\alpha -\beta坐标系下少了一维变量,但是新的变量还是正弦非线性的,接下来用Park变换将它们线性化。经过这一步的变换,我们会发现,一个匀速旋转向量在这个坐标系下变成了一个定值。

变换公式为:

写成矩阵形式:

我们一通操作将转子磁链进行了解耦,分解为了转子旋转的径向切向这两个方向的变量:

  • 其中Iq是我们需要的,代表了期望的力矩输出
  • 而 Id是我们不需要的,我们希望尽可能把它控制为0

3、PID控制

        将上一步得到的Iq,Id两个值作为反馈控制的对象,作为PID算法的输入。

        由于这里的电压和电流的传递函数会发现这其实就是一个一阶惯性环节,所以这里只需要PI控制即可。

        在FOC控制中主要用到三个PID环,从内环到外环依次是:电流环速度环位置环。

我们通过电流反馈来控制电机电流(扭矩) ->  然后通过控制扭矩来控制电机的转速 

-> 再通过控制电机的转速控制电机位置

(1)电流环(最内环)

(2)速度环(第二层)

(3)位置环(最外层)

(4)位置控制时采用 位置环+电流环 控制

        在实际使用中,由于编码器无法直接返回电机转速 ,往往计算一定时间内的编码值变化量来表示电机的转速(即平均速度代表瞬时速度)。当电机转速比较高的时候,这样的方式是可以的;但是在位置控制模式的时候,电机的转速会很慢,这时候用平均测速法会存在非常大的误差(转子不动或者动地很慢,编码器就没有输出或者只输出1、2个脉冲)。

此时需要对位置环做一点变化:

4、SVPWM变换

     前面有Park变换对应反Park变换,但是没有反Clark变换,取而代之的是SVPWM变换。使用反Park变换和SVPWM变换可以把计算出来的数据转换成开环的旋转磁场。

        在这里我就不详细说明SVPWM原理了,写这篇文章目的是自己能徒手写出代码,现在有现成的SVPWM模块,可以把FOC的控制结果转换为定时器6个通道的占空比,从而驱动三相逆变模块控制定子绕组产生旋转磁场,拖动转子旋转。

五、FOC控制算法调试

        由于作者还没有做到FOC算法调试这个步骤,后续调试算法时,会具体补充这一部分,大家可以参考:参考链接

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

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

相关文章

AI项目十三:PaddleOCR训练自定义数据集

若该文为原创文章,转载请注明原文出处。 续上一篇,PaddleOCR环境搭建好了,并测试通过,接下来训练自己的检测模型和识别模型。 paddleocr检测模型训练 1、准备数据集 在PaddleOCR目录下新建文件夹:train_data, 这个…

深度学习:模型训练过程中Trying to backward through the graph a second time解决方案

1 问题描述 在训练lstm网络过程中出现如下错误&#xff1a; Traceback (most recent call last):File "D:\code\lstm_emotion_analyse\text_analyse.py", line 82, in <module>loss.backward()File "C:\Users\lishu\anaconda3\envs\pt2\lib\site-packag…

【0223】源码剖析smgr底层设计机制(3)

1. smgr设计机制 PG内核中smgr完整磁盘存储介质的管理是通过下面三部分实现的。 1.1 函数指针结构体 f_smgr 函数指针结构体 f_smgr。 通过该函数指针类型,可完成类似于UNIX系统中的VFD功能,上层只需要调用open()、read()、write()等系统函数,用户不必去关系底层的文件系统…

「网页开发|前端开发|Vue」09 Vue状态管理Vuex:让页面根据用户登录状态渲染不同内容

本文主要介绍如何通过Vue的状态管理框架Vuex来管理一些被不同组件或不同页面共同使用的数据&#xff0c;然后展示如何通过状态管理用户信息&#xff0c;并且在具体页面获取用户信息&#xff0c;并且根据用户信息的不同展示不同的页面内容。 文章目录 本系列前文传送门一、场景…

C++核心编程--对象篇

4.2、对象 4.2.1、对象的初始化和清理 用于对对象进行初始化设置&#xff0c;以及对象销毁前的清理数据的设置。 构造函数和析构函数 防止对象初始化和清理也是非常重要的安全问题 一个对象或变量没有初始化状态&#xff0c;对其使用后果是未知的同样使用完一个对象或变量&…

【C++学习】多态

目录 一、多态的概念 1. 概念 二、多态的定义及实现 2.1 多态的构成条件 2.2 虚函数 2.3 虚函数的重写 2.4 C11 override 和 final 2.5 重载、覆盖(重写)、隐藏(重定义)的对比 三、抽象类 3.1 概念 3.2 接口继承和实现继承 四、多态的原理 4.1 虚函数表 4.2 多态的…

【大规模 MIMO 检测】基于ADMM的大型MU-MIMO无穷大范数检测研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

CCF CSP认证 历年题目自练Day17

CCF CSP认证 历年题目自练Day17 题目一 试题编号&#xff1a; 201803-1 试题名称&#xff1a; 跳一跳 时间限制&#xff1a; 1.0s 内存限制&#xff1a; 256.0MB 问题描述&#xff1a; 问题描述   近来&#xff0c;跳一跳这款小游戏风靡全国&#xff0c;受到不少玩家的喜爱…

[Machine learning][Part3] numpy 矢量矩阵操作的基础知识

很久不接触数学了&#xff0c;machine learning需要用到一些数学知识&#xff0c;这里在重温一下相关的数学基础知识 矢量 矢量是有序的数字数组。在表示法中&#xff0c;矢量用小写粗体字母表示。矢量的元素都是相同的类型。例如&#xff0c;矢量不包含字符和数字。数组中元…

在比特币上支持椭圆曲线 BLS12–381

通过使用智能合约实现来支持任何曲线 BLS12–381 是一种较新的配对友好型椭圆曲线。 与常用的 BN-256 曲线相比&#xff0c;BLS12-381 的安全性明显更高&#xff0c;并且安全目标是 128 位。 所有其他区块链&#xff0c;例如 Zcash 和以太坊&#xff0c;都必须通过硬分叉才能升…

C++核心编程

C核心编程 C核心编程1 内存分区模型1.1 程序运行前1.2 程序运行后1.3 new操作符 2 引用2.1 引用的基本使用2.2 引用注意事项2.3 引用做函数参数2.4 引用做函数返回值2.5 引用的本质2.6 常量引用 3 函数提高3.1 函数默认参数3.2 函数占位参数3.3 函数重载3.3.1 函数重载概述3.3.…

【Django 笔记】第一个demo

1. pip 安装 2. django 指令 D:\software\python3\anconda3\Lib\site-packages\django\bin>django-adminType django-admin help <subcommand> for help on a specific subcommand.Available subcommands:[django]checkcompilemessagescreatecachetabledbshelldiff…

精彩回顾 | 迪捷软件亮相2023世界智能网联汽车大会

2023年9月24日&#xff0c;2023世界智能网联汽车大会&#xff08;以下简称大会&#xff09;在北京市圆满落幕。迪捷软件北京参展之行圆满收官。 本次大会由工业和信息化部、公安部、交通运输部、中国科学技术协会、北京市人民政府联合主办&#xff0c;是我国首个经国务院批准的…

WPF中的控件

内容控件&#xff1a;label、border Window控件 Label控件 Border控件 内容控件 Button控件 点击取消按钮关闭程序&#xff1b;点击登录按钮打开BorderWindow窗口。 TextBox控件 PasswordBox控件 TextBlock控件 加载窗口时显示TextBlock中的内容 RadioButton控件 CheckBox控件…

Docker清理

title: “Mysql安装” createTime: 2022-01-04T20:07:3108:00 updateTime: 2022-01-04T20:07:3108:00 draft: false author: “name” tags: [“mysql”] categories: [“docker”] description: “测试的” docker-mysql安装部署文档 文章目录 title: "Mysql安装" …

413 Request Entity Too Large问题

问题背景 在某系统中上传文件时&#xff0c;如果文件大小超过了一定范围就会爆 413 Request Entity Too Large 问题。 原因 在使用 nginx 反向代理后台服务时&#xff0c;如果请求体中过大&#xff0c;超过了默认的 1M 则会爆该错误。 解决方案 在 nginx 中&#xff0c;指…

信号类型(雷达)——脉冲雷达(四)

系列文章目录 《信号类型&#xff08;雷达通信&#xff09;》 《信号类型&#xff08;雷达&#xff09;——雷达波形认识&#xff08;一&#xff09;》 《信号类型&#xff08;雷达&#xff09;——连续波雷达&#xff08;二&#xff09;》 《信号类型&#xff08;雷达&…

【Java 进阶篇】深入理解 JDBC:Java 数据库连接详解

数据库是现代应用程序的核心组成部分之一。无论是 Web 应用、移动应用还是桌面应用&#xff0c;几乎都需要与数据库交互以存储和检索数据。Java 提供了一种强大的方式来实现与数据库的交互&#xff0c;即 JDBC&#xff08;Java 数据库连接&#xff09;。本文将深入探讨 JDBC 的…

力扣 -- 10. 正则表达式匹配

解题步骤&#xff1a; 参考代码&#xff1a; class Solution { public:bool isMatch(string s, string p) {int ms.size();int np.size();//处理后续映射关系s s;//处理后续映射关系p p;vector<vector<bool>> dp(m1,vector<bool>(n1));//初始化dp[0][0]true…

【开发篇】十、Spring缓存:手机验证码的生成与校验

文章目录 1、缓存2、用HashMap模拟自定义缓存3、SpringBoot提供缓存的使用4、手机验证码案例完善 1、缓存 缓存是一种介于数据永久存储介质与数据应用之间的数据临时存储介质使用缓存可以有效的减少低速数据读取过程的次数&#xff08;例如磁盘IO&#xff09;&#xff0c;提高…