编写以下的函数

说一说这几天我在测试新的无刷驱动板时碰到的几个问题。

首先,先介绍一下低侧采样,高侧采样,在线采样的区别:

先说结论,如果很在意成本的话,选择低侧采样,但是对软件层面的采样时机有所要求;如果想降低软件复杂度,选择在线采样;高侧采样并不推荐,成本高且软件复杂度也高。

在线采样:在线采样之所以叫做在线,也就是你在任何时刻去采电流值都是可以的(当然,最好避开Mos刚好打开或者关闭的瞬间,这个时刻的ADC值可能会有所波动),这种电流采样方式对于软件负责人来说,无疑是极大减轻了复杂度,但缺点是这种电流检测结构要求高精度双向放大器具有比常规低侧或高侧放大器更好的PWM抑制。

高侧采样:必须要求硬件设计上的放大器是支持高压的,并且这种方法还必须要求ADC采样的时刻必须是在高侧MOS打开的时刻,这时采到的电流才是相电流,这种方法对硬件成本要求高,因为他需要选择支持高压的放大器,成本有所提升。

低侧采样:这种方式与高侧采样一样,很讲究ADC的采样时机,必须要低侧Mos是打开的情况下,采的才是相电流的值。但是与在线采样不同,它不需要高性能PWM抑制电流检测放大器(如在线检测放大器),所以在成本上会降低。

说完了三种采样方式的区别后,其实我觉得不管是哪一种采样,软件层面的操作都是差不多一样的,都是需要避开Mos的开与关的瞬间。就算在线采样选用的是精密的运放器,并且精密运放中有电源去耦,滤波等特殊的电路设计,mos的开关瞬间也依旧是有影响的。所以最好都是选用PWM中央对齐模式,在PWM周期的中点左右去触发ADC采样,也就是避开PWM的电平跳变瞬间,这样不管是对于那种采样方案,都可以采到近乎稳定的ADC值了。只不过就是要注意高侧采样是在高侧Mos打开时采样,而低侧是在低侧mos打开时采样。关于如何在软件方面实现,请移步到我的另一篇博客里,里面有详细介绍:

FOC的PWM的重新配置以及svpwm的移植_foc pwm-CSDN博客

说完了上述的采样方式的区别后,接下来讲一讲FOC电流环电流解算错误的排查方法。

当你感觉你算法什么都写的好好的,但是电流采样读取的三相电流经克拉克变换,帕克变换转换的电流iq值老是与理论上的iq不匹配时,不妨顺着我这几个思路去排查一下问题。

1.首先,先看看自己手里这块无刷驱动板是哪种形式的采样,是低侧采样的话就一定要在低侧MOS打开并且稳定时才去采,千万不要任意时刻盲目的去采,这样你获得的原始相电流根本不是真实的相电流值,所以转换出来的iq值自然就不会正确。

2.其次,就是去注释掉你原来的FOC算法,直接给三相通电去检测你采的相电流的相位是否匹配。比如说你要采A相的电流值,但是你现在采的是B相的电流,那么肯定最后转换出来的iq也是错的了。怎么排查,其实又有两种方法,法一就是找到这块无刷驱动板的设计者去要电路原理图,并且看看你ADC通道采样的IO口是否采的就是对应的相位(比如单片机的PA0引脚就是要采A相的电流,那么你需要去看看电路原理图中A0引脚是否就是采集的A相电流)。法二需要搭配上串口上位机,编写以下的函数:

__HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_1,0);  //PWM占空比设置函数,最后
__HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_2,0);  //一个参数表示CCR的值                       
__HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_3,0); 	  

这三个通道的PWM占空比设置函数,可以检验你采的电流相位是否与你需要的相位是匹配的。比如给TIM_CH1占空比设置为50,另外两个通道占空比设置为0。那么理论上,A相的上管电流就会流向B,C两相的下管去,这时你把你ADC采到的三个通道的原始值都发送到上位机,理论上B,C两相采到的ADC值都是差不多的,而A相的ADC值是与B,C两相的差很多的,通过这种最简单粗暴的方法,在不需要电路原理图的条件下,你就可以判断出你采的电流相位是否匹配。

3.接着,如果是有感FOC,看看自己获取的电角度是否正确,有没有乘以极对数?编码器是否正常?可以直接把编码器获取的角度值打印到串口上看看是否正确,如果电角度出问题的话,在帕克变换那里,会导致算出来的电流iq是错的。

4.最后,也是这次我遇到的情况。首先我们要知道电流是有方向的,如果你的硬件电路上运放器有偏置的话,那么电流的方向是会在1.65附近上下波动的(假定-接地,+接3.3V),

那么单纯通过采样ADC值,就可以判断出电流是负还是正的了。而如果你的基准值不是1.65V,也就是说你的初始ADC值不是2048附近(我的ADC是12位的)而是0或者4095,那么你就无法检测出电流的方向了。那基准值是0举例,当电流是正向时,你采到的ADC值也是正常的,而当电流是反向的,那么由于你的基准值是0,单片机不可能采出负电压的,就会导致你识别不出反向电流从而导致电流换算崩溃。所以对于这种情况,最好是在串口上先打印出不通电流的初始化ADC值,看看是不是在2048附近或者和板子的设计人沟通,才能确保我们的FOC电流环的电流采样是正常的。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐