作者:kei_herme | 来源:互联网 | 2023-07-15 17:38
已经有一段时间没写博客了,之前一直在弄有霍尔BLDC的方波控制,年后弄了一下无霍尔的方波,但是电机控制工程师的梦想还是矢量控制,哈哈。前路漫漫,现在各个相关公司已经有了电机
已经有一段时间没写博客了,之前一直在弄有霍尔BLDC的方波控制,年后弄了一下无霍尔的方波,但是电机控制工程师的梦想还是矢量控制,哈哈。前路漫漫,现在各个相关公司已经有了电机控制库,但是我还是想先自己尝试写一下矢量控制,毕竟自己亲手来一遍才清楚其中的奥妙与玄机。
由简入难,方波搞差不多了,然后就从有霍尔的矢量控制开始做吧。首先就是SVPWM了,SVPWM也没啥好说的,网上大佬们的介绍已经挺多了,我也是按照网上大佬的文章来一步步做的。SVPWM参考博客SVPWM算法原理及详解_qlexcel的专栏-CSDN博客_svpwm,这个作者写得很好,一看就懂,因此,对于SVPWM的配置什么的,就不再赘述,也不是本文的内容。我的SVPWM最终的波形如下,如果有什么错误,还请留言,一起探讨,比较我也是新手。
在做好SVPWM之后,就是SVPWM产生的三相正弦波的电流采样了,只有电流采样准确,矢量控制的坐标转换才能正确。因此电流采样的重要性不言而喻。
在做电流采样的时候,可以参考ST的电机库是怎么做的,下面是ST官方的教程文档:
只看这个文档只能看到ST的大致思路下载一个ST的5.0以上的电机库,生成一下标准工程,看一下生成的CUBEMX里面ST的如何配置的:
看到这里大概就知道ST是使用TIM1(PWM定时器)的CH4通道来触发ADC的注入采样。有关注入采样与规则采样的说明,请自行查询手册,之后通过改变通道4的CCR值(占空比)来调节采样点。原则上是每两个PWM周期采样一次(由于SVPWM的产生需要用到中央对齐模式,因此是两个PWM周期),可以在载波周期的溢出中断里进行电流采样数据的处理,当然,也可以在ADC采样结束的中断里,我用的是F1,因此有注入采样与规则采样,有两种中断,如果是F0,是没有注入采样的,只能是规则采样。
根据我实际的情况,触发注入采样,我是真的搞不出来,真是难受啊,也许是我太蠢,因此我实际的ADC采样操作麻烦了许多,我用了TIM1的CH4配置为PWM1模式,用TIM1的4通道的上升沿来触发另一个从定时器TIM3,TIM3配置为复位模式,然后将TIM3的一个通道配置为PWM2模式,使用TIM3的上升沿去触发ADC的规则采样。不要问我为什么绕了一大圈,因为TIM1的CH4通道不能触发ADC的规则采样。手册如下:
虽然很麻烦,但我还是成功了,具体使用定时器去触发ADC采样的其他细节,可以查看我之前的博客。因为我使用了6个ADC通道,因此3个配置为规则采样,为了不耽误电流采样,其他3个就配置到注入采样,把注入采样配置为自动注入,也就是说,在规则采样完成后,会自动触发注入采样:
我的ADC配置如下:
然后就是采样点的选取了,一般操作就是在SVPWM周期里,三相上管全关闭,三相下管全打开的状态,也就是U0状态时进行采样,由于电流的感性作用,在上管全部关闭时,电流不会发生突变,电流方向不变,因此至少会有一相的电流是从GND向上走的。
具体关于电流采样的几种方案的分析,可以参考这篇文档:FOC 电流采样方案比较 – 百度文库
采样点示意如图:
当然,在配置TIM1-CH4的CCR时,要注意一些时间延迟,要包括每次PWM打开或关断的干扰时间以及ADC采样需要耗费的时间,这个根据自己的情况进行配置。
在最开始的时候,我以为上管打开时间最长的那一相是正电流(由GND向上流向电机),其他两相时候是负电流(由电机流向GND),(这个方向可以自己定义,自己明白就行),只有当T4=0时,也就是说有两相是上管打开时间一样长时会有两相负电流,根据这个错误思路,我就认为采样电阻只需要加运放电路就行,不需要加偏移电路(我后面得知,有高手是这样做的,而且成功计算了FOC,当然我现在还不是高手),当我满怀信心将采集到的电流数据打印出来的时候,看到的波形是这样的:
这一段平的0电流令我着实费解,还以为是ADC采集没有配置对,在思索了一天之后,对照simlink的仿真波形:
看了好一会这个simlink的仿真波形,才恍然大悟,正常的三相正弦波电流应该是有一段时间是两相负电流,也就是说,因为有了两相负电流,所以才会有那一段平的0电流,另外一相因为是根据 Ia + Ib + Ic = 0;所以也就变成了镜像的电流波形,这样一切都解释通了。那么就是增加偏移电路了,其实也就是把运放加入一个加法器,我是构造了一个0.1V的偏移电压,在加入偏移电路之后,更改程序,采样,观察波形,波形比较乱,是这样的:
大概形状倒是有了,但是怎么看怎么不对劲啊,这种波形能做FOC吗?我的首先思路是加滤波,卡尔曼,互补滤波这种效果好是好,然而计算量好像有点大啊,最终还是加了滑动窗口滤波,这个滤波方法还是比较好的,有多次平均的效果,而且计算量小,每次只需加上新数据,减去旧数据,在求平均就行。在调了一会滑动窗口滤波之后,波形好了一些:
但是感觉还有不太对啊,这样做延迟好像有点高啊,看别人的操作都是采集完数据就直接用了啊,肯定是我哪里不对,不应该加滤波,或者说不应该加过多的滤波。之后便测了偏移电压,怀疑是偏移电压波动带来的采集波动,果然,我的猜测是对的,在电机运转的时候,偏移电压的波动增大了很多,这样的话,那我用固定的偏移电压ADC值来求真实的电流值肯定是不对的。既然这样,我突然想到,为啥不软件构造一个动态的偏移电压的ADC值?三相电流的ADC值相加是3倍的偏移电压ADC值的数学关系啊!按照这个思路,我更改了程序,减小了滤波,波形就很正常了:
当然,这种方法在之后的进度中还需要测试,还需要再研究别人的算法,在自己真正过了一遍FOC之后,再研究一下那些大佬不用偏移电路是怎么做的。