文章目录

  • 1.前言
  • 2.Clarke变换
  • 3.Park和Rev-Park变换
    • 3.1.不同的坐标系定义
    • 3.2.为什么给-90度电角度就能进行电角度预校准?
      • 3.2.1.电角度定义为d轴和alpha轴的夹角
      • 3.2.2.电角度定义为q轴和alpha轴的夹角

1.前言

​ 如下图所示为ST培训资料的PPT中进行定义的坐标系,图中可以看出和常见的坐标系定义不同的主要有两点:

  • ST定义的beta轴朝下,而常见的定义beta轴是朝上的。这个定义和欧洲人习惯定义y轴朝下有关,这个只会影响Clarke变换,让beta轴的结果和常见的结果差一个负号;
  • ST定义的电角度theta是q轴和alpha轴的夹角,而常见的定义是d轴和alpha轴的夹角。这个会导致Park变换的结果和常见的结果完全相反(交换dq轴),实际上物理效果是一样的。

2.Clarke变换

  1. 已解决:Clarke变换的函数比较容易看明白,问题也不是很大,由于没有涉及到电角度theta,所以结果只是beta轴的结果和常见的结果差一个负号。并且注意ST的Clarke变换中前面×了系数2/3。
  2. 遗留:程序中第41行的问题,为什么要在最小值的地方限幅修改?此时其实并没有溢出,而且这个改动值也很小。
// Clarke变换问题不是很大,主要注意两点:
// 1.Clark变换中前面×了系数2/3
// 2.建立的坐标系alpha和常见的一样,但是beta坐标系是朝下的,所以和一般的结果差一个负号
alphabeta_t mc_clark(ab_t input)
{alphabeta_t output;int32_t a_divSQRT3_tmp, b_divSQRT3_tmp ;int32_t wbeta_tmp;int16_t hbeta_tmp;/* qIalpha = qIas*/output.alpha = input.a;  // 注意这里的clarke变换×了系数2/3a_divSQRT3_tmp = divSQRT_3 * ( int32_t )input.a;b_divSQRT3_tmp = divSQRT_3 * ( int32_t )input.b;/*qIbeta = -(2*qIbs+qIas)/sqrt(3)*/   // 这里是负的,也就是beta轴是朝下的wbeta_tmp = ( -( a_divSQRT3_tmp ) - ( b_divSQRT3_tmp ) -( b_divSQRT3_tmp ) ) >> 15;  // 这里>>15是因为上面是两个Q15格式的数据进行运算,结果是Q30格式,需要重新转换为Q15格式/* Check saturation of Ibeta */if ( wbeta_tmp > INT16_MAX )  // INT16_MAX = 32767{hbeta_tmp = INT16_MAX;}else if ( wbeta_tmp < ( -32768 ) ){hbeta_tmp = ( -32768 );}else{hbeta_tmp = ( int16_t )( wbeta_tmp );}output.beta = hbeta_tmp;// 这里的限幅是干什么的?把-32768限幅成-32767?if ( output.beta == ( int16_t )( -32768 ) ){output.beta = -32767;}return ( output );
}

3.Park和Rev-Park变换

3.1.不同的坐标系定义

​ Park(Rev-Park)变换应该是ST的电机库比较难理解的一点,因为程序的运算结果和常见的推导结果完全相反(交换了dq轴的结果)。这里和1.前言中说的ST的坐标定义有关。有关坐标定义,可以参照 FOC中坐标系和电角度的定义 。

​ 如果按照这个坐标系定义,又会出现一个难以理解的问题,因为常见的电角度定义为d轴和alpha轴的夹角,为什么这里定义为q轴和alpha轴的夹角也可以呢?这样结果不会出错吗?

​ 实际上,解答这个问题还是要从FOC的核心思想上来解答。FOC使用Clarke变换和Park变换是为了什么?就是为了生成超前转子(d轴,注意不论电角度怎么定义,dq轴定义总是不变的)90度的磁场,或者说超前转子90度的电流。那么电角度theta有什么用呢?其实它仅仅是为了指示当前转子在什么方向,从而生成一个超前转子90度的磁场,因为abc轴和alpha/beta轴都是固定的,而只有知道要生成的磁场相对这些固定的坐标轴在什么位置,才能进行在旋转坐标轴和固定坐标轴之间相互转换。所以说,电角度可以随便定义,它可以是q轴和alpha的夹角,也可以是d轴和alpha的夹角,甚至可以是d轴和(alpha轴与beta轴)的角平分线的夹角,因为电角度存在的意义只是为了指示当前转子在什么方向,然后生成一个超前转子90度的磁场,利用电角度,就可以把这个磁场分解到固定的坐标轴上去,然后控制PWM的生成。

​ 那么为什么常见的定义是d轴或者q轴和alpha轴的夹角呢?其实很简单,就是为了Park和反Park变换的方便,因为此时只需要在dq轴和alpha/beta轴之间相互投影即可,而投影的时候×的系数就是theta的三角函数值。由此看来,这个夹角定义成d轴或者q轴和beta轴的夹角也是可以的,它同样方便计算。但是如果定义成和其他轴(比如alpha和beta角平分线)的夹角,那么投影计算的时候就不好算了。

​ 总之记住:**所有的变换最终结果都是为了生成超前转子90度的磁场,而电角度只是为了提供转子的位置,方便磁场在各个坐标系之间进行变换。**这也是FOC的核心思想!

3.2.为什么给-90度电角度就能进行电角度预校准?

​ 参考解答

​ 为什么要进行电角度校准呢?也很简单,因为电机初始停在任意的一个位置,此时磁编码器是有一个读数的(而且极大的概率不是0)。但是从上面常见的坐标系的定义可以直到,电角度的零度是q轴或者d轴与alpha轴对齐的时候定义为电角度0度,此时编码器读出来的角度再×极对数就是偏置电角度。后面读取电角度的时候,只需要把编码器实际读出来的机械角度转换为电角度,然后再减去极对数,就是真正的电角度了。这里也可以发现,由于P对极的电机在初始对齐的时候可以有P个位置,也就对应有P个偏置电机度,实际上使用哪个偏置电角度都可以。(详见另一篇笔记)

​ 为什么给-90度电角度就能进行电角度预校准?答案还是和FOC的核心思想有关,那就是FOC控制要生成一个超前转子90度的磁场

3.2.1.电角度定义为d轴和alpha轴的夹角

​ 如下图所示,电角度定义为d轴和alpha轴的夹角,此时为了校准电角度,也就是找到电角度0度的位置,那么要让d轴和alpha轴对齐,这个时候的电角度就是0度。为了让d轴和alpha轴对齐,那么就要生成alpha轴方向的磁场。由于是使用FOC控制,其核心就是控制生成一个超前转子90度的磁场,那么此时虚拟的转子应该在滞后alpha轴90度的方向,也就是在校准电角度的时候角度的反馈不是编码器来的,而是人为给定的,因为目的就是要生成一个想要的固定方向的磁场,从而吸引转子到这个方向,从而对齐电角度0度。所以此时虚拟的转子在图示位置,d轴也在这个位置,那么电角度是d轴和alpha轴的夹角,由图可知就是-90度。

3.2.2.电角度定义为q轴和alpha轴的夹角

​ 如下图所示,电角度定义为q轴和alpha轴的夹角,此时为了校准电角度,也就是找到电角度0度的位置,那么要让q轴和alpha轴对齐,这个时候的电角度就是0度。为了让q轴和alpha轴对齐,那么就要生成beta轴方向的磁场。由于是使用FOC控制,其核心就是控制生成一个超前转子90度的磁场,那么此时虚拟的转子应该在滞后beta轴90度的方向,也就是在校准电角度的时候角度的反馈不是编码器来的,而是人为给定的,因为目的就是要生成一个想要的固定方向的磁场,从而吸引转子到这个方向,从而对齐电角度0度。所以此时虚拟的转子在图示位置,d轴也在这个位置,此时的q轴在生成的FOC磁场的方向,那么电角度是q轴和alpha轴的夹角,由图可知电角度就是-90度。

// Park变化问题比较大,目前还没有弄明白
// 解决!终于明白了这里的Park变换为什么不对了!
// 坐标系的定义:https://www.cnblogs.com/neriq/p/14800876.html
qd_t mc_park(alphabeta_t input, int16_t theta)
{qd_t output;int32_t d_tmp_1, d_tmp_2, q_tmp_1, q_tmp_2;trig_components local_vector_components;int32_t wqd_tmp;int16_t hqd_tmp;// 计算输入的角度的sin和cos值local_vector_components = mc_trig_functions(theta);/*No overflow guaranteed  无溢出保证*/q_tmp_1 = input.alpha * ( int32_t )local_vector_components.h_cos;/*No overflow guaranteed  无溢出保证*/q_tmp_2 = input.beta * ( int32_t )local_vector_components.h_sin;/*Iq component in Q1.15 Format */wqd_tmp = ( q_tmp_1 - q_tmp_2 ) >> 15;  // 这里就是在算iq// 注意这里>>15为还是因为前面的结果是两个Q15格式的运算,结果是Q30格式,需要重新转换为Q15格式/* Check saturation of Iq */if ( wqd_tmp > INT16_MAX ){hqd_tmp = INT16_MAX;}else if ( wqd_tmp < ( -32768 ) ){hqd_tmp = ( -32768 );}else{hqd_tmp = ( int16_t )( wqd_tmp );}output.q = hqd_tmp;if ( output.q == ( int16_t )( -32768 ) ){output.q = -32767;}/*No overflow guaranteed*/d_tmp_1 = input.alpha * ( int32_t )local_vector_components.h_sin;/*No overflow guaranteed*/d_tmp_2 = input.beta * ( int32_t )local_vector_components.h_cos;wqd_tmp = ( d_tmp_1 + d_tmp_2 ) >> 15;/* Check saturation of Id */if ( wqd_tmp > INT16_MAX ){hqd_tmp = INT16_MAX;}else if ( wqd_tmp < ( -32768 ) ){hqd_tmp = ( -32768 );}else{hqd_tmp = ( int16_t )( wqd_tmp );}output.d = hqd_tmp;if ( output.d == ( int16_t )( -32768 ) ){output.d = -32767;}return (output);
}/*** @brief 反park变换:将同步旋转坐标系下的vqd,变换为静止坐标系的v_alpha,v_beta* @param volt_input: vqd* @param theta: 电角度值*/
alphabeta_t mc_rev_park(qd_t volt_input, int16_t theta)
{int32_t q_v_alpha_tmp1, q_v_alpha_tmp2, q_v_beta_tmp1, q_v_beta_tmp2;trig_components local_vector_components;alphabeta_t volt_output;local_vector_components = mc_trig_functions(theta);q_v_alpha_tmp1 = volt_input.q * ( int32_t )local_vector_components.h_cos;q_v_alpha_tmp2 = volt_input.d * ( int32_t )local_vector_components.h_sin;volt_output.alpha = ( int16_t )( ( ( q_v_alpha_tmp1 ) + ( q_v_alpha_tmp2 ) ) >> 15 );q_v_beta_tmp1 = volt_input.q * ( int32_t )local_vector_components.h_sin;q_v_beta_tmp2 = volt_input.d * ( int32_t )local_vector_components.h_cos;volt_output.beta = ( int16_t )( ( q_v_beta_tmp2 - q_v_beta_tmp1 ) >> 15 );return (volt_output);
}

ST电机库的FOC部分解读笔记相关推荐

  1. ST电机库v5.4.4源代码分析(1): FOC原理(结合ST电机库)

    编者:沉尸 (5912129@qq.com) 本文字描述电机FOC的原理性内容,大部分取材于网络,但是我对于某些细节进行了比较详细的描述.因为很多最初的出处链接没有记录下来,所以没有标明,忘谅解!本文 ...

  2. ST电机库v5.4.4源代码分析(8): 旋编怎么对齐

    编者:沉尸 (5912129@qq.com) 问题: 带旋编的电机(不是绝对位置旋编),ST电机库是怎么对齐的呢?也就是说如何确定初始电角度的问题. 我们基于"D:\motorCtr\cod ...

  3. ST电机库v5.4.4源代码分析(6): PID以及相关参数

    编者:沉尸 (5912129@qq.com) 前言: 本文章探索st电机库自动生成的PID参数的由来,采用的控制板为野火407电机板+BLDC带Hall的电机. 在"Mcboot()&quo ...

  4. ST电机库v5.4.4源代码分析(3): α、β方向的电流值与三相PWM 波形的联系

    编者:沉尸 (5912129@qq.com) 引言: 我们通过一系列的运算最后通过反park计算出了α.β方向的电流,那么如何将这两个电流值换算成pwm控制duty的实际参数呢? 本文结合ST电机库中 ...

  5. ST电机库v5.4.4源代码分析(2): 磁链圆限制之计算以及一个小bug

    编者:沉尸 (5912129@qq.com) FOC流程图 Circle_Limitation所在位置 图1 图2 现在计算出了和,需要限制: 如果 显然需要一个缩小的系数i (i < 1)进行 ...

  6. ST电机库v5.4.4源代码分析(4): 电角度和力矩方向分析(Hall传感器)

    编者:沉尸 (5912129@qq.com) 一)ST马达库中角度的定义 引言: 在Clerke以及park等变换中,我们都涉及到了角度,本文中我们结合ST的源代码探讨一下角度的取得以及它和力矩的关系 ...

  7. ST电机库v5.4.4源代码分析(7): SpeednPosFdbk_Handle_t在几个结构体中的关系

    编者:沉尸 (5912129@qq.com) 前言: SpeednPosFdbk_Handle_t在几个结构体中绕来绕去,我这里将其脉络梳理一下,方便读者理解代码. 先看下面的代码: 最终的结果是: ...

  8. ST电机库v5.4.4源代码分析(10): MCWB应用中的一个小技巧

    编者:沉尸 (5912129@qq.com) 前言: 如图中箭头,我们新建一个项目,BKIN缺省是有效的,而我们项目中又没用上BKIN脚,那么怎么让它变灰无效呢? 先设置好所有内容,然后生成项目 然后 ...

  9. 基于STM32 电机库(5.4.4)的单电阻采样调试总结

    目录 硬件调整 软件调整 下载运行 参数优化 总结 硬件调整 实验用的开发板和电机如下,在调单一电阻之前已经在三电阻的环境下把启动运行的参数已经调好了,这里不多说.调好后需要把硬件改成单电阻采样. 如 ...

  10. STM32 电机教程 21 - 基于ST MCLIB无感FOC 与 有感FOC 代码差异分析

    前言 磁场定向控制又称矢量控制(FOC), 本质上为控制定子电流的幅度和相位,使之产生的磁场和转子的磁场正交,以产生最大的扭矩. PMSM的磁场定向控制框图如下图所示: 第19.20讲分别实现了基于N ...

最新文章

  1. 【Linux驱动】ThinkPad笔记本wifi模块rtl8821ce在ubuntu16.04的驱动(默认没有)
  2. java-web分层2-Bean和业务层
  3. 【BZOJ】1607: [Usaco2008 Dec]Patting Heads 轻拍牛头
  4. 社区儿童计算机活动总结,社区亲子活动总结
  5. HD 2048 数塔 DP(简单递推)
  6. LeetCode Algorithm 剑指 Offer 06. 从尾到头打印链表
  7. SAP官方发布的ABAP编程规范
  8. 17 redis -key设计原则
  9. gini系数 决策树_SKlearn中分类决策树的重要参数详解
  10. python3闭包通俗解释_python通俗解说闭包
  11. 请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符go时,第一个只出现一次的字符是g。当从该字符流中读出前六个字符“google时,,,(C++实现)
  12. 计算机网络体系结构(详图)
  13. PowerDesigner设计数据库表操作
  14. logstash 日志收集
  15. html动态图片怎么设背景,[gif制作教程]如何把gif动态图片的背景变透明,仍保留有动画效果...
  16. linux测速,linux环境下使用speedtest测速
  17. 简单彩票中奖实现-Demo
  18. 卷积神经网络与全连接神经网络
  19. 用计算机做科学实验心得体会,做实验的心得体会3篇
  20. 聊一聊 AS 的一些好用的功能

热门文章

  1. wer 流程图编程_WER机器人搭建学习实操练习
  2. 以太坊的POS共识机制友善的小精灵 Casper
  3. 一个完整的计算器c语言源代码,分享一个C语言的计算器源代码
  4. 象棋正确的学习步骤是什么?入门和提高方法全都教给你!
  5. 无线路由器 tftp服务器怎么开启,水星路由器tftp服务器怎么开启
  6. 如何获取CSDN积分?
  7. win10最常用dos命令以及win+R即可运行的命令
  8. composer 安装
  9. KEmulator与eclipse的集成
  10. 【炮灰模型】 让数学建模来控制你的爱情,测测你是否是那个炮灰