SimpleFOC(八)—— 理论+实践 深度分析SVPWM
目录
- 说明
- 一、有感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控制原理
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、硬件准备
序号 | 名称 | 数量 |
---|---|---|
1 | Arduino UNO | 1 |
2 | simpleFOCShield V2.0.3 | 1 |
3 | 云台电机 | 1 |
4 | 12V电源 | 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(九)—— 霍尔电机控制
SimpleFOC(八)—— 理论+实践 深度分析SVPWM相关推荐
- 领域驱动实践总结(基本理论总结与分析+架构分析与代码设计+具体应用设计分析V)
目录 领域驱动实践总结三:具体应用设计分析 一.应用项目的基本背景 二.针对项目进行领域驱动的战略设计阶段 (一)事件风暴确定产品愿景 (二)事件风暴进行业务场景分析 场景分析一:请假 用 ...
- 领域驱动实践总结(基本理论总结与分析V+架构分析与代码设计+具体应用设计分析)
目录 领域驱动实践总结一:基本理论总结与分析 一.领域驱动设计两大设计:战略设计和战术设计 (一)战略设计 1.出发角度与目标 2.实现方式:事件风暴与模型确立(用例分析.场景分析和用户旅程分析) 3 ...
- 最新最全的免费股票数据接口--沪深A股深度分析投资参考数据API接口(八)
深度分析数据API文档 数据来源:麦蕊智数 请求方式:Get(直接在浏览器打开就可以看到返回的数据) 数据格式:标准Json格式[{},...{}] 数据时效:实时更新 API说明文档:https:/ ...
- 查看队列深度_不为人知的网络编程(十一):从底层入手,深度分析TCP连接耗时的秘密...
" 本文作者张彦飞,原题"聊聊TCP连接耗时的那些事儿",本次收录已征得作者同意,转载请联系作者.即时通讯网收录时有少许改动.本文已同步发布于52im社区:http:// ...
- 超越“虚拟的美丽”——云计算实践再分析
超越"虚拟的美丽"--云计算实践再分析 2012-05-31 16:02 | 3491次阅读 | [已有11条评论]发表评论 来源:CSDN | 作者:李德毅 | 收藏到我的网摘 ...
- 05.数据的深度分析(数据挖掘、机器学习)--《数据科学概论》
前言:基于人大的<数据科学概论>第五章,数据的深度分析(数据挖掘.机器学习).主要是机器学习与数据挖掘.具体的算法.主流工具.特征选择的内容. 文章目录 一.机器学习与数据挖掘 (1)什么 ...
- 飞桨PaddlePaddle-百度架构师手把手带你零基础实践深度学习——21日学习总结
飞桨PaddlePaddle-百度架构师手把手带你零基础实践深度学习--21日学习总结 写在前面的话 纯新手小白,第一次接触深度学习方面的应用.感谢飞桨提供的这次学习机会.之前有学习到深度学习的理论方 ...
- 自然语言理解理论实践-主要的语言理解任务(一)《个人学习笔记》
自然语言理解理论实践 主要的语言理解任务 1.域检测和意图识别 2.填槽 希望能多多交流,共同学习进步 主要的语言理解任务 首先,以介绍人机对话系统中使用语言理解为目标任务,进行之后的理论和实践背景的 ...
- 【信息科学技术与创新】情绪智能的扩展分析与总结 情绪概念及其模型 结合神经生物学对情绪智能深度分析 情绪智能对个人发展所能做的贡献及其提高方法
情绪智能的扩展分析与总结 摘要 首先对情绪概念及其模型作再度的深入探究 接着结合情绪会改变我们看待世界和理解他人行为的方式以及神经生物学对情绪智能深度分析 最后总结思考情绪智能在未被充分科学验证的情况 ...
- 推荐系统[八]算法实践总结V0:淘宝逛逛and阿里飞猪个性化推荐:召回算法实践总结【冷启动召回、复购召回、用户行为召回等算法实战】
搜索推荐系统专栏简介:搜索推荐全流程讲解(召回粗排精排重排混排).系统架构.常见问题.算法项目实战总结.技术细节以及项目实战(含码源) 专栏详细介绍:搜索推荐系统专栏简介:搜索推荐全流程讲解(召回粗排 ...
最新文章
- 二叉树中和为某一值的路径
- 利用puppeteer自动录入成绩
- Java web 开发的概念、环境配置、创建项目过程详解(Eclipse)
- 滚动焦点图实现原理和实践[原创视频]
- Word2019上面的MathType7.4插件忽然消失了【终极解决办法记录】
- endnote修改正文中参考文献标注_请问endnote里,如何把正文中插入参考文献处的格式由数字转为(作者,年份)?感恩!...
- arp 华为 查看 路由器_华为路由器运行状态查看-路由器
- elasticsearch数据备份还原
- nlp-tutorial代码注释3-1,RNN简介
- 基于qt的贪吃蛇游戏 c语言,基于QT的贪吃蛇游戏设计
- JS生成uuid的四种方法
- iterm2 + oh my zsh 实现 macOS X 下炫酷终端
- 鲸探发布点评:9月21日发售高分一号、七号卫星数字藏品
- 51单片机_7-1独立按键控制流水灯方向
- 获取淘宝/天猫购买到商品的订单详情——buyer_order_detail
- iOS---学习研究大牛Git高星项目YYCategories(三)
- 解析个人数据云存储:云服务商的责任
- 上海发布通知:年底前全面清退不符条件的网约车车辆和驾驶员
- java mysql geometry,扩展mybatis和通用mapper,支持mysql的geometry类型字段,mybatis用mapper...
- c语言两个for语句并列执行_c语言中for循环 和嵌套for循环
热门文章
- c语言sqrt函数无作用,如何在不使用C语言的sqrt函数的情况下获得数字的平方根...
- 湖北省软件行业协会会员单位全名录(2014年的信息)
- 如何将优酷独享视频kux格式转换成mp4视频
- PostSQL | Debug记录
- cmos和ttl_TTL与CMOS详细介绍
- Matlab里DTW算法和图像
- linux grub 分辨率,修改grub分辨率
- Android 文本监听接口TextWatcher详解
- POJ 2525 Text Formalization 笔记
- 安装delphi 10.4 社区版