Seeking Assistance with Motor Heating and Burnt Smell Issue on New Drone
-
I've built a new drone and encountered some issues. Let me describe the situation. When arming for 10 seconds, three problems occurred:
- Heating and a burnt smell occurred from the Top Left and Bottom Right motors.
- A burnt smell came from the Top Right motor.
- Smoke and a burnt smell emerged from the Bottom Left motor.
These symptoms occurred sequentially, not simultaneously. I've set the PID to Default using QGC, checked the motor rotation direction, and performed sensor calibration. During ESC calibration, I raised the power to 70, reaching 24000 rpm, without any burnt smell. However, currently, severe heating occurs just from arming. Could you please advise on the possible issue?
Here's a description of the drone I used:
Components: Voxl2 (SDK 1.1.3), HiRES, Tracking, ToF (previous version), ESC m0117-01, power module. Motors: 2104 3000kv, powered by a 4S 2800 lipo battery. I calibrated the ESC and uploaded parameters using voxl-esc-tools (gitlab). Firmware version is 39. I've set the minimum RPM to 5000 and the maximum RPM to 30000.Below is a table of the ESC calibration results and the uploaded ESC parameters. If there are any missing or incorrect parts in the parameters below or any modifications needed, please let me know. I used the file from this link as a base and only modified the "num_cycles_per_rev", "min_rpm", "max_rpm", and "pwm_vs_rpm_curve_a0-2" parameters.
Calibration Result
# id 0 10-70 INFO: Test took 31.03 seconds Quadratic fit: motor_voltage = a2*rpm_desired^2 + a1*rpm_desired + a0 a0 = 497.659745401 a1 = 0.192005842422 a2 = 7.07997743455e-06 ESC Params (after scaling): pwm_vs_rpm_curve_a0 = 497.659745401 pwm_vs_rpm_curve_a1 = 0.192005842422 pwm_vs_rpm_curve_a2 = 7.07997743455e-06 # id 1 10-70 Quadratic fit: motor_voltage = a2*rpm_desired^2 + a1*rpm_desired + a0 a0 = 548.774293191 a1 = 0.190364817645 a2 = 7.20688897007e-06 ESC Params (after scaling): pwm_vs_rpm_curve_a0 = 548.774293191 pwm_vs_rpm_curve_a1 = 0.190364817645 pwm_vs_rpm_curve_a2 = 7.20688897007e-06 # id 2 10-70 Quadratic fit: motor_voltage = a2*rpm_desired^2 + a1*rpm_desired + a0 a0 = 675.453322502 a1 = 0.155364517851 a2 = 7.82726105851e-06 ESC Params (after scaling): pwm_vs_rpm_curve_a0 = 675.453322502 pwm_vs_rpm_curve_a1 = 0.155364517851 pwm_vs_rpm_curve_a2 = 7.82726105851e-06 # id 3 10-70 Quadratic fit: motor_voltage = a2*rpm_desired^2 + a1*rpm_desired + a0 a0 = 546.435106547 a1 = 0.186792306929 a2 = 7.24528267391e-06 ESC Params (after scaling): pwm_vs_rpm_curve_a0 = 546.435106547 pwm_vs_rpm_curve_a1 = 0.186792306929 pwm_vs_rpm_curve_a2 = 7.24528267391e-06
ESC-params that I used
<EscParameters> <IdParams> <param name="id" value="127"/> <!-- 0-7 .. 127 means use hardware ID pins to read ID --> <param name="dir" value="2"/> <!-- 0=fwd, 1=rev, 2=fwd id-based, 3=rev id-based --> </IdParams> <UartParams> <param name="protocol_version" value="2"/> <!-- reserved for future use --> <param name="input_mode" value="0"/> <!-- reserved for future use --> <param name="baud_rate" value="250000"/> <!-- communication bit rate --> <param name="char_timeout_ns" value="0"/> <!-- not used --> <param name="cmd_timeout_ns" value="100000000"/> <!-- timeout for incoming commands before ESC will stop the motor --> </UartParams> <TuneParams> <param name="pwm_frequency" value="48000"/> <!-- switching freqency of PWM signal going to motors. 24Khz and 48Khz are only options for now --> <param name="vbat_nominal_mv" value="14800"/> <!-- used for sanity checking and limiting of voltage-dependent funcions --> <param name="num_cycles_per_rev" value="7"/> <!-- number of pole pairs in the motor. used for converting electrical frequency to mechanical rpm --> <param name="min_rpm" value="5300"/> <!-- minimum RPM that will be attempted, otherwise capped --> <param name="max_rpm" value="30000"/> <!-- maximum RPM that will be attempted, otherwise capped --> <param name="min_pwm" value="50"/> <!-- cap for minimum power to be ever applied. max is 999 --> <param name="max_pwm" value="999"/> <!-- cap for maximum power to be ever applied. max is 999 --> <param name="pwm_vs_rpm_curve_a0" value="567.0806169102507"/> <!-- this is actually motor_voltage vs rpm curve.. using legacy naming --> <param name="pwm_vs_rpm_curve_a1" value="0.18113187121175"/> <!-- Emax RS1306 3300KV with tri-blade 3x3x3 --> <param name="pwm_vs_rpm_curve_a2" value="7.3398525342600135e-06"/> <param name="kp" value="130"/> <!-- RPM controller proportional gain --> <param name="ki" value="30"/> <!-- RPM controller proportional gain --> <param name="max_kpe" value="300"/> <!-- maximum proportional erorr term (max is 999) --> <param name="max_kie" value="100"/> <!-- maximum integral error term (max is 999) --> <param name="max_rpm_delta" value="1200"/> <!-- cap for maximum rpm error used in RPM controller --> <param name="alignment_time_ns" value="0"/> <param name="spinup_power" value="50"/> <!-- power used to give the motor initial kick (out of 999) --> <param name="latch_power" value="60"/> <!-- power used during latching stage of spin-up (out of 999) --> <param name="min_num_cross_for_closed_loop" value="50"/> <!-- exit latching mode of fixed power after this number of zero crossings --> <param name="brake_to_stop" value="0"/> <!-- apply brake when stopping motor (or not) --> <param name="stall_timeout_ns" value="20000000"/> <!-- after spin-up, if no zero crossing is not detected for this amount of time, motor is considered stalled --> <param name="require_reset_if_stalled" value="0"/> <!-- require sending an array of zero commands to reset before next spin-up, if motor stalled --> <param name="tone_freqs" value="[200, 215, 225, 250, 0,0,0,0, 0,0,0,0]"/> <!-- 200 is 2000Hz, max 255 --> <param name="tone_durations" value="[10, 10, 10, 10, 0,0,0,0, 0,0,0,0]"/> <!-- duration of each tone in units of 10 milli-seconds. Poor naming!!! --> <param name="tone_powers" value="[100, 100, 100, 100, 0,0,0,0, 0,0,0,0]"/> <!-- max is 255 --> <param name="dt_threshold_ns" value="150000"/> <!-- during start up, ignore inter-commutation times less than this val, probably noise --> <param name="max_dt_ns" value="2500000"/> <!-- min and max values for time between two commutations. these are used as caps --> <param name="min_dt_ns" value="10000"/> <param name="dt_bootstrap_ns" value="2000000"/> <!-- filter bootstrap value for commutation dt during start up --> <param name="spinup_stall_dt_ns" value="6000000"/> <!-- during spin-up, if no zero crossing is not detected for this amount of time, motor is considered stalled --> <param name="spinup_stall_check_ns" value="30000000"/> <!-- time after beginning of spinup to start checking for spinup stall --> <param name="timing_advance" value="0"/> <param name="sense_advance" value="0"/> <param name="demag_timing" value="0"/> <!-- unused --> </TuneParams> </EscParameters>
-
@dlee , motor heating can result from noisy RPM commands coming from the flight controller and ESC trying to execute them. To test if this is the case, please set
kp
andki
to ZERO and repeat the test. This will disable the Proportional and Integral term of the RPM controller, but will still use the feed-forward term, which will achieve close to desired RPM and response time will be slower (basically similar to a traditional ESC without closed-loop control). -
@Alex-Kushleyev Thanks a lot. Your answer was very helpful. Now, I can fly my drone stably.
-
@dlee , that is great to hear!
Since lowering ESC kp and ki to zero helped, it may mean one of the several potential issues outside of ESC:
- the flight controller (gyro) is measuring too much vibration from propellers (is there vibration dampening in your design?)
- your attitude controller Derivative gain may be too high, causing the noisy gyro data to be amplified and sent to motors
However, if the vehicle is flying well right now, perhaps you do not need to do anything else. Tuning down the ESC response acts as a low pass filter that filters out the noisy RPM commands.
-