ODrive0.5.1程序分析1----相电阻和相电感测量
在这里插入图片描述
1、入口函数所在的文件为axis.cpp
2、电机相电阻和相电感测量的入口函数为void Axis::run_state_machine_loop()
在这里插入图片描述
3、当current_state_的状态为AXIS_STATE_MOTOR_CALIBRATION时运行测量相电阻和相电感的函数motor_.run_calibration()
在这里插入图片描述
4、motor_.run_calibration()所在位置为motor.cpp
5、config_.resistance_calib_max_voltage通过外部odrivetool进行配置,配置方法为:
odrv0.axis0.motor.config.calibration_current = 10 (仅为示意,具体参数根据具体电机进行调整)
odrv0.axis0.motor.config.resistance_calib_max_voltage = 5 (仅为示意,具体参数根据具体电机进行调整)
6、相电阻测量函数,输入的两个参数都是通过外部odrivetool进行配置输入
7、相电感测量函数,当电机类型设置为MOTOR_TYPE_HIGH_CURRENT(大电流电机)或MOTOR_TYPE_ACIM(感应电机)时,进行电机电阻测量和电感测量
8、根据上面测量的电阻和电感更新电流环控制器的PI参数。
在这个主要的两个函数就是:
measure_phase_resistance(config_.calibration_current, R_calib_max_voltage)
measure_phase_inductance(-R_calib_max_voltage, R_calib_max_voltage)
接下来就一个一个进行分析:
一、measure_phase_resistance():
在这里插入图片描述
measure_phase_resistance()函数在motor.cpp文件中
kI:内部 PI 控制器的积分增益,单位是 (V/s)/A,用于让测试电流快速稳定到目标值。
num_test_cycles:根据测试周期 CURRENT_MEAS_PERIOD,计算出要运行 3 秒需要的循环次数。
测量周期CURRENT_MEAS_PERIOD和SVPWM的频率有关,如下
在这里插入图片描述
test_voltage:输出到电机的测试电压,初始为 0
电流重构:
Ialpha = -(current_meas_.phB + current_meas_.phC)利用三相电流之和为零(基尔霍夫定律)的原理,从 B、C 相电流计算出 A 相电流(即 α 轴电流)。
积分控制调节电压:
test_voltage += (kI * current_meas_period) * (test_current - Ialpha)这是一个简单的积分控制器,通过误差(目标电流 - 实际电流)来累积调节输出电压,让实际电流稳定到目标测试电流。
此处current_meas_period=CURRENT_MEAS_PERIOD
电压保护:
如果输出电压超出 max_voltage 限制,会立即触发错误并终止测试,并设置相应的错误标志。
电压输出:
enqueue_voltage_timings(test_voltage, 0.0f)将计算出的测试电压输出到 A 相(α 轴),β 轴电压设为 0,确保电流只在 A 相流动。
循环终止条件:
当循环次数达到 num_test_cycles(即运行满 3 秒)后,自动退出控制循环。
在这里插入图片描述
当测试电流稳定后,此时的电压 test_voltage 与电流 test_current 的比值就是相电阻 R=V/I。
计算出的电阻值会被保存到 config_.phase_resistance 中,供电流控制器等其他模块使用。
二、measure_phase_inductance():
在这里插入图片描述
measure_phase_inductance()函数在motor.cpp文件中
电感测量的原理就是通过交替施加高低两种电压,采集电流变化来计算电感值。
test_voltages[2]:存储两种测试电压,一个低电压,一个高电压,用来产生电流变化。
Ialphas[2]:用来累加两种电压下的 A 相电流(α 轴电流)。
num_cycles = 5000:每种电压持续运行的循环次数,总共会运行 5000 × 2 次循环。
交替切换高低电压:
int i = t & 1; 用位运算实现 i 在 0 和 1 之间交替切换,让系统轮流输出低电压和高电压。
累积 A 相电流:
Ialphas[i] += -current_meas_.phB - current_meas_.phC;
和之前一样,利用 I_A = -(I_B + I_C) 计算 A 相电流,并把对应电压下的电流值累积起来。
输出测试电压:
enqueue_voltage_timings(test_voltages[i], 0.0f)
将当前交替的电压输出到 A 相(α 轴),β 轴电压设为 0,确保电流只在 A 相流动。
循环终止条件:
return ++t < (num_cycles << 1);
num_cycles << 1 等价于 num_cycles × 2,所以总循环次数是 10000 次,高低电压各运行 5000 次。
继续:
在这里插入图片描述
这里的 v_L 是电感两端的有效电压,因为测试中交替使用高低电压,所以用两者的差值除以 2,来近似得到电感上的平均电压降(忽略了电阻压降的影响)。
Ialphas[1] - Ialphas[0]:高电压下的总电流和低电压下的总电流之差。
current_meas_period * num_cycles:每种电压持续的总时间(单次周期 × 循环次数)。
(Ialphas[1] - Ialphas[0]) / (current_meas_period * (float)num_cycles)这个式子就是在计算电流随时间的变化率 ΔI/Δt。
根据电感的电压-电流关系 V=L*ΔI/Δt,计算对应的电感值,并将电感值放到config_.phase_inductance中使用。

Logo

助力广东及东莞地区开发者,代码托管、在线学习与竞赛、技术交流与分享、资源共享、职业发展,成为松山湖开发者首选的工作与学习平台

更多推荐