搜索
bottom↓
回复: 9

FOC2.0 RevPark_Circle_Limitation函数分析

[复制链接]

出0入0汤圆

发表于 2018-2-8 11:03:14 | 显示全部楼层 |阅读模式

最近开始着手将FOC2.0的库函数从头重写一遍,主要是为了了解FOC的各个技术细节,同时改写2.0库中一些自己不是很理解的函数。目前硬件驱动已全部完成,开始着手写算法部分。现在卡在RevPark_Circle_Limitation() 这个函数上。

纵观整个FOC算法,参与计算的参数中,只有Vd,Vq是进过PID调节得到的值,与实际物理量之间没有固定的倍数关系。所以要对Vd,Vq做归一化处理。然后就可以映射到你想映射的区间中。 这里面就涉及到SQRT(Vd² + Vq²) ,计算量比较大,2.0库中用RevPark_Circle_Limitation()来计算合成矢量模长,并查表,只是这个函数一直没看懂,希望有精通的大神指教一二,感谢!

函数如下:
void RevPark_Circle_Limitation(void)
{
s32 temp;

temp = Stat_Volt_q_d.qV_Component1 * Stat_Volt_q_d.qV_Component1
             + Stat_Volt_q_d.qV_Component2 * Stat_Volt_q_d.qV_Component2;  // min value 0, max value 2*32767*32767

if ( temp > (u32)(( MAX_MODULE * MAX_MODULE) ) ) // (Vd^2+Vq^2) > MAX_MODULE^2 ?
   {
   u16 index;

   temp /= (u32)(512*32768);  // min value START_INDEX, max value 127
   temp -= START_INDEX ;   // min value 0, max value 127 - START_INDEX
   index = circle_limit_table[(u8)temp];

   temp = (s16)Stat_Volt_q_d.qV_Component1 * (u16)(index);
   Stat_Volt_q_d.qV_Component1 = (s16)(temp/32768);  

   temp = (s16)Stat_Volt_q_d.qV_Component2 * (u16)(index);
   Stat_Volt_q_d.qV_Component2 = (s16)(temp/32768);  
   }

}



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2018-2-9 16:26:41 | 显示全部楼层
这就是查完表之后,按比例缩放

出0入0汤圆

发表于 2018-2-9 20:25:31 来自手机 | 显示全部楼层
感谢楼主分享

出0入24汤圆

发表于 2018-2-10 00:41:02 | 显示全部楼层
理解清楚为什么要做限制,限制的原理是什么,再看代码会容易很多
假设某一时刻Ud输出0.8,Uq输出0.8,单独计算,两个都没超过1.0,但是矢量和是超过了1.0的,所以需要做限制
具体怎么限制,总不能Ud不变uq减小,或者反过来吧,等比例方式带来的失真最小,所以采用这种方式
ST的代码非常巧妙,复杂的开方和除法运算通过查表的方式实现,效率提高 很多
它是用32768代表1.0的,Q15格式,研究的时候需要注意

出0入0汤圆

 楼主| 发表于 2018-2-11 15:01:55 | 显示全部楼层
本帖最后由 上海爱观视觉 于 2018-2-11 15:07 编辑
20061002838 发表于 2018-2-10 00:41
理解清楚为什么要做限制,限制的原理是什么,再看代码会容易很多
假设某一时刻Ud输出0.8,Uq输出0.8,单独 ...


嗯,关于限幅的理由和原理我都清楚,数学计算上面也贴出来了,也是很清晰的,就是那个用查表来表示开方的方法看的不太懂
请问查表的原理是什么???

手册上说表里存的是 (MMI * S16_MAX² / 矢量模长),代码上是这样写的,我就看不懂了。 其中MMI S16_MAX² 是定值,然后他怎么知道模长是多少的呢,里面还有个常数 START_INDEX  也是不明其意

temp /= (u32)(512*32768);  // min value START_INDEX, max value 127
   temp -= START_INDEX ;   // min value 0, max value 127 - START_INDEX
   index = circle_limit_table[(u8)temp];

就是这个地方,能讲解下么   

出0入0汤圆

 楼主| 发表于 2018-2-11 15:07:12 | 显示全部楼层
xuezubo 发表于 2018-2-9 16:26
这就是查完表之后,按比例缩放

请问查表的原理是什么???

手册上说表里存的是 (MMI * S16_MAX² / 矢量模长),代码上是这样写的,我就看不懂了。 其中MMI S16_MAX² 是定值,然后他怎么知道模长是多少的呢,里面还有个常数 START_INDEX  也是不明其意

temp /= (u32)(512*32768);  // min value START_INDEX, max value 127
   temp -= START_INDEX ;   // min value 0, max value 127 - START_INDEX
   index = circle_limit_table[(u8)temp];

出0入24汤圆

发表于 2018-2-12 12:17:45 | 显示全部楼层
上海爱观视觉 发表于 2018-2-11 15:01
嗯,关于限幅的理由和原理我都清楚,数学计算上面也贴出来了,也是很清晰的,就是那个用查表来表示开方的 ...

代入一个值,计算一遍你就明白了
减去一个索引值,是因为前面的值都是32768,没有意义,存了浪费空间

出0入8汤圆

发表于 2018-2-12 15:31:51 来自手机 | 显示全部楼层
最大调制比为1.0,那么如果你算出来的电压超过1.0,就要限制vq,优先满足vd,让电机进入弱磁状态,否则,电机转速是上不去的,lz看一下弱磁控制的原理

出0入0汤圆

发表于 2018-9-28 11:08:49 | 显示全部楼层
楼主目前搞定了吗?也在学习这里.

出0入0汤圆

发表于 2019-12-28 16:11:46 | 显示全部楼层
碰到和楼主一样的问题,也不理解。楼主搞定没有。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-6-2 19:01

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表