细说SVPWM原理及软件实现原理,关联PWM实现

ops/2024/9/20 6:53:35/ 标签: MCU, 嵌入式, 电机控制, FOC, SVPWM, 矢量控制, 无刷电机

SVPWMPWM_0">细说SVPWM原理及软件实现原理,关联PWM实现

文章目录

  • 细说SVPWM原理及软件实现原理,关联PWM实现
    • 1. 前言
    • 2. 基础控制原理回顾
      • 2.1 FOC 原理回顾
      • 2.2 细说 SVPWM
        • 2.2.1 矢量扇区计算
        • 2.2.2 矢量作用时间计算
      • 2.2.3 如何理解 U4 = U6 = 2/3Udc?
      • 2.2.4 如何理解 U4max = 2/3 Udc?
    • 3. 各矢量作用时间如何关联到PWM?软件如何实现?
    • 4. PWM输出占空比计算
      • 4.1 Ta Tb Tc 时间计算
      • 4.2 针对低端采样补充分析
    • 5. 总结

1. 前言

在本人之前的博客中,针对直流无刷电机FOC 控制算法进行了一个详细且完整的叙述,从理论推导到实际实现的全过程展示;但由于文章篇幅过长,有些小的细节可能没有得到详细叙述。

本文将针对FOC运算中最复杂的部分——SVPWM的理论原理以及具体的软件实现原理进行详细讲解,特别是SVPWM的实现如何与实际的PWM占空比连接起来。相信看过此篇文章对你一定有莫大帮助!

在这之前对于FOC控制不熟悉的同学,或者想要更深入了解的同学,均推荐可阅读本人精心编写的几篇博客内容,希望对你有所帮助:

  • 专栏:电机控制专栏(点击跳转)

  • 博文:直流无刷电机FOC控制算法 理论到实践 —— 理论(一)(点击跳转)

  • 博文:直流无刷电机FOC控制算法 理论到实践 —— 理论(二)(点击跳转)

  • 博文:直流无刷电机FOC控制算法 理论到实践 —— 实践(点击跳转)

  • 博文:直流无刷电机FOC控制原语

2. 基础控制原理回顾

在细说 SVPWM 之前,我们先对 FOC 矢量控制的整个原理进行一个简单的回顾,以便于我们在后续更好的理解后续的 SVPWM实现 以及对应的 PWM 输出的计算,同时检验下大家对于 FOC 矢量控制的理解。

FOC__25">2.1 FOC 原理回顾

关于FOC矢量控制步骤主要如下:

  1. 通过电流采样,获取 U V W 三相的实时电流 Ia Ib Ic
  2. 通过 Clack 变换 将 U V W 三相电流由 U-V-W 三相坐标系 转换到 α-β 直角坐标系 得到 Iα Iβ
  3. 之后通过 Park 变换α-β 直角坐标系 转换到旋转的 d-q 坐标系 得到 Iq_feedback Id_feedback,且经过 park 变换之后电流将由正弦变换状态变为直流状态;
  4. 之后在 d-q 坐标系 上进行 PID 计算,PID目标值为 Iq_targetId_target,反馈为 Iq_feedbackId_feedback,PID的输出结果为 Uq 以及 Ud
  5. 得到 Uq 以及 Ud 以后进行 反 Park 变换,由旋转的 d-q 坐标系 转换到 α-β 直角坐标系 得到 Uα Uβ
  6. 之后便是采用 SVPWM 去实现 Uα Uβ 咯 ~

这便是整个FOC的控制回顾,如果你不能快速理解上述过程,建议可以先阅读上文中介绍到的博文进行学习 ~

SVPWM_37">2.2 细说 SVPWM

接下来继续回归下 SVPWM 是如何实现 Uα Uβ 的吧。

2.2.1 矢量扇区计算

Uα 和 Uβ 是在 α-β 直角坐标系 上的两个坐标轴方向的矢量,将 Uα 和 Uβ 通过力矩合成可以得到 Uref ,这个其实是我们最终需要输出的 合成力矩(后文中也称之为合成磁力)。
在这里插入图片描述

根据由三个半桥组成的电机驱动电路,采用三三通电方式(也即同一时间必须有三个管子打开),一共可以由六种组合,这便是我们所能得到的六个基础矢量;这六个基础矢量将矢量输出切割出了六个扇区。
在这里插入图片描述
在这里插入图片描述

之后我们需要思考的便是 Uref 所在哪一个扇区;因为 Uref 落在哪一个扇区,决定了此矢量由哪两个基础矢量合成;

关于扇区的判断方式,我们有两种方式,简单叙述如下:

方式一: 通过假设等式计算得出:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

方式二: 通过正余弦角度推理计算:

  1. 根据 Uα 和 Uβ 的正负判断所处四象限中的哪一个象限
  2. 之后根据 sin(θ) = Uβ / Uα 计算值与 sin(60°) 大小做比对进一步确认所处的扇区位置即可

通过以上方法便可得到 Uref 所处的扇区位置,便可知 Uref 将由哪两个基础矢量去进行合成!,之后便是计算基础矢量的作用时间了!


2.2.2 矢量作用时间计算

知道基础矢量是由哪 “两个” 矢量组成之后,剩下的便是计算此两个基础矢量的作用时间以及零矢量的作用时间了。

根据 Uα 和 Uβ 我们可以计算出 T4 和 T6 所作用的时间,如下图所示:
在这里插入图片描述
在这里插入图片描述

2.2.3 如何理解 U4 = U6 = 2/3Udc?

在上述计算中,我们有使用到一个条件:

在这里插入图片描述

这个条件是如何产生的呢?

在这里插入图片描述
如上图所示,紫色的六边形区域是我们通过控制基础矢量的大小能够实现的合成矢量(合成磁力)所覆盖的区域,如果我们始终保持输出的磁力始终为最大值,则输出的磁力将按照下图中的六边形外边缘轨迹输出,此时我们会发现输出的磁力大小将会不均匀!

那么为了使我们输出的合成磁力的大小保持均匀,我们在绘制此六边形的内切圆,即上图中的粉色区域,内切圆的边缘轨迹即为:最大的能均匀输出的合成磁力输出轨迹,因为需要有保证我们矢量的大小均匀的条件,故我们应控制我们输出的合成磁力落在上图中的红色圆内区域!

那红色圆区域最大的输出磁力 Uref max 是多少,如何计算呢?
在这里插入图片描述
在这里插入图片描述
好家伙,这里又引入了一个条件了: U4max = 2/3 Udc, 这个又是怎么来的呢? 继续!

2.2.4 如何理解 U4max = 2/3 Udc?

起始这个很好理解,U4max 即为电机相电压的最大值,注意是相电压,而不是线电压!

什么是线电压?什么是相电压?直接看下图,一目了然!
在这里插入图片描述


综上分析,我们已经彻底弄明白了 Uref 的分解是如何计算的,采用同样的方式,可计算出 Uref 在其他扇区时对应的基础矢量作用时间,如何所示:

在这里插入图片描述
那么得到 V4 和 V6 矢量的作用时间 T4 和 T6 以及零矢量的作用时间 T0 和 T7 之后,我们又如何与PWM的值关联起来呢?这便是本文所重点讨论的内容了!

3. 各矢量作用时间如何关联到PWM?软件如何实现?

通过上述计算,我们已经可以得出各基础矢量的公式了,但是这个公式看上去似乎很不尽人意,还是一点也想不到如何将这与PWM的占空比联系起来,更别说使用上述公式实现代码了!

上面这些公式看上去很复杂,其实是因为还没经过化简,那么如何化简呢?

我们继续以第一扇区的 T4 和 T6 举例,根据2.2.3章节可知,如果控制矢量在内切圆,则 Uref_max 的最大值为 Udc/sqrt3,而Uref又是由 Uα 和 Uβ 组成,故可知 Uα 和 Uβ 的范围为: ±Udc/sqrt3 !!!

markdown 不好打公式,那我还是继续使用word编辑好贴图吧~

在这里插入图片描述

通过上述化简,最终我们拿到的 T4 = Ts x (sqrt(3)/2 x Uα` - 1/2 x Uβ`) ,Ts 的整个控制周期,取定时器的ARR更新寄存器值,Uα` 和 Uβ` 为 -1 ~ +1 的标量!

这个时候再来看看 Uα` 和 Uβ` 从何而来?

Uα` 和 Uβ` 是通过来自 Uq 和 Ud 经过反Park坐标变化而来,因此 Uq 和 Ud 的取值范围也将是 -1 ~ +1!

再来看看 Uq 和 Ud 又是从何而来?

Uq 和 Ud 来自电流环的PID计算结果,故在进行电流环PID计算的时候,我们需要将电流环的输出限幅设置在 ±1!

当然,有时为了方便PID调参,PID输出目标值太小了,会导致PID参数值通常需要设置的非常小,而这会关联到一些精度丢失,浮点运算等等麻烦的事情,因此我们还可以进行下优化!

我们可以把 Ts 缩小 ARR 倍,及 Ts 取1,对应的 Uα` 和 Uβ` 的范围将由 -1 ~ +1 变为 0 - ARR,注意不是 -ARR - ARR,因为我们输出的是互补PWM,当占空比 >50% 的时候 U相为正, <50% 的时候 U相为负!通过这样的方式,这样我们PID输出的限幅可以修改 0 - ARR,输出数值更大,更方便我们PID的调节,当然你也可以改变放大倍数,不是ARR倍,放心吧,PID参数会帮我们搞定这事的,所以放大其他倍数也不会有影响,关键看我们怎么方便了~

在这里插入图片描述

4. PWM输出占空比计算

首先涉及到的是SVPWM的发波方式,SVPWM的发波方式有两种:五段式七段式控制。不同的控制方式,其零矢量的组成不一样,会对计算产生一点点影响。下面我们也来简单回顾一下两种控制方案:

七段式:
在这里插入图片描述

五段式:
在这里插入图片描述

  • 七段式一个控制周期,存在7种不同状态的切换,优势是对电机控制引入的谐波干扰更小;

  • 五段式一个控制周期存在5种不同的状态切换,优势是MOS发热更小;

以上两种方案,任意一种都行,弄懂一个,另外一个也就弄明白了,这里继续以七段式作为举例进行讲解。

这里,我们以 Uref 在第Ⅰ扇区举例,采用 七段式 控制方式。

首先我们回想下我们之前的六个基础矢量的定义方式;我们是假定 U+ V- W- 时,合成矢量为V4;在这个基础之上,其他矢量对应的通电顺序如下
在这里插入图片描述

序号矢量名称通电顺序
1V4U+ V- W-
2V6U+ V+ W-
3V2U- V+ W-
4V3U- V+ W+
5V1U- V- W+
6V5U+ V- W+

那么如果某相需要通正电,对应的其所在半桥的上管应该打开,下管关闭;

我们再假定打开为高,关闭为低;针对三个半桥的上管,对应波形应该如下:
在这里插入图片描述

之后我们用上述的 V4V6 两个基础矢量以及零矢量(V0V7)去实现 Uref我们可以先不思考各矢量的时间是多少,先思考为了减小开关损耗,如何实现每次矢量变化的时候只开关一个 MOS?

大家此处可先做思考,之后再来看下述答案。

在这里插入图片描述

我们将 V4 和 V6 拆解成了两份,这样便能实现切换时只用动作一个mos管了!

大家再仔细观察下上图,如果我们需要控制PWM输出上述波形,有哪里需要注意的吗?那便是我们对于PWM有效电平的控制,按照上述发波定义(之前的那几个假定条件),我们对上管的PWM应该是低电平先发送,触发比较寄存器CCR之后,电平翻转为有效电平高电平!注意这一点细节!

接下来就是最重要的计算各路PWM的输出了!

首先需要给大家提醒一个点,我们的FOC运算是一个PWM更新中断触发一次,因此实际FOC控制是在针对每个pwm周期进行!

在第2章节,我们已经计算得出了 T0、T7、T4、T6的时间,如下图:
在这里插入图片描述
注意上图中,我们配置PWM为三角波输出模式,计数值CNT由0增加至ARR,再由ARR递减至0,此过程合成了两次Uref,而不是一次!因此上图中是两个T4、两个T6以及两个T0和两个T7!

4.1 Ta Tb Tc 时间计算

如图所示,那么如何计算 UVW(ABC)三相的作用时间 Ta、Tb、Tc 是不是就很清楚了呢!注意,我们这里的 Ta、Tb、Tc 所指代的是上桥臂P波输出为高,也即上桥臂打开的时间!

  • Tc = T7 = T0 = 0.5 * (Ts - T4 -T6)
  • Tb = Tc + T6
  • Ta = Tb + T4

同理,其他扇区的计算也是同样的方法,这下大家应该弄懂了 Ta、Tb、Tc 是如何计算出来的了吧!
在这里插入图片描述
笔记最后的假定 K=1 Ts=1,所描述的即为约去了 sqrt(3)/Udc 以及标幺化Ts为1的操作,在第三章节已进行详细阐述!

通过以上计算,我们便可以得到 Ta Tb Tc 的作用时间,也即 U V W 三相的正反向通电时间。

计算出 Ta Tb Tc 的作用时间,也即上桥臂 PWM 高电平所占用的时间之后,接下来就是配置PWM输出来实现此发波了。PWM配置也有两种方式:即你配置的PWM输出是先输出高电平还是低电平有关!如下是具体的两种方式:

  • 方式A:
    • CNT < CCR:输出低电平
    • CNT > CCR:输出高电平
  • 方式B:
    • CNT < CCR:输出高电平
    • CNT > CCR:输出低电平

注意,我们这里分析的输出P波均是面向上半桥,下板桥采用互补输出! 如果你要面向下半桥,会存在差异,需你自行再分析下,都掌握了之后对你应该也不难~

在这里插入图片描述

采用不同的方式,对应的通道 CCR 计算方式不一样;

  • 以通道A举例:
    • 采用方式A,通道CCR值应设置为:ARR - Ta
    • 采用方式B,通道CCR值应设置为:Ta

4.2 针对低端采样补充分析

以上有两种发波方式,各有其优缺点,那么具体到实际应用中,又有哪些注意事项呢?

我们以三电阻或者两电阻的低端采样分析下;

低端采样有一个注意点,那便是采样时机的控制,务必要求在下半桥mos管打开的时候才去进行采样,这个时候有意思的就来了。回到我们上一小节描述的两种发波方式:

  • 方式A:
    • CNT < CCR:输出低电平
    • CNT > CCR:输出高电平
  • 方式B:
    • CNT < CCR:输出高电平
    • CNT > CCR:输出低电平

再次提醒,注意此发波为面向上桥臂,下桥臂采用互补输出自动发波。

针对方式A,在三角波的起始位置,及CNT=0时,上桥臂PWM输出低,下桥臂输出高,此时下桥臂全部打开,可以进行采样;因此每次电流采样可由定时器的更新中断触发,或者在更新中断内调用函数对ADC进行软触发;进行电流采集后进行FOC运算;

针对方式B,在三角波的中央位置,及CNT=ARR时,上桥臂PWM输出低,下桥臂输出高,此时下桥臂全部打开,可以进行采样;因此此方式电流采样需要配置定时器通道4,通道4的比较值设置为 ARR,当通道4的发生比较事件时,触发ADC采样,或者在通道4的比较中断内调用函数对ADC进行软触发,并进行FOC运算!

方式A,采样点在更新中断发生后,FOC也在更新中断内;
方式B,采样点在通道4的比较中断发生后,FOC计算位于通道4的比较中断内;

所以说P波可不是乱发的,选对合适的很重要~

相信这才是实战的经验吧!希望帮助到看到这里的每一个人~

5. 总结

综上,便是对于SVPWM之PWM输出占空比计算的的补充,欢迎大家讨论留言!也欢迎大家点赞关注+收藏,大家的支持是我创作的动力~

  • 专栏:电机控制专栏(点击跳转)

  • 博文:直流无刷电机FOC控制算法 理论到实践 —— 理论(一)(点击跳转)

  • 博文:直流无刷电机FOC控制算法 理论到实践 —— 理论(二)(点击跳转)

  • 博文:直流无刷电机FOC控制算法 理论到实践 —— 实践(点击跳转)

  • 博文:直流无刷电机FOC控制原语


http://www.ppmy.cn/ops/29896.html

相关文章

【C++】命名冲突了怎么办?命名空间来解决你的烦恼!!!C++不同于C的命名方式——带你认识C++的命名空间

命名空间 导读一、什么是C?二、C的发展三、命名空间3.1 C语言中的重名冲突3.2 什么是命名空间&#xff1f;3.3 命名空间的定义3.4 命名空间的使用环境3.5 ::——作用域限定符3.6 命名空间的使用方法3.6.1 通过作用域限定符来指定作用域3.6.2 通过关键字using和关键字namespace…

Ubuntu下安装并配置SAMBA服务器

今天我要给大家带来一个关于在Ubuntu下安装并配置SAMBA服务器的详细技术博客。不过&#xff0c;在我们开始之前&#xff0c;我得先夸一夸阿贝云免费服务器&#xff0c;这个免费云服务器真是不错的东西啊&#xff01;配置有1核CPU、1G内存、10G硬盘和5M带宽。现在我们开始吧&…

Django响应‘表单请求’过程

&#xff08;1&#xff09;用户通过自己的浏览器&#xff08;客户端&#xff09;第一次向服务器发出含有表单页面的请求&#xff0c;Django会创建一个未绑定数据的表单实例&#xff08;例如form LoginForm(), form实例就是未绑定实例&#xff09;&#xff0c;即空表单&#xf…

【Docker】如何注册Hub账号并上传镜像到Hub仓库

一、创建Hub账户 浏览器访问&#xff1a;hub.docker.com 点击【Sign up】注册账号 输入【邮箱】【用户名】【密码】 ps&#xff1a;用户名要有字母数字&#xff1b;订阅不用勾选 点击【Sign up】注册即可 点击【Sign in】登录账号 输入【邮箱】【密码】 点击【Continue】登录 二…

SAP PP学习笔记08 - 作业区(工作中心Work Center),作业区Customize

上一章讲了作业手顺&#xff08;工艺路线Routing&#xff09;。 SAP PP学习笔记07 - 作业手顺&#xff08;工艺路线Routing&#xff09;-CSDN博客 这一章来讲讲作业区&#xff08;工作中心 Work Center&#xff09;。 1&#xff0c;作业区&#xff08;工作中心&#xff09;中…

《十二》Qt各种对话框之FileDialog文件对话框及QMessageBox 消息对话框

QFileDialog 对话框 选择打开一个文件 若要打开一个文件&#xff0c;可调用静态函数 QFileDialog::getOpenFileName()&#xff0c;“打开一个文件”按钮的响应代码如下&#xff1a; void Dialog::on_btnOpen_clicked() { //选择单个文件QString curPathQDir::currentPath()…

241 基于matlab的Dijkstra算法进行路径规划

基于matlab的Dijkstra算法进行路径规划。可根据实际情况输入障碍物和起止点坐标信息&#xff1b; 输出避碰最短路径&#xff1b; 能够利用切线图算法对障碍物区域进行环境建模&#xff0c;设置障碍物的位置和区域。利用Dijkstra算法进行路径规划。程序已调通&#xff0c;可直接…

学习java的继承

1.什么是继承 java中提供了一个关键字&#xff0c;extends&#xff0c;可以让一个类与另一个类建立起父子关系。 例如 public class B extends A { --- } 在这里&#xff0c;我们称A类为父类&#xff08;也被称为基类或者超类&#xff09;B类称为子类&#xff08;或者是派生…

数组的扩容与缩容

数组的扩容与缩容 文章目录 数组的扩容与缩容数组的扩容内存分析 数组的缩容内存分析内存分析 数组的扩容 数组扩容是指当原有数组的空间不足以容纳更多的元素时&#xff0c;创建一个新的、长度更大的数组&#xff0c;并将原数组中的元素复制到新数组中&#xff0c;然后更新原…

SpringCloud学习笔记(一)微服务介绍、服务拆分和RestTemplate远程调用、Eureka注册中心

文章目录 1 认识微服务1.1 单体架构1.2 分布式架构1.3 微服务1.4 SpringCloud1.5 总结 2 服务拆分与远程调用2.1 服务拆分原则2.2 服务拆分示例2.2.1 搭建项目2.2.2 创建数据库和表2.2.3 实现远程调用2.2.3.1 需求描述2.2.3.2 注册RestTemplate2.2.3.3 实现远程调用 2.2.4 提供…

使用Python爬虫会遇到的问题和解决方法(包含案例)

一、HTTP错误&#xff08;如403 Forbidden&#xff09; 问题描述&#xff1a; 当使用requests库发起请求时&#xff0c;可能会遇到HTTP 403 Forbidden错误&#xff0c;这通常意味着服务器理解了请求&#xff0c;但是拒绝执行它。 解决方法&#xff1a; 1.设置headers&#xf…

Vue3 + TS + Element-Plus 封装的 Table 表格组件

代码中主要增加了3个插槽&#xff0c;operationsStart 从操作栏开头增加按钮&#xff0c;operationsStart 从操作栏结尾增加按钮&#xff0c;还有一个插槽用来自定义列的内容&#xff0c;就是 TableModel里面的Key <template><el-tableborderstripe:data"data&q…

每天五分钟深度学习框架pytorch:如何创建多维Tensor张量元素?

本文重点 上节课程我们学习了如何创建Tensor标量,我们使用torch.tensor。本节课程我们学习如何创建Tensor向量,我们即可以使用torch.Tensor又可以使用torch.tensor,下面我们看一下二者的共同点和不同点。 Tensor张量 tensor张量是一个多维数组,零维就是一个点(就是上一…

金三银四面试题(二十四):享元模式知多少?

什么是享元模式 享元模式&#xff08;Flyweight Pattern&#xff09;是一种结构型设计模式&#xff0c;旨在通过共享对象来减少内存使用&#xff0c;从而提高性能。它主要用于处理大量细粒度对象的情况&#xff0c;通过将这些对象的可共享部分&#xff08;内部状态&#xff09…

SpringBoot配置文件

目录 1 SpringBoot配置文件 2 配置文件的快速入手 3 配置文件格式 4 properties配置文件说明 4.1 properties基本语法 4.2 读取配置文件 4.3 properties缺点 5 yml配置文件 5.1 yml基本语法 5.2 yml配置不同数据类型及null 5.3 配置对象 5.4 配置集合 5.5 配置Map 5.6 yml优缺…

xLua热更新解决方案

图中灰色的无法实现热更新&#xff0c;而Lua代码可以打包成AB包&#xff0c;并上传到资源服务器&#xff0c; 当进入游戏检测是否有资源需要更新&#xff0c;需要则会从资源服务器下载。 学习目标 1.导入xLua框架 2.C#调用Lua 3.Lua调用C# 4.xLua热补丁 xLua框架导入和AB…

【统计推断】-01 抽样原理之(三)

文章目录 一、说明二、抽样分布三 均值抽样分布3.1 有限母体无放回抽样3.2 有限母体有放回抽样3.3 无限母体 四、比例抽样分布五、和差抽样分布 一、说明 上文中叙述母体和抽样的设计&#xff1b;以及抽样分布的概念&#xff0c;本篇将这种关系定量化&#xff0c;专门针对抽样的…

智能安全时代:AI如何重塑我们对网络威胁的应对

在数字化时代&#xff0c;网络安全已成为维护国家安全、企业利益和个人隐私的重要屏障。随着技术的不断进步&#xff0c;人工智能&#xff08;AI&#xff09;已经成为增强网络安全防护的关键工具。本文将探讨人工智能如何通过其独特的能力&#xff0c;为网络安全领域带来革命性…

ThreeJS:本地部署官网文档与案例

部署方式 部署之前请确保已经配置好node.js环境。 1. 下载ThreeJS源码 ThreeJS的GitHub地址&#xff1a;GitHub - mrdoob/three.js: JavaScript 3D Library.&#xff0c;可以简单查看ThreeJS当前版本&#xff1a;r164&#xff0c; 我们可以选择对应的版本&#xff08;此处为r1…

利用大语言模型(KIMI)构建控制信息模型

数字化的核心是数字化建模&#xff0c;为一个事物构建数字模型是一项十分复杂的工作。不同的应用场景&#xff0c;对事物的关注重点的不同的。例如&#xff0c;对于一个智能传感器而言&#xff0c;从商业的角度看&#xff0c;产品的信息模型中应该包括产品的类型&#xff0c;名…