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

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/embedded/30159.html

相关文章

Stable Diffusion WebUI 中文提示词插件 sd-webui-prompt-all-in-one

本文收录于《AI绘画从入门到精通》专栏,订阅后可阅读专栏内所有文章,专栏总目录:点这里。 大家好,我是水滴~~ 今天为大家介绍 Stable Diffusion WebUI 的一款中文提示词插件 sd-webui-prompt-all-in-one,就像它的名字一样,该插件几乎涵盖了提示词相关的所有功能。 文章内…

使用unreal engine5.3.2创建c++第一人称游戏

UE5系列文章目录 文章目录 UE5系列文章目录前言一、NuGet 简介二、解决方法&#xff1a; 前言 为了使用unreal engine5.3.2创建c第一人称游戏&#xff0c;今天安装了Visual Studio 2022专业版。在ue5中创建c工程&#xff0c;结果编译器报错&#xff1a; 严重性 代码 说明 项目…

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

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

SSL通信、证书认证原理和失败原因

目录 SSL通信SSL认证原理SSL证书认证失败的原因分析 SSL通信 SSL通信指的是使用SSL&#xff08;Secure Sockets Layer&#xff09;协议进行的加密通讯。SSL是一种标准的安全技术&#xff0c;用于建立一个加密链接&#xff0c;确保从用户的浏览器到服务器之间的数据传输是私密和…

2024年 Java 面试八股文——SpringMVC篇

目录 1.简单介绍下你对springMVC的理解? 2.说一说SpringMVC的重要组件及其作用 3.SpringMVC的工作原理或流程 4.SpringMVC的优点 5.SpringMVC常用注解 6.SpringMVC和struts2的区别 7.怎么实现SpringMVC拦截器 8.SpringMvc的控制器是不是单例模式&#xff1f;如果是&am…

matlab绘制散点图

在MATLAB中&#xff0c;可以使用scatter函数来绘制散点图。下面是一个简单的例子&#xff0c;说明如何使用scatter函数来绘制散点图。 假设你有一组x坐标和一组y坐标&#xff0c;你想在图上绘制它们&#xff1a; % 创建x和y的随机数据 x randn(1, 100); % 从正态分布中生成…

AntDesignReact提示key重复解决方案

在使用antd树形组件的时候&#xff0c;有时候会存在挂载相同的账号&#xff0c;相同账号的id是重复的&#xff0c;组件直接就不能用了&#xff0c;所以查找论坛&#xff0c;发现可以使用这个插件解决&#xff1b; 下载 npm install uuid项目中使用 // 导入 import { v4 as uu…

【redis】redix在Linux下的环境配置和redis的全局命令

˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好&#xff0c;我是xiaoxie.希望你看完之后,有不足之处请多多谅解&#xff0c;让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN 如…

MIPS32 指令架构

指令格式 R 类型 说明&#xff1a; 用于寄存器和寄存器操作 参数说明: Op: 指令操作码Rs: 第一个源操作数寄存器号&#xff0c;参与运算使用Rd: 目的操作数寄存器号&#xff0c;保存结果使用Shamt: 位偏移量&#xff0c;仅在位移指令使用&#xff0c;在此直接置0Func: 指令函…

【打工日常】云原生之使用docker部署Web在线流程图软件

一、drawio介绍 1.drawio简介 draw.io是一款免费、开源、高质量的WEB在线流程图软件&#xff0c;无需注册登录&#xff0c;支持多种图表类型和元素&#xff0c;可在线编辑和导出。它是一个可配置的图表/白板可视化应用程序。该应用程序的设计主要是按原样使用。draw.io不适合作…

安装部署大语言模型 | 通义千问

下载安装 进入ollama的仓库下载 「 qwen 7b 」 libraryGet up and running with large language models.https://ollama.com/library查找阿里的 「 qwen 」 根据自己的电脑配置情况&#xff0c;选择合适的模型 总体来说&#xff0c;模型是越大&#xff0c;效果越好&#xff0c…

类和对象【四】运算符重载

文章目录 运算符重载的概念运算符重载&#xff08;函数&#xff09;返回值类型&#xff1a;任意类型函数名&#xff1a;operator已有操作符 运算符重载&#xff08;函数&#xff09;的特点和注意点3个比较特殊的运算符重载赋值运算符&#xff08;&#xff09;重载返回值类型和返…

C/C++ BM32 合并二叉树

文章目录 前言题目解决方案一1.1 思路阐述1.2 源码 解决方案二2.1 思路阐述2.2 源码 总结 前言 树的题目大概率是要用到递归的&#xff0c;将一个树的问题拆分成子树的问题&#xff0c;不断拆分。 这题也用到了递归的思想。 题目 已知两颗二叉树&#xff0c;将它们合并成一颗…

鸿蒙内核源码分析(用栈方式篇) | 程序运行场地谁提供的

精读内核源码就绕不过汇编语言&#xff0c;鸿蒙内核有6个汇编文件&#xff0c;读不懂它们就真的很难理解以下问题. 1.系统调用是如何实现的? 2.CPU是如何切换任务和进程上下文的? 3.硬件中断是如何处理的? 4.main函数到底是怎么来的? 5.开机最开始发生了什么? 6.关机…

每天学习一个Linux命令之file

每天学习一个Linux命令之file 在Linux系统中&#xff0c;有很多强大的命令可用于文件操作和管理。其中一个非常有用的命令是file。file命令可以用于确定文件的类型&#xff0c;它会根据文件的内容进行检测和判断&#xff0c;并输出相应的文件类型信息。在本篇博客中&#xff0…

借助Aspose.SVG图像控件,在线将 PNG 转换为 XML

Aspose.SVG for .NET 是用于SVG文件处理的灵活库&#xff0c;并且与其规范完全兼容。API可以轻松加载&#xff0c;保存和转换SVG文件&#xff0c;以及通过其文档对象模型&#xff08;DOM&#xff09;读取和遍历文件的元素。API独立于任何其他软件&#xff0c;使开发人员无需使用…

python的json序列化和反序列化

在Python中解析JSON数据非常简单&#xff0c;你可以使用内置的json模块。这个模块提供了loads()函数来解析JSON字符串&#xff0c;以及load()函数来解析JSON文件。 import json# JSON字符串 json_str {"name": "John", "age": 30, "city&…

golang 基础知识细节回顾

之前学习golang的速度过于快&#xff0c;部分内容有点囫囵吞枣的感觉&#xff0c;写gorm过程中有很多违反我常识的地方&#xff0c;我通过复习去修正了我之前认知错误和遗漏的地方。 itoa itoa自增的作用在编辑error code时候作用很大&#xff0c;之前编辑springboot的error c…

【Flask 系统教程 3】请求与响应

Flask 是一个灵活而强大的 Web 框架&#xff0c;而请求与响应则是构建 Web 应用的核心组成部分。在本文中&#xff0c;我们将探讨 Flask 中请求与响应的各种用法&#xff0c;包括不同的请求方法、重定向、响应对象、获取查询参数以及文件上传等。 请求 在 Flask 中&#xff0…

打印x型图案Java

KiKi学习了循环&#xff0c;BoBo老师给他出了一系列打印图案的练习&#xff0c;该任务是打印用“*”组成的X形图案。 输入描述&#xff1a; 多组输入&#xff0c;一个整数&#xff08;2~20&#xff09;&#xff0c;表示输出的行数&#xff0c;也表示组成“X”的反斜线和正斜线…