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

2024-05-03 11:04

本文主要是介绍细说SVPWM原理及软件实现原理,关联PWM实现,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

细说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 矢量控制的理解。

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的控制回顾,如果你不能快速理解上述过程,建议可以先阅读上文中介绍到的博文进行学习 ~

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控制原语

这篇关于细说SVPWM原理及软件实现原理,关联PWM实现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/956594

相关文章

Python使用Tenacity一行代码实现自动重试详解

《Python使用Tenacity一行代码实现自动重试详解》tenacity是一个专为Python设计的通用重试库,它的核心理念就是用简单、清晰的方式,为任何可能失败的操作添加重试能力,下面我们就来看... 目录一切始于一个简单的 API 调用Tenacity 入门:一行代码实现优雅重试精细控制:让重试按我

Redis客户端连接机制的实现方案

《Redis客户端连接机制的实现方案》本文主要介绍了Redis客户端连接机制的实现方案,包括事件驱动模型、非阻塞I/O处理、连接池应用及配置优化,具有一定的参考价值,感兴趣的可以了解一下... 目录1. Redis连接模型概述2. 连接建立过程详解2.1 连php接初始化流程2.2 关键配置参数3. 最大连

Python实现网格交易策略的过程

《Python实现网格交易策略的过程》本文讲解Python网格交易策略,利用ccxt获取加密货币数据及backtrader回测,通过设定网格节点,低买高卖获利,适合震荡行情,下面跟我一起看看我们的第一... 网格交易是一种经典的量化交易策略,其核心思想是在价格上下预设多个“网格”,当价格触发特定网格时执行买

python设置环境变量路径实现过程

《python设置环境变量路径实现过程》本文介绍设置Python路径的多种方法:临时设置(Windows用`set`,Linux/macOS用`export`)、永久设置(系统属性或shell配置文件... 目录设置python路径的方法临时设置环境变量(适用于当前会话)永久设置环境变量(Windows系统

Python对接支付宝支付之使用AliPay实现的详细操作指南

《Python对接支付宝支付之使用AliPay实现的详细操作指南》支付宝没有提供PythonSDK,但是强大的github就有提供python-alipay-sdk,封装里很多复杂操作,使用这个我们就... 目录一、引言二、准备工作2.1 支付宝开放平台入驻与应用创建2.2 密钥生成与配置2.3 安装ali

Spring Security 单点登录与自动登录机制的实现原理

《SpringSecurity单点登录与自动登录机制的实现原理》本文探讨SpringSecurity实现单点登录(SSO)与自动登录机制,涵盖JWT跨系统认证、RememberMe持久化Token... 目录一、核心概念解析1.1 单点登录(SSO)1.2 自动登录(Remember Me)二、代码分析三、

PyCharm中配置PyQt的实现步骤

《PyCharm中配置PyQt的实现步骤》PyCharm是JetBrains推出的一款强大的PythonIDE,结合PyQt可以进行pythion高效开发桌面GUI应用程序,本文就来介绍一下PyCha... 目录1. 安装China编程PyQt1.PyQt 核心组件2. 基础 PyQt 应用程序结构3. 使用 Q

Python实现批量提取BLF文件时间戳

《Python实现批量提取BLF文件时间戳》BLF(BinaryLoggingFormat)作为Vector公司推出的CAN总线数据记录格式,被广泛用于存储车辆通信数据,本文将使用Python轻松提取... 目录一、为什么需要批量处理 BLF 文件二、核心代码解析:从文件遍历到数据导出1. 环境准备与依赖库

linux下shell脚本启动jar包实现过程

《linux下shell脚本启动jar包实现过程》确保APP_NAME和LOG_FILE位于目录内,首次启动前需手动创建log文件夹,否则报错,此为个人经验,供参考,欢迎支持脚本之家... 目录linux下shell脚本启动jar包样例1样例2总结linux下shell脚本启动jar包样例1#!/bin

go动态限制并发数量的实现示例

《go动态限制并发数量的实现示例》本文主要介绍了Go并发控制方法,通过带缓冲通道和第三方库实现并发数量限制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录带有缓冲大小的通道使用第三方库其他控制并发的方法因为go从语言层面支持并发,所以面试百分百会问到