编者:沉尸 (5912129@qq.com)
一)ST马达库中角度的定义
引言:
在Clerke以及park等变换中,我们都涉及到了角度,本文中我们结合ST的源代码探讨一下角度的取得以及它和力矩的关系问题。
首先回顾《马达控制之FOC原理》一文中的的数学模型
https://blog.csdn.net/danger/article/details/128214441

三相电流中Ia达到幅值的最高峰时,它的反电动势也就是最大值,于是:电机A相的反电动势最高点就是电角度的0度
在实际运行中进行测量反电动势然后判断是否到达最大值,而且ADC采样还存在不稳定性,所以几乎是不可能完成的任务,本文建立在系统采用了Hall传感器,所以我们可以在实验环境下提前测试出Hall中H1和A相反电动势之间的角度差,而在软件运行过程中可以检测到Hall的IO口线跳变中断,于是,在每次Hall跳变中就可以进行电角度的“校准”了。注意这里说的是“校准”!在两个Hall状态变化的中间过程中,角度的计算是依靠目前的“电角度速度”和“经过的时间”进行估算的,直到遇到了一次Hall相变,于是就可以“校准”电角度了。
ST源代码定义:电机Hall A的上升沿到电机A相反电动势最高点的延迟角度为同步电角度
换一种说法: “从电机A相反电动势最高点”再经过同步电角度就会遇到“电机Hall A的上升沿”
下面节选文档“电机控制同步电角度测试说明.pdf”中部分内容

上图中如果周期为T, 那么同步电角度就是:(T-delay) * 360 / T
再贴出文档“电机控制同步电角度测试说明.pdf”中一个计算电角度的例子:

野火BLDC电机在workbench中的配置:

生成的ST马达库源代码对应的设置部分:

因为Hall的三个传感器每个跳变时,角度都相差60度,于是在每种Hall状态机的跳变都可以进行校准电角度了

下面剖析一下源代码


可以画出对应的Hall时序图:

运行过程中Hall传感器是贴在定子上的保持不动的,显然图中的Hall波形是转子逆时针旋转时输出的波形。
分析源代码:

图9
对于源代码行“Line 551”和“Line 555”中设置的方向,正方向“POSITIVE”就对应上图模型中的逆时针方向了,因为对应着:
“状态4” ==> “状态5”
源代码中“Line 552”和“Line 556”设置角度,看下面的图示

于是可知:

表格1中仅仅列出2行,后面就不再列出,对着图10,后面的就自然很容易写出来,然后分析源代码就很简单了!
我们上面所述都是在中断中(Hall状态机的变化时刻)进行电角度的校正,而在任意时刻,进行FOC计算的时候,目前的电角度需要通过当前的平均电角度速度和经过的时间间隙相乘获得,具体参看源代码,比较容易理解,这里不再赘述,也许后续我会单独写一篇小文章详细描述一下这段源代码。
二)两种q-d轴数学模型的比较
park变换中q-d轴的数学模型目前有两种,《马达控制之FOC原理.docx》中公式的推导采用的是如下图11,而ST马达库中采用的是图12



三)ST马达库中电角度的计算(Hall传感器)
3.1)注意程序中的两个变量的功能
pHandle->MeasuredElAngle 测量电角度
是真正的标杆角度, 每次Hall边沿触发都会准确地"校准"它,然后在执行频率=16KHz的FOC运算之前、在函数“HALL_CalcElAngle()”中根据平均速度来累加修正它;
pHandle->_Super.hElAngle 实时电角度
进行系列公式运算(Clerke、park等)时的角度,这个角度要永远跟随着“pHandle->MeasuredElAngle”,每次计算平均速度时(函数:HALL_CalcAvrgMecSpeedUnit(),调用频率=500Hz),都要计算出“pHandle->MeasuredElAngle”和“pHandle->_Super.hElAngle”之间的偏差,然后在函数“HALL_CalcElAngle()”中一步一步、平滑地将这个值进行补偿,最后让角度“pHandle->_Super.hElAngle”跟上“pHandle->MeasuredElAngle”。
pHandle->_Super.hElSpeedDpp
两次FOC运算间隔的时间段内(1/16K),转动的角度值,以s16degree表示
3.2)如果有偏差,为什么不让“pHandle->_Super.hElAngle” 直接一步跟上“pHandle->MeasuredElAngle”?
因为程序需要让合成的矢量的圆周运动保持尽量平滑转动,一步跟上的话,矢量圆的转动角度就不那么平滑了!
3.3)几个函数
3.3.1)HALL_CalcElAngle()
这个函数用来更新“测量角度”和“实时电角度”:

3.3.2) HALL_CalcAvrgMecSpeedUnit()
计算出平均电角速度,也就是两次FOC运算间隔的时间段内(1/16K),转动的角度值,以s16degree表示
这里贴出做了详细注解的代码:



3.3.3)HALL_TIMx_CC_IRQHandler()
Hall信号捕获中断的处理







3.3.4)运算中用到了变量“pHandle->PseudoFreqConv”和“pHandle->PWMNbrPSamplingFreq”的推导
这两个变量的初始化:

详细的描述:

/*
如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby
在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
我的主要目标是能够完全理解我正在使用的库/gem。我尝试在Github上从头到尾阅读源代码,但这真的很难。我认为更有趣、更温和的踏脚石就是在使用时阅读每个库/gem方法的源代码。例如,我想知道RubyonRails中的redirect_to方法是如何工作的:如何查找redirect_to方法的源代码?我知道在pry中我可以执行类似show-methodmethod的操作,但我如何才能对Rails框架中的方法执行此操作?您对我如何更好地理解Gem及其API有什么建议吗?仅仅阅读源代码似乎真的很难,尤其是对于框架。谢谢! 最佳答案 Ru
我的假设是moduleAmoduleBendend和moduleA::Bend是一样的。我能够从thisblog找到解决方案,thisSOthread和andthisSOthread.为什么以及什么时候应该更喜欢紧凑语法A::B而不是另一个,因为它显然有一个缺点?我有一种直觉,它可能与性能有关,因为在更多命名空间中查找常量需要更多计算。但是我无法通过对普通类进行基准测试来验证这一点。 最佳答案 这两种写作方法经常被混淆。首先要说的是,据我所知,没有可衡量的性能差异。(在下面的书面示例中不断查找)最明显的区别,可能也是最著名的,是你的
几个月前,我读了一篇关于rubygem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:
我目前正在使用以下方法获取页面的源代码:Net::HTTP.get(URI.parse(page.url))我还想获取HTTP状态,而无需发出第二个请求。有没有办法用另一种方法做到这一点?我一直在查看文档,但似乎找不到我要找的东西。 最佳答案 在我看来,除非您需要一些真正的低级访问或控制,否则最好使用Ruby的内置Open::URI模块:require'open-uri'io=open('http://www.example.org/')#=>#body=io.read[0,50]#=>"["200","OK"]io.base_ur
前言作为一名程序员,自己的本质工作就是做程序开发,那么程序开发的时候最直接的体现就是代码,检验一个程序员技术水平的一个核心环节就是开发时候的代码能力。众所周知,程序开发的水平提升是一个循序渐进的过程,每一位程序员都是从“菜鸟”变成“大神”的,所以程序员在程序开发过程中的代码能力也是根据平时开发中的业务实践来积累和提升的。提高代码能力核心要素程序员要想提高自身代码能力,尤其是新晋程序员的代码能力有很大的提升空间的时候,需要针对性的去提高自己的代码能力。提高代码能力其实有几个比较关键的点,只要把握住这些方面,就能很好的、快速的提高自己的一部分代码能力。1、多去阅读开源项目,如有机会可以亲自参与开源
嗨~大家好,这里是可莉!今天给大家带来的是7个C语言的经典基础代码~那一起往下看下去把【程序一】打印100到200之间的素数#includeintmain(){ inti; for(i=100;i 【程序二】输出乘法口诀表#includeintmain(){inti;for(i=1;i 【程序三】判断1000年---2000年之间的闰年#includeintmain(){intyear;for(year=1000;year 【程序四】给定两个整形变量的值,将两个值的内容进行交换。这里提供两种方法来进行交换,第一种为创建临时变量来进行交换,第二种是不创建临时变量而直接进行交换。1.创建临时变量来
文章目录1.开发板选择*用到的资源2.串口通信(个人理解)3.代码分析(注释比较详细)1.主函数2.串口1配置3.串口2配置以及中断函数4.注意问题5.源码链接1.开发板选择我用的是STM32F103RCT6的板子,不过代码大概在F103系列的板子上都可以运行,我试过在野火103的霸道板上也可以,主要看一下串口对应的引脚一不一样就行了,不一样的就更改一下。*用到的资源keil5软件这里用到了两个串口资源,采集数据一个,串口通信一个,板子对应引脚如下:串口1,TX:PA9,RX:PA10串口2,TX:PA2,RX:PA32.串口通信(个人理解)我就从串口采集传感器数据这个过程说一下我自己的理解,
文章目录git常用命令(简介,详细参数往下看)Git提交代码步骤gitpullgitstatusgitaddgitcommitgitpushgit代码冲突合并问题方法一:放弃本地代码方法二:合并代码常用命令以及详细参数gitadd将文件添加到仓库:gitdiff比较文件异同gitlog查看历史记录gitreset代码回滚版本库相关操作远程仓库相关操作分支相关操作创建分支查看分支:gitbranch合并分支:gitmerge删除分支:gitbranch-ddev查看分支合并图:gitlog–graph–pretty=oneline–abbrev-commit撤消某次提交git用户名密码相关配置g