电机校准程序分析
固件版本 fw-0.5.1(0积分下载)
代码分析
状态命令
当发送状态为AXIS_STATE_MOTOR_CALIBRATION时进行电机校准,执行run_calibration函数
对于函数run_calibration,当电机类型设置为MOTOR_TYPE_HIGH_CURRENT(大电流电机)或MOTOR_TYPE_ACIM(感应电机)时,进行电机电阻检测和电感检测
1. 电阻检测
1)
将GUI设置的calib_max_voltage(最大校准电压)赋值给R_calib_max_voltage,与设置的calibration_current(校准电流)一同作为电阻检测函数的输入,运行measure_phase_resistance函数
2)
对于函数measure_phase_resistance,①先设置根据电流偏差算电压所需要的KI参数,然后根据测试时间除以采样周期得出run_control_loop函数的循环次数,run_control_loop函数内为循环函数,用{}内程序返回值作为判断条件,当返回false/0时停止循环;
②{}内函数首先根据检测的bc相电流直接得到Ialpha,然后计算与输入的calibration_current的差值得到校准电压test_voltage进入函数enqueue_voltage_timings。
3)
对于函数enqueue_voltage_timings输入为test_voltage作为v_alpha,v_beta等于0,然后根据等幅值变换之后的电压最大值算出新的alpha、beta(此为SVPWM一种写法的预处理),作为输入传进函数enqueue_modulation_timings
4)
对于函数enqueue_modulation_timings,首先根据输入alpha、beta经过SVPWM算开启时刻tA、tB、tC,然后计算开启时刻比较寄存器的值next_timing,同时将next_timing_valid置为true
5)
对于函数pwm_trig_adc_cb——此函数在ADC注入组中断中调用,时间顺序为:高级定时器CH4触发ADC注入组采集,注入组采集完成根据标志位进入ADC中断,然后调用该函数。
在next_timing_valid置为true后会将计算的next_tings作为输入进入函数safety_critical_apply_motor_pwm_timings
6)
对于函数safety_critical_apply_motor_pwm_timings,将输入的next_timing赋值给CCR进行驱动电机。
7)
此时回到1.2)中③,算是完成了一次run_control_loop函数判定条件的一次循环,重复进行到指定次数,得到最终的test_voltage根据公式R=U/I,U=得到的test_voltage,I=输入的校准电流test_current得到相电阻R
2. 电感检测
1)
将GUI里设置的最大校准电压的正负值作为measure_phase_inductance函数的输入
2)
对于函数measure_phase_inductance①首先将负的最大校准电压作为输入的voltage_low正的的最大校准电压作为输入的voltage_high构成数组test_votage设置电流数组Ialpha 分别对应最大值最小值下的电流;设置循环次数num_cycles=5000注意循环判定中有num_cycle<<1,则num_cycle=10000,由于i=t&1,故每次循环后i=0/1交替故为两电压各循环500次。②将电压作为输入进入函数enqueue_voltage_timings,经过计算同1.3)—1.6)驱动一次循环。③根据公式L=U/(di/dt),U=voltage_high 由于俩电压有正负之分,故产生的两电流也有正负之分,di/dt=两电流绝对值之和/(采样周期*num_cycles)(注意采样周期*cycles不等于测试时间,因为总循环次数为二倍的num_cycle)。