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>