电机关键数据采集方法详解:M法、T法和M/T法
电机关键数据采集方法详解:M法、T法和M/T法
本篇文章深入探讨了FOC(磁场定向控制)电机控制中的电机关键数据采集方法,特别是电机测速的三种方法:M法、T法和M/T法。文章详细解释了每种方法的原理,并给出了具体的实现代码。内容专业且深入,适合电机控制领域的工程师和技术人员阅读。
前言
本专栏专注分享在 FOC(基于磁场定向控制的 BLDC 电机控制器)方面的学习过程和心得体会。包括 FOC 控制算法时的实验成果和代码实现,和一些电机控制方面的基础知识和实用技巧。通过这些内容的分享,希望能够帮助更多的人理解和掌握 FOC 控制算法,让大家能够更加轻松地开发和控制电机。
由于在电机控制应用中需要了解电机的性能以及行业对限流的要求,因此,对于每一个规格型号的电机,都需要测试其相关性能,以便得到相关的数据支撑。对于电机测试有以下测试目标:
- 需要记录下每个转速的空载Vs值和电机空载所能达到的最大转速。
- 数据记录完成后,进行相关的数据分析,包括但不限于:拟合测功机实测电功率和程序计算电功率;拟合iq与扭矩的关系曲线;分析限流值和限扭矩值的曲线(包括速度分界点和曲线关系等,实现低速限扭矩,高速限功率)。
- 测试数据的选择基于转速和扭矩进行划分。
电机测试步骤:
- 测试之前需明确限速值对应的转速,电源限流值等参数。
- 在硬件允许的范围内将限流值和保护值设置的尽量大
- 在空载下测试能达到的最大转速
- 在低速下不断加载,观察能电机能正常运行的最大转矩
- 在高速下限制电源电流
另外,电机测速也是尤为重要的一项。编码器输出的AB信号可以有效反应电机的转子位置,同时也可以根据AB信号的变化计算出电机转速,常用的编码器测转速的方法有M法、T法和M/T法。电机转速也是速度,也符合路程除以时间,只是表示不同。(n = θ t n=\frac{θ}{t}n=tθ )
一、M法(从路程入手):
所谓M法(如图1),即计算在特定的时间段内转子旋转过的角度,即t tt固定,根据θ θθ计算转速n nn。
图1:M法(黄色为时间脉冲,蓝色为位置脉冲)
编码器输出的脉冲数可以等效为转子走过的角度,比如时间t tt内编码器输出脉冲数为M 1 M_1M1 (不考虑倍频),则转速为:n ( M ) = 60 ∗ M 1 t n_{(M)}=60*\frac{M_1}{t}n(M) =60∗tM1 此方法在转速较高的情况下适用,举例,若电机转速较慢,在时间t tt内M 1 M_1M1 可能为0,此时计算出转速为0,但电机仍然有速度,只是很慢而已。
二、T法(从时间入手)
所谓T法(如图2),即计算走过特定脉冲所使用的时间,即θ θθ固定,根据t tt算转速n nn。
图2:T法测速(红色为时间脉冲,蓝色为位置脉冲)
一般情况下都是采用定时器捕获脉冲的上升沿或下降沿,即路程固定为1个脉冲。转子旋转一圈编码器输出的脉冲总数为C,则路程为:θ = 1 C θ=\frac{1}{C}θ=C1 此时需要计算走过这个脉冲所用的时间,一般是用另一个高频定时器来计数,其计数的个数M 2 M_2M2 再乘以计数频率则为时间:T = M 2 ∗ 1 f T=M_2 * \frac{1}{f}T=M2 ∗f1 则转速公式为:n ( T ) = 1 C ÷ M 2 f = f C M 2 n_{(T)}= \frac{1}{C} ÷\frac{M_2}{f}=\frac{f}{CM_2}n(T) =C1 ÷fM2 =CM2 f 此种测速方法不适用于高速,例如,电机转速很高,两个位置脉冲之前切换的很快,此时时间脉冲还未来得及加1,则分母为0,转速无穷大,但是电机有一个实际转速,所以不符合。
三、M/T测速法:
M/T测速法相比于前两种,其特点在于不存在固定的量,而是不同的位置脉冲对应不同的时间脉冲,即脉冲加的多了,所需的时间也多了,不影响最终转速的结果(比如脉冲增加了5个,时间花了5ms,脉冲增加了10个,时间花了10ms,算出来的转速都是一样的)。
通过某些条件首先确定位置脉冲的增量M 1 M_1M1 ,则路程为M 1 C \frac{M_1}{C}CM1 ,然后计算这M 1 M_1M1 个脉冲所花费的时间,仍然采用定时器来计数时间(公式1.3所示)。此时转速:n ( M / T ) = 60 ∗ M 1 C ÷ M 2 f = 60 f M 1 C M 2 n_{(M/T)}=60* \frac{M_1}{C} ÷\frac{M_2}{f}=\frac{60fM_1}{CM_2}n(M/T) =60∗CM1 ÷fM2 =CM2 60fM1 式中,根据不同的触发条件,位置增量M 1 M_1M1 多,则时间M 2 M_2M2 也随之增大,所以不会影响转速的计算。
四、实现过程:
TMR2做编码器的计数器,通过捕获A信号上升沿,在中断服务函数里计算脉冲个数M 1 M_1M1 ,并且计算时间脉冲的计数个数M 2 M_2M2 ;TMR3做时间计数器,记录走过脉冲数所用的时间,并且以其更新中断作为测速的触发条件。f ff为计数频率,144MHz。
/* M/T cal speed-M1 */
switch (handle->u1_encoder_cnt_dir)
{
case COUNT_UP://count direction up
if (handle->u2_encoder_count > handle->u2_encoder_count_pre)
{
handle->u2_encoder_pulse = handle->u2_encoder_count - handle->u2_encoder_count_pre;
}
else
{
handle->u2_encoder_pulse = UINT32_MAX - (handle->u2_encoder_count_pre - handle->u2_encoder_count);
}
break;
case COUNT_DOWN://count direction down
if (handle->u2_encoder_count > handle->u2_encoder_count_pre)
{
handle->u2_encoder_pulse = UINT32_MAX - (handle->u2_encoder_count - handle->u2_encoder_count_pre);
}
else
{
handle->u2_encoder_pulse = handle->u2_encoder_count_pre - handle->u2_encoder_count;
}
break;
default:
break;
}
handle->u2_encoder_count_pre = handle->u2_encoder_count;
/* M/T cal speed-M2 */
counter_temp = TMR3->cval-counter_pre;
counter_pre = TMR3->cval;
counter_temp += ((handle->u2_encoder_counter_cnt - handle->u2_encoder_counter_cnt_old) * PWM_PERIOD_COUNT);
handle->u2_encoder_counter = counter_temp;
handle->u2_encoder_counter_cnt_old = handle->u2_encoder_counter_cnt;
/* n=60*(f*M1)/(C*M2) */
void encoder_MT_cal_speed(mg_mtr_encoder_t* handle)
{
handle->encoder_wheel_speed = 60 * ((144000000 * (handle->u2_encoder_pulse)) / handle->u2_encoder_counter);
handle->encoder_wheel_speed /= encoder_max;
handle->encoder_motor_speed = handle->encoder_wheel_speed * N_BASE;
}
模拟输出5K的AB脉冲,则经过4倍频后为20K;假设一圈的脉冲最大为36K,则电机转速应为:20 ÷ 36 ∗ 60 = 33.33 ( r / m i n ) 20÷36*60=33.33(r/min)20÷36∗60=33.33(r/min)
与计算结果一致。
总结
本章介绍了电机测试的要求和方法,着重讲解了电机测速的各种方法及实现。
本文原文来自CSDN博客