【电机控制算法】SVPWM算法的应用(基于Simulink与STM32外设场景的仿真)

article/2025/10/5 10:40:14

文章目录

  • 前言
  • 一、扇区判断
  • 二、各扇区基础矢量作用时间的计算
    • 1.若处于扇区I
    • 2.若处于扇区II
    • 3.若处于扇区III
    • 4.若处于扇区IV
    • 5.若处于扇区V
    • 6.若处于扇区VI
    • 7.In a word
  • 三、STM32的外设场景
    • 1. TIMx的计数器CNT
    • 2. TIMx的输入捕获寄存器CCRx
    • 3. TIMx的两种PWM模式
  • 四、互补输出且呈中心对称的PWM对
  • 五、载波和调制波
  • 六、观察相应扇区的3对PWM波形
    • 1.扇区I
    • 2.扇区II
    • 3.扇区III
    • 4.扇区IV
    • 5.扇区V
    • 6.扇区VI
    • 7.In a word
  • 七、Simulink编程仿真
    • 1. 输入与输出
    • 2. MATLAB编程
    • 3. 利用SVPWM算法的输出搭建中心对称且互补的PWM生成器
    • 4.仿真结果与波形


前言

授人以鱼不如授人以渔,笔者没有直接给出MCU的源码,而是希望读者能够触类旁通,能在仿真软件中搭建硬件的机制,又能根据硬件的特性编程出SVPWM。
笔者写下此文的目的,另一方面也是为了记录在MCU中实现七段式SVPWM最简单最高效率的计算方法,所以本文并不会把重点放在理解SVPWM上,而是适当推导,利用最终结论,并结合STM32的硬件场景,去编写SVPWM算法。
若您的重点是在于理解SVPWM的由来和始末,相信其他文章能够讲得比笔者更好。
在这里插入图片描述

一、扇区判断

我们需要知道电机转子当前所在的扇区,下一步才能生成与转子形成一定相位差的定子磁场,吸引转子以最大的力矩旋转。这时候需要利用到两相静止坐标轴(2s)的电压值 Vα和Vβ.
我们定义:

在这里插入图片描述

不难发现,U1+U2+U3=0。在芯片中编程时,可以使用这个关系对U2或者U3的表达式进行简化,从而避免更多的乘除法运算(因为更耗时)。
再定义:
若U1>0,A=1;否则A=0;
若U2>0,B=1;否则B=0;
若U3>0,C=1;否则C=0;
存在关系式: N=4C+2B+A
真值表:

N315462
扇区sectorIIIIIIIVVVI

二、各扇区基础矢量作用时间的计算

对于矢量,都是可以合成的。定义Uref为合成矢量,Ts为一个作用周期(也就是一个中心对称的互补PWM对的周期):

1.若处于扇区I

在这里插入图片描述
在这里插入图片描述

2.若处于扇区II

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.若处于扇区III

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.若处于扇区IV

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5.若处于扇区V

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

6.若处于扇区VI

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

7.In a word

在这里插入图片描述

扇区sectorIIIIIIIVVVI
作用时间1T4=K*U2T2=-K*U2T2=K*U1T1=-K*U1T1=K*U3T4=-K*U3
作用时间2T6=K*U1T6=-K*U3T3=K*U3T3=-K*U2T5=K*U2T5=-K*U1

若Ts>作用时间1+作用时间2,那么,剩下的作用时间都平均分配给了两个零矢量。T(000)=T(111)=0.5 *(Ts-作用时间1-作用时间2)
当Ts=作用时间1+作用时间2,T(000)=T(111)=0;

三、STM32的外设场景

关于定时器PWM输出机制的理解上,还请翻阅:STM32定时器的单路PWM输出。

1. TIMx的计数器CNT

<1>非中心对称计数
在这里插入图片描述
<2>中心对称计数
在这里插入图片描述

2. TIMx的输入捕获寄存器CCRx

CCRx是指:当CNT计数到CCRx寄存器存储的计数值时,CHx的电平发生转换,有个图更形象:
在这里插入图片描述

3. TIMx的两种PWM模式

STM32主要有两种PWM发波模式。
PWM模式1:
CNT<CCR,CHx高电平,否则CHx低电平
在这里插入图片描述

PWM模式2:
CNT>CCR,CHx高电平,否则CHx低电平
在这里插入图片描述

四、互补输出且呈中心对称的PWM对

以CNT向上计数,PWM2模式为例。我们看看外设的应用场景。
单路非中心对称的PWM输出:
在这里插入图片描述
而互补输出且呈中心对称的PWM:
在这里插入图片描述
在这里插入图片描述
一般的MOS管,它的关断时间大于开通时间很多,反向恢复时间则更长,编程时往往选最大的时延考虑。

三相六臂全桥

三相六臂全桥

在这里插入图片描述
在这里插入图片描述

五、载波和调制波

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

六、观察相应扇区的3对PWM波形

以下均以CNT向上计数,PWM2模式为例.
在这里插入图片描述

波形由上到下依次是A,B,C三相。

1.扇区I

在这里插入图片描述
更正:Tx定义为零矢量后先发送的矢量的作用时间,Ty定义为其后发生的矢量的作用时间.

2.扇区II

在这里插入图片描述

3.扇区III

在这里插入图片描述

4.扇区IV

在这里插入图片描述

5.扇区V

在这里插入图片描述

6.扇区VI

在这里插入图片描述

7.In a word

在这里插入图片描述
对于CNT向上计数,PWM2模式:.

扇区sectorIIIIIIIVVVI
CCR1TaTbTcTcTbTa
CCR2TbTaTaTbTcTc
CCR3TcTcTbTaTaTb

【拓展】
CNT向上计数,PWM模式1?
在这里插入图片描述

CNT向下计数,PWM模式1?
在这里插入图片描述

CNT向下计数,PWM模式2?
在这里插入图片描述

这里留给读者自行推理,只要明白了例子,很快就能理解CCRx在不同模式下正确的赋值

七、Simulink编程仿真

总封装:
在这里插入图片描述
点进去里面,逐一分析。

1. 输入与输出

需要的输入
SVPWM的输入是反Park变换中得到的 Vα和Vβ,这两个是最关键的。
次之从我们的公共乘积因子K可知,我们需要输入母线的电压 Udc .
最后,输入我们希望生成的调制波频率 f_PWM .
我们得到的输出
三路输出比较寄存器CCRx的值
扇区
这样,Simulink中Svpwm模组中的函数function就已经确定了:
在这里插入图片描述
假如我们要求中心对称PWM对的频率是8K,那么他非中心对称的PWM(单路PWM)的频率就是2 * f_PWM,那么,中心对称的PWM到达中点的时间周期就是1/(2 * f_PWM);

2. MATLAB编程

采用载波向上计数,PWM模式2的思想进行搭建,编程。

%4个输入,4个输出
function [Tcm1,Tcm2,Tcm3,sector] = fcn( U_alpha,U_beta,U_dc,PWM_Freq)%输出参数初始化
sector=0;
Tcm1=0;
Tcm2=0;
Tcm3=0;%PWM采用中心对齐
%为了避免值过小,默认使用PWM频率的两倍作为载波值
%假如我们希望中心对称PWM的频率是8K,那么他对应的单路PWM频率应该是16K
%所以我们载波CNT的计数最大值是16K
Ts=PWM_Freq;
sqrt_3=sqrt(3);%判断扇区部分(需要强制类型转换为浮点型)
U1=double(U_beta);
U2=double(sqrt_3*0.5*U_alpha-U_beta*0.5);
U3=double(-sqrt_3*0.5*U_alpha-U_beta*0.5);
%获得对应布尔值
if U1>0A=1;
elseA=0;
endif U2>0B=1;
elseB=0;
endif U3>0C=1;
elseC=0;
endN=4*C+2*B+A;
%根据N的公式结果判断扇区
switch Ncase 3sector=1;case 1sector=2;case 5sector=3;case 4sector=4;case 6sector=5;case 2sector=6;
end
%不同扇区不同矢量的作用时间计算
K=sqrt_3*Ts/U_dc;%公共乘积因子
switch (sector)case 1Tx=K*U2;Ty=K*U1;case 2Tx=-K*U2;Ty=-K*U3;case 3Tx=K*U1;Ty=K*U3;case 4Tx=-K*U1;Ty=-K*U2;case 5Tx=K*U3;Ty=K*U2;case 6Tx=-K*U3;Ty=-K*U1;otherwiseTx=0;Ty=0;
end
%过调制算法
if (Tx+Ty)>TsTx=Ts*Tx/(Tx+Ty);Ty=Ts*Ty/(Tx+Ty);
elseTx=Tx;Ty=Ty;
end
%零矢量总作用时间的二分之一,也就是T0和T7的值
T0=(Ts-Tx-Ty)*0.5;
%见六中的总结
Ta=T0*0.5;      %先跳转的PWM对的输出比较值
Tb=Ta+0.5*Tx;   %后跳转的PWM对的输出比较值
Tc=Tb+0.5*Ty;   %最后跳转的PWM对的输出比较值%根据六中的扇区情况,赋值三路PWM对的输出比较值
switch sectorcase 1Tcm1=Ta;Tcm2=Tb;Tcm3=Tc;case 2Tcm1=Tb;Tcm2=Ta;Tcm3=Tc;case 3Tcm1=Tc;Tcm2=Ta;Tcm3=Tb;case 4Tcm1=Tc;Tcm2=Tb;Tcm3=Ta;case 5Tcm1=Tb;Tcm2=Tc;Tcm3=Ta;case 6Tcm1=Ta;Tcm2=Tc;Tcm3=Tb;
end
end

3. 利用SVPWM算法的输出搭建中心对称且互补的PWM生成器

总图:
在这里插入图片描述
需要的输入
三路输出比较寄存器CCRx的值
模拟CNT计数的三角波作为载波
获得的输出
三路互补且中心对称的PWM波,用于控制开关管

寻找载波模块:
在这里插入图片描述
拖出来,双击调整参数:
在这里插入图片描述

载波从0到1/(2 * f_PWM)时间,到达最大的计数值f_PWM。对应的是中心对称PWM周期的时间中点,即0.5Ts。
笔者这里使用数字量去代表时间,数字量拟用PWM频率代替,比如8K的PWM频率,它的Ts=2
PWM_Freq,那么它的时间中点就是f_PWM,这个也类似STM32的重装载值(最大65535);

点进PWM Generator
以下是笔者搭建的内容
在这里插入图片描述

4.仿真结果与波形

黄色表示A相
绿色表示B相
蓝色表示C相
CCRx的波形是马鞍波,而调制波直接输出到PMSM电机的三端上,所以端电压(端对地GND的电压,不是相电压)也是马鞍波!
在这里插入图片描述
中心对称的PWM对,作用在相上,会使用数字正弦波来等效模拟正弦波;
当然这个仿真可以通过CCRx的值作处理来获得,使用以下公式:

Un_A=double(Udc/3*(2*PWM_a-PWM_b-PWM_c));
Un_B=double(Udc/3*(2*PWM_b-PWM_a-PWM_c));
Un_C=double(Udc/3*(2*PWM_c-PWM_a-PWM_b));

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这种数字正弦波,作用在电机上,感性负载的电流惯性,使电机产生与数字正弦波电压有一定相角差的正弦电流,同时三相的电流也是120°对称的。因为是数字正弦波,在正弦电流上我们可以看到一丝丝纹波,这是正常的。
作用在电机上的相电流:
在这里插入图片描述


http://chatgpt.dhexx.cn/article/ihmVREFX.shtml

相关文章

STM32-定时器中断实验

一、通用定时器基本原理 1-1 三种定时器区别 1.三种STM32定时器区别 定时器种类位数计数器模式产生DMA请求捕获/比较通道互补输出特殊应用场景高级定时器&#xff08;TIM1,TIM8&#xff09;16向上&#xff0c;向下&#xff0c;向上/下可以4有带死区控制盒紧急刹车&#xff0…

CRC校验

一、CRC原理。 CRC校验的原理非常简单&#xff0c;如下图所示。 其中&#xff0c;生成多项式是利用抽象代数的一些规则推导出来的&#xff0c;而模2加&#xff08;也就是异或&#xff09;&#xff0c;是对应于有限域的除法。 二、CRC算法。 那么在FPGA当中&#xff0c;也有好…

CRC-16

文章目录 A.1 CRC16 算法A.1.1 CRC16 算法参数设置A.1.2 LengthA.1.3 CounterA.1.4 Data IDA.1.5 CRCA.1.6 CRC16 算法示例A.1.7 CRC16 算法推荐(查表法)A.1.8 CRC16 实例(查表法) A.1 CRC16 算法 A.1.1 CRC16 算法参数设置 CRC16 算法中要求了 Counter、Data ID、CRC 等参数…

CCR

不用任何与创建线程、资源互斥有关系的API写多线程程序 这次的例子&#xff0c;是一个很简单的控制台&#xff0c;她将面对瞬间提交的百万的数据&#xff0c;而面不改色&#xff08;CPU、内存非常平稳&#xff09;&#xff0c;队列中始终只保存最新的数据&#xff0c;每次只处理…

CRC16

CRC选择 当数据帧长度在8bits-128bits范围内时&#xff0c;推荐CRC-8(CRC-8能够减少额外比特的开销&#xff0c;且有更好的性能表现) 当数据帧长度在128bits-2048bits范围内时&#xff0c;推荐CRC-12&#xff0c;CRC-16&#xff0c;CRC-CCITT(CRC-12额外比特的开销更小&#x…

stm32cubemx HAL库之定时器

定时器原理简单说明&#xff1a; 如上图所示&#xff0c;定时器存在3个寄存器&#xff0c;分别是&#xff1a; 计数器寄存器&#xff08;CNT&#xff09; 预分频器寄存器&#xff08;PSC&#xff09; 自动重载寄存器&#xff08;ARR&#xff09; 预分频寄存器的输入频率是时钟…

CRC详解

CRC-知识解析 cyclic redundancy check 写在前面的话&#xff1a; 之前在做学校项目的时候用到了CRC 原理&#xff0c;但在网上查找的过程中&#xff0c;发现讲解CRC知识的资源很多&#xff0c;但是对新手比较友好的、讲的十分清楚的又很少&#xff0c;很多博主也不求甚解&am…

CCR(Condition Code Register:条件代码寄存器)的作用

CCR是一个显示执行指令后的结果和处理器的状态的8位寄存器。根据微型计算机的不同&#xff0c;名称也会不同&#xff0c;但是所有的微型计算机都有。在大多数微型计算机的情况下&#xff0c;用户不能直接读写&#xff0c;但有些微型计算机可以读写。您可以通过执行可以测试CCR位…

STM32定时器的预装寄存器及影子寄存器PSC—ARR-CCRx

在谈预装寄存器及影子寄存器的差别前&#xff0c;不妨先对STM32定时器的时基单元做个基本了解。STM32各系列的定时器结构和框架基本是一样的&#xff0c;时基单元也一样。 下面时基单元是以STM32F3系列为参考。 时基单元中的TIMx_PSC、 TIM_ARR两个寄存器加上捕捉比较模块中TIM…

输出比较功能中的pwm以及其他功能的区分

首先我们要知道的是pwm是输出比较的子集 PWM模式下&#xff1a; ARR 决定输出频率 &#xff0c;CCR决定输出占空比 输出比较模式下&#xff1a; ARR 决定输出频率 CCRx 决定每个通道的初始相位。 一般使用输出比较都是想要去输出一个频率可变的pwm信号&#xff0c;那怎么通过…

STM32 PWM输出

STM32 PWM输出 工作过程&#xff1a; 我们假定定时器工作在向上计数PWM 模式&#xff0c;且当 CNT<CCRx 时&#xff0c;输出 0&#xff0c;当 CNT>CCRx 时输出1。那么就可以得到如上的PWM 示意图&#xff1a; 当 CNT 值小于 CCRx 的时候&#xff0c;IO 输出低电平(0)&a…

简单明了的说明STM32的PWM原理以及实现方法

申明以下都是个人理解&#xff0c;仅供参考。如果错误欢迎指教。本文不讲底层&#xff0c;根据实际使用来逆向讲解。 1.什么是pwm&#xff1f; pwm最简单的理解就是“功率”&#xff0c;调节PWM的占空比就是调节功率。 2.如何调节占空比&#xff1f; 图1 根据图1很容易看出…

CCRX寄存器

TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Disable);// TIMx_CCRx寄存器能够在任何时候通过软件进行更新以控制输出波形&#xff0c;条件是未使用预装载寄存器(OCxPE’0’&#xff0c;否则TIMx_CCRx影子寄存器只能在发生下一次更新事件时被更新)。这里设置为Disable 就是为了…

JavaScript权威指南 第13章 异步JavaScript

JavaScript权威指南 第13章 异步JavaScript 13章 异步JavaScript13.1 使用回调的异步编程13.1.1 定时器13.1.2 事件13.1.3 网络事件13.1.4 Node中的回调与事件 13.2 期约13.2.1 使用期约使用期约处理错误 13.2.2 期约链13.2.2 解决期约13.2.4 再谈期约和错误catch和finally方法…

javascript权威指南(第四版)

Java Script是一种功能强大的基于对象的脚本语言。Java Script程序可以直接嵌入HTML页面。与Web浏览器定义的文档对象模型(DOM)一起使用时&#xff0c;JavaScript可以创建动态HTML(DHTML)内容&#xff0c;允许用户与客户端的Web应用程序交互。 JavaScript语法以流行的程序设计语…

《JavaScript权威指南》学习笔记(一)

跟着《JavaScript权威指南》整理的一些知识点和自己的小拓展。有不足之处请指正。 1、try catch 防止程序异常直接报错退出&#xff0c;而是能对异常进行一些处理&#xff0c;具体处理就在catch中。最好是在最外层函数使用。 2、HTML不区分大小写、XHTML区分大小写、JavaScri…

《javascript权威指南》精读笔记-持续更新

《javascript权威指南》 作用域链 表达式 原始表达式 对象和数组的初始化表达式 函数定义表达式 函数直接量 属性访问表达式 调用表达式 对象创建表达式 运算符 表达式计算 var function for in with debugger use strict 对象 创建对象 属性的查询和设置 作为关联数组的对象 继…

JavaScript权威指南(第6版)

JavaScript权威指南&#xff08;第6版&#xff09; JavaScript权威指南 第6版&#xff08;影印版&#xff09;上册 Beginning iOS Programming, 2014年 Gradle for Android (2016年3月 Finished)

JavaScript权威指南 第11章JavaScript标准库

JavaScript权威指南 第11章JavaScript标准库 第11章 JavaScript标准库11.1 集合与映射11.1.1 Set类11.1.2 Map类11.1.3 WeakMap和WeakSet 11.2 定型数组与二进制数据11.2.1 定型数组的类型11.2.2 创建定型数组11.2.3 使用定型数组11.2.4 定型数组的方法与属性11.2.5 DateView与…

JavaScript 权威指南-学习笔记(一)

本文所有教程及源码、软件仅为技术研究。不涉及计算机信息系统功能的删除、修改、增加、干扰,更不会影响计算机信息系统的正常运行。不得将代码用于非法用途,如侵立删!JavaScript 权威指南-学习笔记 JavaScript是一门高级、动态、解释型变成语言,非常适合面向对象和函数式编…