jjzjj

Simulink 自动代码生成电机控制:关于无传感控制开环启动控制的仿真和开发板运行

卡洛斯伊 2023-07-21 原文

目录

开环启动原理

开环启动建模实现

开环启动仿真

代码生成和验证

总结


开环启动原理

永磁同步电机开环三步启动是比较传统也是比较常用的启动方式,典型的启动有:

对齐:也说是说的转子预定位,就是通过手动给定一个初始角度和一个初始的Iq,让转子固定在一个初始的位置。负载大Iq就可以给大一些,保证转子初始位置固定。

开环:这里模型仿真用的是IF模式,就是通过给定一个转速目标转速,和开环时间,计算出给定转速的步长,再通过转速计算出给定的角度。通过开环把电机拉到设定的转速。满足一定的条件(如强拉角和估算角误差小于某一个值,估算转速达到某一个值)

闭环:这个环节电机已经切换到估算角控制,且Iq通过速度环输出(恒转速控制)

但是实际应用中强制切换可能会有角度跳变的影响。因此在开环和闭环之间增加了一个切换的状态。在切换过程中强拉角向估算角靠齐达到切换的过程中没有角度突变的情况发生,提高开环启动的性能。由于开环角在切换过程中不断接近真实角,给定的Iq也会在此期间减小,减小范围可根据实际负载进行优化。本方通过建模的方式实现上述功能,并通过实际的电机运行验证生成代码和仿真的可靠性。

开环启动建模实现

如下开环启动过程的建模,通过stateflow构建一个状态机,实现开环启动状态间的切换。

 这里状态机功能比较简单,从待机状态,接收到启动指令后进入对齐状态,对齐时间500ms,对齐给定Iq随着时间的增加慢慢增加直到达到设定值。

 开环状态给定Iq等于对齐状态最终的Iq值,角度通过给定时间和给定的目标转速计算得到

 切换状态,计算出角度误差,根据误差进行开环给定角的补偿,直到开环强拉解接近估算角且观测器的估算速度达到目标切换转速。

开环启动仿真

常规开环启动波形,如下图所示蓝色和黄色是估算角度和实际角度,黄色是开环强拉角度,切换点直接换成了估算角。

切换点角度和相电流波形,可以看到切换的瞬间电角度跳变,相电流也发生了短暂的畸变。另外由于开环给定的Iq固定没有切换过程缓冲,转速瞬间变大。

 优化后的启动过程

蓝色估算,黄色强拉,强拉角靠近估算角

 完整启动过程

启动对齐,电机转子固定。 

 切换点,切换后PI输出控制Iq,转速升高,电流变大。相比于没有切换状态过程的仿真效果,电流没有明显的畸变。电流变大是闭环状态没有达到目标转速2000,速度环控制。

代码生成和验证

模型参数按照实际电机的测量参数建模,暂不需要改参数就可以直接运行

 没有增加切换状态的启动相电流波形,空载启动。

 带载启动(手动加载,负载不均匀)

 增加切换状态,切换点Iq减小

 加负载后,会有Iq减小的过程,切换后速度环会有调节

总结

开环启动也是应用比较广泛的,启动参数的优化需要根据实际负载特性进行优化。有些应用启动到闭环的过程会出现负载变化的情况,也需要根据实际情况进行调整,这里通过仿真记录总结了所使用的方法,并生成代码到开发板运行。另外很多应用考虑启动到闭环过程的平滑度,和速度环PI也有一定的关系。

有关Simulink 自动代码生成电机控制:关于无传感控制开环启动控制的仿真和开发板运行的更多相关文章

  1. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

    总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

  2. ruby - 使用 RubyZip 生成 ZIP 文件时设置压缩级别 - 2

    我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看ruby​​zip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d

  3. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  4. ruby - 如何在 buildr 项目中使用 Ruby 代码? - 2

    如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby​​

  5. ruby-on-rails - Rails 源代码 : initialize hash in a weird way? - 2

    在rails源中:https://github.com/rails/rails/blob/master/activesupport/lib/active_support/lazy_load_hooks.rb可以看到以下内容@load_hooks=Hash.new{|h,k|h[k]=[]}在IRB中,它只是初始化一个空哈希。和做有什么区别@load_hooks=Hash.new 最佳答案 查看rubydocumentationforHashnew→new_hashclicktotogglesourcenew(obj)→new_has

  6. ruby - 如何每月在 Heroku 运行一次 Scheduler 插件? - 2

    在选择我想要运行操作的频率时,唯一的选项是“每天”、“每小时”和“每10分钟”。谢谢!我想为我的Rails3.1应用程序运行调度程序。 最佳答案 这不是一个优雅的解决方案,但您可以安排它每天运行,并在实际开始工作之前检查日期是否为当月的第一天。 关于ruby-如何每月在Heroku运行一次Scheduler插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/8692687/

  7. ruby-on-rails - 如何在 ruby​​ 中使用两个参数异步运行 exe? - 2

    exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby​​中使用两个参数异步运行exe吗?我已经尝试过ruby​​命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何ruby​​gems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除

  8. ruby - 无法运行 Rails 2.x 应用程序 - 2

    我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby​​:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r

  9. ruby - 在 jRuby 中使用 'fork' 生成进程的替代方案? - 2

    在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',

  10. ruby - 如何使用 Ruby aws/s3 Gem 生成安全 URL 以从 s3 下载文件 - 2

    我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A

随机推荐