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

devtools/2024/9/19 15:14:31/ 标签: 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/devtools/33804.html

相关文章

LeetCode 1491. 去掉最低工资和最高工资后的工资平均值【编程基础】简单

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…

关于图形库

文章目录 1. 概念介绍2. 使用方法2.1 普通路由2.2 命名路由 3. 示例代码4. 内容总结 我们在上一章回中介绍了"使用get显示Dialog"相关的内容&#xff0c;本章回中将介绍使用get进行路由管理.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我们在本章…

Mac 安装John the Ripper 破解rar(zip)压缩文件

注&#xff1a;仅以此篇记录我满足好奇心所逝去的十几个小时。&#xff08;自娱自乐&#xff09; 1、首先利用 brewhome 包管理工具 安装john the ripper &#xff1a; brew install john-jumbo 如果没有安装brewhome 利用如下命令安装&#xff1a; /bin/zsh -c "$(c…

基于HAL库的stm32中定时器的使用--定时器中断每隔一秒进行led灯的闪烁以及定时器生成PWM

一&#xff1a;什么是定时器 &#xff08;1&#xff09;stm32定时器&#xff0c;是存在于stm32单片机中的一个外设。stm32共有八个定时器&#xff0c;两个高级定时器&#xff08;TIM1、TIM8&#xff09;&#xff0c;四个通用定时器&#xff08;TIM2、TIM3、TIM4、TIM5&#xff…

Sqlmap使用

sqlmap -u "http://example.com/index.php?id1" --tables sqlmap查看表名 1、检测「注入点」 sqlmap -u http://xx/?id1 2、查看所有「数据库」 sqlmap -u http://xx/?id1 --dbs 3、查看当前使用的数据库 sqlmap -u http://xx/?id1 --current-db 4、查看「数…

Android滑动冲突解决方案面试问题及回答

问题 1: 什么是滑动冲突&#xff1f;在Android开发中常见哪些类型&#xff1f; 答案: 滑动冲突通常发生在多个滑动组件&#xff08;如ScrollView, ListView, ViewPager等&#xff09;嵌套使用时&#xff0c;各个组件对同一个滑动事件的响应发生冲突。常见的类型包括垂直滑动冲…

【ARM Cortex-M3指南】5:Cortex-M3设计综述

文章目录 五、Cortex-M3设计综述5.1 流水线5.2 详细框图5.3 Cortex-M3上的总线接口5.3.1 I-CODE总线5.3.2 D-CODE总线5.3.3 系统总线5.3.4 外部PPB5.3.5 DAP总线 5.4 Cortex-M3上的其他接口5.5 外部PPB5.6 典型连接5.7 复位类型和复位信号 五、Cortex-M3设计综述 本章主要面向…

Samsung三星NP930XCJ-K01CN笔记本原厂Win10系统安装包下载

三星SAMSUNG笔记本电脑原装出厂Windows10预装OEM系统&#xff0c;恢复开箱状态自带系统 链接&#xff1a;https://pan.baidu.com/s/1Y3576Tsp8MtDxIpJGDucbA?pwdt0ox 提取码&#xff1a;t0ox 三星原装W10系统自带声卡,网卡,显卡,指纹,蓝牙等所有驱动、三星出厂主题专用壁纸…

【数据结构】位图与布隆过滤器

目录 前言 位图的概念 经典面试题目 位图的模拟实现 set() reset() test() 位图整体代码 位图的应用 位图的优缺点 布隆过滤器 布隆过滤器的概念 哈希函数的个数与布隆过滤器长度的关系 布隆过滤器的模拟实现 插入 查找 删除 布隆过滤器整体代码 前言 哈希本质…

MySQL-笔记-08.数据库编程

目录 8.1 编程基础 8.1.1 基本语法 8.1.2 运算符与表达式 1. 标识符 2. 常量 &#xff08;1&#xff09; 字符串常量 &#xff08;2&#xff09;日期时间常量 &#xff08;3&#xff09;数值常量 &#xff08;4&#xff09;布尔值常量 &#xff08;5&#xff09;NULL…

MyScaleDB:SQL+向量驱动大模型和大数据新范式

大模型和 AI 数据库双剑合璧&#xff0c;成为大模型降本增效&#xff0c;大数据真正智能的制胜法宝。 大模型&#xff08;LLM&#xff09;的浪潮已经涌动一年多了&#xff0c;尤其是以 GPT-4、Gemini-1.5、Claude-3 等为代表的模型你方唱罢我登场&#xff0c;成为当之无愧的风口…

大模型预测,下一个token何必是文字?

太快了太快了… 大模型的生成技能&#xff0c;已经到了普通人看不懂的境界&#xff01; 它可以根据用户过去5年的体检报告&#xff0c;生成未来第1年、第2年、第3年的体检报告。 你看&#xff0c;这个生成的过程&#xff0c;是不是像极了ChatGPT&#xff0c;根据历史单词预测…

socat移植到arm+linux

socat是一个用于建立双向数据流传输的工具&#xff0c;它可以在不同的网络层上创建连接&#xff0c;并支持多种协议&#xff0c;如TCP、UDP、SSL等。它非常强大且易于使用&#xff0c;因此广泛用于网络开发和系统管理中&#xff0c;这里记录一下移植到嵌入式系统的过程。 下载s…

使用ganache实现Web3js和区块链交互的步骤 及问题解决:Command ‘express’ not found等

Web3js和区块链交互 做一个简单的dapp 1.express安装 sudo npm install express -g 出现问题&#xff1a;Command ‘express’ not found, 解决&#xff1a;在安装express时增加generator参数&#xff1a; npm install -g express-generator 成功后使用 express -e MyDa…

linux内核源码分析--核心网络文件和目录

图3-2显示了在/proc/sys中由网络代码所使用的主要目录&#xff0c;就每个目录而言&#xff0c;都列出了在哪一章描述其文件。 proc/sys/net bridge ipv4 core route neigh conf 图3-2/proc/sys/net 中的核心目录 根据前借所述&#xff0c;我们来看net中的树根是如何定义的&…

eve 导入linux

mkdir /opt/unetlab/addons/qemu/linux-centos7 cd /opt/unetlab/addons/qemu/linux-centos7 上传hda.qcow2 /opt/unetlab/wrappers/unl_wrapper -a fixpermissions Linux images - (eve-ng.net) Due to very high demand of this section and problems with how to crea…

IDEA访问不到静态资源

背景 我在resources下创建static文件夹&#xff0c;再创建front文件夹放前端资源&#xff0c;里面有index.html&#xff0c;游览器输入localhost:8011/front没反应。&#xff08;resources/static/front/index.html&#xff09; 解决办法 重启idea&#xff0c;清楚idea缓存&am…

深入图像分类:使用美国手语数据集训练定制化神经网络

引言 在前一篇博客中&#xff0c;我们探讨了如何使用MNIST数据集训练一个基础的神经网络来进行手写数字识别。在本文中&#xff0c;我们将更进一步&#xff0c;使用美国手语字母表&#xff08;ASL&#xff09;数据集来构建一个定制化的图像分类模型。通过这个过程&#xff0c;…

Spring 原理

&#x1f3a5; 个人主页&#xff1a;Dikz12&#x1f525;个人专栏&#xff1a;Spring学习之路&#x1f4d5;格言&#xff1a;吾愚多不敏&#xff0c;而愿加学欢迎大家&#x1f44d;点赞✍评论⭐收藏 目录 Bean的作用域 代码实现 观察Bean的作用域 Bean的生命周期 Spring …

程序控制结构案例

第n行输出n个*号 aint(input("Enter a number:\n")) for i in range(1,a1):for j in range(1,i1):print(*,end )if ji:print()break输入一个数字&#xff0c;输出他的每位上的数字 注意/与//的区别 numint(input(enter a number\n)) aTrue while a:if num/10!0:pr…