ODrive0.5.1程序分析#1 电机校准(motor_calibration)

电机校准程序分析

固件版本 fw-0.5.1(0积分下载)

代码分析

状态命令

当发送状态为AXIS_STATE_MOTOR_CALIBRATION时进行电机校准,执行run_calibration函数
axis.cpp
对于函数run_calibration,当电机类型设置为MOTOR_TYPE_HIGH_CURRENT(大电流电机)或MOTOR_TYPE_ACIM(感应电机)时,进行电机电阻检测和电感检测

1. 电阻检测

1)

将GUI设置的calib_max_voltage(最大校准电压)赋值给R_calib_max_voltage,与设置的calibration_current(校准电流)一同作为电阻检测函数的输入,运行measure_phase_resistance函数
motor.cpp

2)

对于函数measure_phase_resistance,①先设置根据电流偏差算电压所需要的KI参数,然后根据测试时间除以采样周期得出run_control_loop函数的循环次数,run_control_loop函数内为循环函数,用{}内程序返回值作为判断条件,当返回false/0时停止循环;
②{}内函数首先根据检测的bc相电流直接得到Ialpha,然后计算与输入的calibration_current的差值得到校准电压test_voltage进入函数enqueue_voltage_timings

motor.cpp

3)

对于函数enqueue_voltage_timings输入为test_voltage作为v_alpha,v_beta等于0,然后根据等幅值变换之后的电压最大值算出新的alpha、beta(此为SVPWM一种写法的预处理),作为输入传进函数enqueue_modulation_timings
motor.cpp

4)

对于函数enqueue_modulation_timings,首先根据输入alpha、beta经过SVPWM算开启时刻tA、tB、tC,然后计算开启时刻比较寄存器的值next_timing,同时将next_timing_valid置为true
motor.cpp

5)

对于函数pwm_trig_adc_cb——此函数在ADC注入组中断中调用,时间顺序为:高级定时器CH4触发ADC注入组采集,注入组采集完成根据标志位进入ADC中断,然后调用该函数。
next_timing_valid置为true后会将计算的next_tings作为输入进入函数safety_critical_apply_motor_pwm_timings
low_level.cpp

6)

对于函数safety_critical_apply_motor_pwm_timings,将输入的next_timing赋值给CCR进行驱动电机。
low_level.cpp

7)

此时回到1.2)中③,算是完成了一次run_control_loop函数判定条件的一次循环,重复进行到指定次数,得到最终的test_voltage根据公式R=U/I,U=得到的test_voltage,I=输入的校准电流test_current得到相电阻R

2. 电感检测

1)

将GUI里设置的最大校准电压的正负值作为measure_phase_inductance函数的输入
motor,cpp

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)。
motor.cpp

本部分结束

原创不易,如果对你有帮助的话,希望可以点赞关注收藏,谢谢😊

  • 15
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
odrive control utility v0.5.1.post0的异常主要是指在线程thread-1中出现了错误导致程序无法正常运行的问题。异常是编程中的一种常见情况,表示程序在执行过程中发生了意外情况。 异常通常会伴随着一个traceback,它给出了异常发生的位置和调用栈信息,可以帮助我们定位问题。traceback包含了异常发生的代码行数、文件名、函数名等详细信息。 要解决该异常,我们需要仔细阅读traceback中的信息,以了解异常的来源和原因。首先,我们可以查看异常的类型,了解是哪种类型的异常导致了问题。其次,查看异常发生的位置,以便我们在代码中定位到有问题的部分。 根据异常类型和位置,我们可以采取相应的措施来解决问题。可能的解决方法包括但不限于以下几点: - 检查代码逻辑,确保没有语法错误或逻辑错误。 - 检查输入数据,确保数据的格式和内容符合要求。 - 检查外部依赖,如库、包等是否正确安装并引用。 - 检查线程安全性,确保多线程操作没有互斥或竞争问题。 - 检查硬件资源,确保系统资源足够支持程序运行。 在解决问题时,我们还可以尝试通过调试工具来帮助我们定位问题。例如,可以使用断点调试工具在异常发生的代码行上设置断点,逐步执行代码,查看变量的值,从而找出问题所在。 总之,要解决odrive control utility v0.5.1.post0的异常,我们需要仔细分析traceback中的信息,并针对性地采取解决方法,以确保程序能够正常运行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值