SimpleFOC(八)—— 理论+实践 深度分析SVPWM

article/2025/10/18 21:02:00

目录

  • 说明
  • 一、有感FOC控制原理
  • 二、SVPWM原理
  • 三、SimpleFOC(不带电流采样)的控制原理:
  • 四、SimpleFOC核心代码
  • 五、代码实验
    • 5.1、实验目的
    • 5.2、硬件准备
    • 5.3、修改代码 第一阶段
      • 5.3.1 打开例程
      • 5.3.2 修改代码
      • 5.3.3 验证上传
      • 5.3.4 电机观测
      • 5.3.5 修改力矩
      • 5.3.6 修改转速
    • 5.4、修改代码 第二阶段
      • 5.4.1 修改代码
      • 5.4.2 验证上传
      • 5.4.3 电机观测
      • 5.4.4 串口操作
      • 5.4.5 观察三相波形

SimpleFOC的教程比较多,做了一个总的链接,欢迎点击阅读:SimpleFOC教程链接汇总

说明

  SimpleFOC的基本操作在前几节都已经演示过了,虽然还有很多没演示的例程,但是触类旁通,仔细琢磨下难度不大。
  网上关于FOC和SVPWM的文章很多,但大都偏理论,最多用matlab验证下,本文通过程序演示验证SVPWM算法,有助于对理论的理解。对理论没兴趣的同学可以跳过。

一、有感FOC控制原理

有感foc控制原理
1、测量电机三相定子电流,可得到Ia 和Ib。将三相电流通过Clark变换至两相电流Iα和Iβ ,
2、按照控制环上一次迭代计算出的电机角度, 通过Park变换得到旋转坐标系下相互正交的电流Id和Iq,
3、Id、Iq与设定值进行比较得到电流环PI控制器的输入。调节PI控制器的参数,得到Vd 和Vq ,即要施加到电机上的电压矢量,
4、通过位置传感器得到新的电机位置,从而得到新的角度和转速。新的电机角度可告知 FOC算法下一个电压矢量在何处,
5、通过使用新的电机角度,Vd 和Vq经过Park逆变换产生下一个正交电压值Vα、Vβ,
6、采用SVPWM算法判定其合成的电压矢量位于哪个扇区,计算出三相各桥臂开关管的导通时间,最后经过三相逆变器驱动模块输出电机所需的三相电压。

二、SVPWM原理

  由三相功率逆变器的六个功率开关元件组成的特定开关模式产生的脉宽调制波,能够使电机电流波形尽可能接近于理想的正弦波形。
  请看下面这两片文章:
《SVPWM算法原理及详解》https://blog.csdn.net/qlexcel/article/details/74787619,
《SVPWM分析、各个扇区详细计算以及Matlab仿真》https://blog.csdn.net/michaelf/article/details/94013805,
  推导的结果是一样的,
在这里插入图片描述
在这里插入图片描述
  实际上大部分文章的SVPWM的算法结果都是这样。我觉得这个结果主要是针对无感FOC的算法,无感FOC需要根据Vα和Vβ来确定扇区和角度,但是对于有位置传感器,特别是有编码器的电机来说可以直接获取角度,上面的推导计算过头了。

三、SimpleFOC(不带电流采样)的控制原理:

在这里插入图片描述
  首先去掉了电流采样,所以简单了很多,有位置传感器,所以不用观测器估算位置。对空间矢量作用时间可以直接利用下面的公式(这些公式来自《SVPWM分析、各个扇区详细计算以及Matlab仿真》算法推导的中间状态,《SVPWM算法原理及详解》只写了第一个扇区):
在这里插入图片描述
对照矢量图,可以总结如下:
在这里插入图片描述
Udc表示电源电压(在代码中是voltage_limit),Uref表示设置的力矩大小(在代码中是target_voltage),Ts表示PWM周期(代码中没有把Ts体现出来,代码中的T1、T2是周期的百分比)。
  

四、SimpleFOC核心代码

  在simpleFOC工程中,先来看下被创作者称之为核心的代码(代码路径: …\Arduino-FOC-minimal\library_source\ BLDCMotor.cpp)
在这里插入图片描述
  输入变量Uq、Ud和角度θ,计算出3路PWM占空比。对照上面的SimpleFOC原理框图,一个函数基本就把主要工作做完了,确实是核心。
  

五、代码实验

5.1、实验目的

  通过设置不同的Ud和θ角度实现不同的波形输出,并将三相输出波形与SVPWM的理论波形做对比。
  本实验分两个阶段来完成,第一阶段先直观感受下SVPWM参数对电机运转的影响,第二阶段电机三相输出波形与理论做对比。

5.2、硬件准备

序号名称数量
1Arduino UNO1
2simpleFOCShield V2.0.31
3云台电机1
412V电源1
5方口USB线1

在这里插入图片描述
按照开环模式连接
在这里插入图片描述
  

5.3、修改代码 第一阶段

5.3.1 打开例程

在这里插入图片描述

5.3.2 修改代码

  simpleFOC工程以库的形式安装到Arduino中,不能修改底层代码,所以只能把代码复制出来,以子程序的形式放到当前程序中。之所以选择standalone例程,是因为这个例程比较简单,而且本身就是演示矢量控制的。
  ①、增加SVPWM算法的子程序
  ②、loop循环中调用子程序
  例程为只读文件,可以验证上传,如需保存要“另存为”。
在这里插入图片描述
SVPWM子程序(为了让代码看起来更简洁,所以程序中没有约束条件,参数设置一定要按要求范围输入):

void setPhaseVoltage(float Uq, float Ud, float angle_el) {int sector = (angle_el / _PI_3) + 1;    // find the sector we are in currentlyfloat T1 = _SQRT3*_sin(sector*_PI_3 - angle_el) * Uq/driver.voltage_limit;float T2 = _SQRT3*_sin(angle_el - (sector-1)*_PI_3) * Uq/driver.voltage_limit;float T0 = 1 - T1 - T2;float Ta,Tb,Tc; switch(sector){case 1:Ta = T1 + T2 + T0/2;Tb = T2 + T0/2;Tc = T0/2;break;case 2:Ta = T1 +  T0/2;Tb = T1 + T2 + T0/2;Tc = T0/2;break;case 3:Ta = T0/2;Tb = T1 + T2 + T0/2;Tc = T2 + T0/2;break;case 4:Ta = T0/2;Tb = T1+ T0/2;Tc = T1 + T2 + T0/2;break;case 5:Ta = T2 + T0/2;Tb = T0/2;Tc = T1 + T2 + T0/2;break;case 6:Ta = T1 + T2 + T0/2;Tb = T0/2;Tc = T1 + T0/2;break;default:  // possible error stateTa = 0;Tb = 0;Tc = 0;}// calculate the phase voltages and centerfloat Ua = Ta*driver.voltage_limit;float Ub = Tb*driver.voltage_limit;float Uc = Tc*driver.voltage_limit;driver.setPwm(Ua,Ub,Uc);
}

5.3.3 验证上传

在这里插入图片描述

5.3.4 电机观测

  上电后电机开始转动,当前的转动方式其实就是开环速度模式。

5.3.5 修改力矩

在这里插入图片描述
  修改Uq值(范围0—6.928),重新验证上传,会发现电机的力矩改变了,如果有万用表会发现电机的工作电流随Uq等比例改变。
在这里插入图片描述

  注意:Uq值设置越大,力矩越大,电流越大,电机发热越严重。

5.3.6 修改转速

在这里插入图片描述
  修改角度增量,重新验证上传,会发现电机的转速改变了,
  注意:增量越大电机转速越快,增量太大电机会因失步变振动。
  

5.4、修改代码 第二阶段

  

5.4.1 修改代码

  在第一阶段程序的基础上,
  ①、增加了串口通信子程序,实现通过串口设置电机的电角度,
  ②、通信程序放入主循环
  ③、角度值由上一节的循环增加变为串口设置。注意为了更加直观,串口设置的角度单位为“度”,所以会有“度”转换为“弧度”的计算。
在这里插入图片描述
串口通信子程序:

void serialReceiveUserCommand() {// a string to hold incoming datastatic String received_chars;while (Serial.available()) {// get the new byte:char inChar = (char)Serial.read();// add it to the string buffer:received_chars += inChar;// end of user inputif (inChar == '\n') {// change the motor targettheta = received_chars.toFloat();Serial.print("Target Angle:");Serial.println(theta);// reset the command bufferreceived_chars = "";}}
}

5.4.2 验证上传

在这里插入图片描述

5.4.3 电机观测

  程序运行后,电机固定在0度位置,类似开环位置模式。

5.4.4 串口操作

  通过串口发送角度值(直接发送数字,范围0—359),电机运动到指定的角度。(此时的角度为电角度,所以电机在一个很小的范围内运动。比如当前用的电机为7对极,电机从0转动到360度,转过了电机的1/7圈。电角度和机械角度的概念请自行百度。)
在这里插入图片描述

5.4.5 观察三相波形

  串口输入角度,示波器查看三相输出波形,并与理论做对比。(示波器只有两个通道,所以三相波形只能通过拼接得到)
在这里插入图片描述
①、30度
在这里插入图片描述

②、90度
在这里插入图片描述

③、150度
在这里插入图片描述

④、210度
在这里插入图片描述

⑤、270度
在这里插入图片描述

⑥、330度
在这里插入图片描述
  
  顺便说下,Arduino UNO 的PWM频率是31.25KHz。16MHz晶振,时钟不分频,PWM模式为相位校正模式(Phase Correct PWM Mode,在STM32中称之为 中央对齐模式),16000/256/2=31.25KHz。
  下面是PWM的配置代码(代码路径:…\Arduino-FOC-minimal\library_source\drivers\hardware_specific\atmega328_mcu)
在这里插入图片描述


  本文涉及理论的部分写的很笼统,存在用词不准确,语句不通顺的问题,请大家不要太纠结,做为一名合格的工程师就是要把科研人员的理论转变为可以落地的代码,理论不是我的强项也不是我的目标。


(完)

欢迎加入simpleFOC技术交流群:923734429 群已满根据提示添加新群 (入群申请写:CSDN)

请继续阅读相关文章:
SimpleFOC(一)—— 简介(附有文件下载链接)
SimpleFOC(二)—— 快速入门 (开环控制)
SimpleFOC(三)—— AS5600角度读取
SimpleFOC(四)—— 闭环控制
SimpleFOC(五)—— 双电机控制
SimpleFOC(六)—— PowerShield和AS5047P
SimpleFOC(七)——STM32(Bluepill)的应用
SimpleFOC(八)—— 理论+实践 深度分析SVPWM
SimpleFOC(九)—— 霍尔电机控制


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

相关文章

matlab查表svpwm,SVPWM的查表生成方式代码

昨天研究了传统的SVPWM生成方法之后 偶然看到了这个东西: 也就是说 SVPWM的占空比-角度的关系可以用分段函数进行表示 这样就简单多了 基本上通过查cos表+判断能避免浮点数运算 下面素程序www 结果输出到3个txt文件中,修改p的值可以算占空比(相电压)或者线电压... /* * SVPW…

svpwm的matlab模型,SVPWM的matlab仿真实现

在仿真之前您必须安装MATLAB7.0或以上版本,必须确保simpowersysm工具箱已被安装,如果以上要求已经达到,那么就可以执行以下步骤了: 步骤1:打开matlab主界面,然后在command window界面中的“>>”旁边输…

SVPWM细节

SVPWM细节 # 原理 通过六个扇区的六个非零矢量进行矢量合成所需电压,但在合成过程中不可避免地会经过零矢量来合成,从而降低开关频率动作次数。 一般过调制的情况下非零矢量作用时间大于载波周期,所以在此过程中只取有效矢量的作用时间之和。…

SVPWM学习

作者寄语:在公众号(浅谈电机控制)中以小文章的形式记录自己学习SVPWM的过程。有时候自学未免出现理解错误的地方,所以烦请学友们批评指正。 如果需要SVPWM模型,关注微信公众号:浅谈电机控制。留下邮箱获取…

单相SVPWM

单相SVPWM逆变技术起源于三相电机调速系统中的三相SVPWM技术,在三相SVPWM调制中由旋转的电压矢量得到旋转的磁场,对电压矢量进行控制从而实现电机调速,其实电压矢量控制的实质是一种逆变过程,故单相SVPWM逐渐被研究并应用于逆变电…

SVPWM

接上一篇文章咱们接着讲讲SVPWM,如果对于PWM和SPWM不是很了解的同学可以看我上一篇文章。电机控制是一门很深得学问,由于时间和精力有限,本文章不会讲解特别深入,在此只是抛砖引玉。 SVPWM原理 SVPWM的全称是空间矢量脉宽调制(Sp…

SVPWM算法理解(一)——基本原理

SVPWM算法理解(一)——基本原理 说明1 SVPWM基本原理1.1 引言1.2 三相电量的空间矢量表示1.3 SPWM与SVPWM比较1.4 问题1:2Udc/3还是Udc? 2 SVPWM算法推导2.1 SVPWM的合成原理2.2 问题2:电压利用率1?2.3 SVP…

SVPWM理论部分

SVPWM理论部分 简述1、基本原理2、SVPWM控制2.1 扇区判断(根据$\alpha\beta$为方便判断扇区而采取的一种方法)2.2 电压空间矢量合成及作用时间2.3 电压空间矢量作用顺序2.3.1 五段式SVPWM2.3.2 七段式SVPWM 总结 简述 SVPWM,即空间矢量调制&…

SVPWM算法原理及详解

SVPWM算法原理及详解 1.概述 SVPWM是近年发展的一种比较新颖的控制方法,是由三相功率逆变器的六个功率开关元件组成的特定开关模式产生的脉宽调制波,能够使输出电流波形尽可能接近于理想的正弦波形。空间电压矢量PWM与传统的正弦PWM不同,它是…

FOC电机控制之SVPWM原理与实现

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、SVPWM原理二、SVPWM实现方法1. 基本矢量电压:2.扇区判断:3. 计算相邻两个基本矢量电压的作用时间4 .三路PWM占空比计算 算法流程ste…

SVPWM分析、各个扇区详细计算以及Matlab仿真

SVPWM分析以及各个扇区详细计算以及Matlab仿真 说明目的两电平逆变器拓扑空间矢量扇区判断扇区内如何发波?矢量作用时间计算矢量切换时间的计算Simulink仿真/基于Matlab-R2014a版本 说明 第一次发文章,不太会用Markdown,word编辑的公式复制过…

概率统计Python计算:解古典概型问题

假定以 S S S为样本空间的随机试验是一个等概模型,事件 A ⊆ S A\subseteq S A⊆S。若能算得 ∣ S ∣ n |S|n ∣S∣n, ∣ A ∣ m |A|m ∣A∣m,我们知道 P ( A ) m / n P(A)m/n P(A)m/n。我们把这样的计算方法定义成下列的Python函数。 fr…

古典概型

【例1】一部四册的文集按任意次序放到书架上去,问各册自右向左或自左向右恰成 1,2,3,4 的顺序(用 表示)的概率是多少? 解 此随机试验的结果是四本书在书架上的一种放法,而每一…

概率论3——古典概型与二项分布

排列组合 排列组合高中应该就学过,包括两个原理(加法和乘法原理),以及排列和组合 两个原理 加法原理 比如完成某件事有3类途径,在1类中有4种方法,第2类中有2种方法,第3类中有3种方法&#xf…

概率论基础(1)古典和几何概型及事件运算

概率论对于学习 NLP 方向的人,重要性不言而喻。于是我打算从概率论基础篇开始复习,也顺便巩固巩固基础。 1.事件及运算 1.1 文森图及运算 1.2常用运算律 1.3相关练习 理解:要么A要么B要么C发生,所以是A ∪ B ∪ C&#xff…

概率论--古典概型和几何概型

-------------------------------------------几何概型------------------------------------------------------------------ 向某一可度量的区域内任掷一点.如果所掷的点落在中任意子区域内的可能性大小与A的度量(长度,面积和体积等&…

古典概型和几何概型

古典概型(等可能概型) 1.1定义(随机试验模型) ①只有有限个可能 ②每个结果发生的可能性大小相同。 由 1P(S)得 设事件A包含样本空间S中k个基本事件,那么事件A发生的概率为 1.2计算古典概型的方法——排列跟组合 …

古典概型-分房模型

古典概型问题一般从排列组合、乘法原理的角度思考; 回想概率的基本公式:p(A)A事件发生的次数/总的实验次数 (1)k个盒子已经指定了,每次拿一个球放入其中一个盒子 第一问可以理解为:指定的k个盒子中各有一球…

【概率论与数理统计】猴博士 笔记 p1-p2 古典概型、几何概型

视频 古典概型 常见的古典概型题目分为: 有放回无放回 有放回 对于有放回的题目,一般可以这样做: 举个例子,如题: 则它们的答案是: 1. C 4 4 ∗ ( 2 5 ) 4 C_{4}^{4} *&…