Thermistors on the ODrive


#1

No thermal camera, unfortunately. Would I have to put 3 thermistors on the MOSFETs (one for each phase) to get a safe temperature reading?


High-torque actuator for legged robots
#2

We have thermistors on the ODrive. I haven’t yet done the validation to check how close the thermistor gets to the FET temperature, but you can still use that temperature to keep track of the heat in general. If you are up for, you can add the function to read the temperature from them.

The circuit looks like this:
image
and the thermistor is a THERMISTOR NTC 10KOHM 3380K.

You can get the voltage for the M0 thermistor in odrivetool by odrv0.get_adc_voltage(15). The mapping for the thermistors are:

  • M0 FETs: channel 15
  • M1 FETs: channel 4
  • Brake resistor FETs: channel 5

#3

The thermistors are placed pretty close to the FETs:


#4

I did the required voltage-to-temperature equations in python and then computed a 3rd order polynomial fit. As input is the normalized voltage, which in the ODrive’s case is out of 4096 if using raw ADC values, or out of 3.3V if using voltage.

The coefficients from this 3rd order polynomial fit, from high to low order, are:
[ 363.0172658 -459.19773008 308.29273921 -28.12731452]

The script is here.


Odrive MOSFET temperature rise measurements using the onboard thermistor
#5

I’d like to implement a current limiting PID loop in the firmware. It would read the temperatures of the FETs (and motors, if they have thermistors), and adjust the current limit of each axis to keep the motors/FETs within their respective temperature limits. Do you have any recommendations on how to do this?


#6

Sure, just make a PI loop from the temperature to the current_lim. You can run it on the Controller::update code path.


#7

Now on devel, I made the polynomial evaluation in firmware.

Connected to ODrive 366A33683037 as odrv0
In [1]: odrv0.axis0.get_temp()
Out[1]: 29.090396881103516

In [2]: odrv0.axis1.get_temp()
Out[2]: 27.75192642211914

In [3]: start_liveplotter(lambda:[odrv0.axis0.get_temp(), odrv0.axis1.get_temp()])

Here I’m touching the thermistor with my finger causing the deflection: