Merge pull request #375 from mikeller/add_throttle_idle_percent_value

Add throttle idle percent value
10.3.x-maintenance
borisbstyle 2017-01-08 22:37:22 +01:00 committed by GitHub
commit 109a8030ba
5 changed files with 172 additions and 74 deletions

View File

@ -644,11 +644,17 @@
"configurationMidRcHelp": { "configurationMidRcHelp": {
"message": "This is the center value <span style=\"font-weight: bold\">for all RC channels</span>. Set this to the value that your transmitter sends when the stick is centered for a channel. To adjust the thrust at throttle mid position, change the 'Trottle MID' value on the PID Tuning tab." "message": "This is the center value <span style=\"font-weight: bold\">for all RC channels</span>. Set this to the value that your transmitter sends when the stick is centered for a channel. To adjust the thrust at throttle mid position, change the 'Trottle MID' value on the PID Tuning tab."
}, },
"configurationDigitalIdlePercent": {
"message": "Motor Idle Throttle Value (percent)"
},
"configurationDigitalIdlePercentHelp": {
"message": "This is the 'idle' value in percent of maximum throttle that is sent to the ESCs when the craft is armed and the trottle stick is at minimum position. Increase the percent value to gain more idle speed."
},
"configurationThrottleMinimum": { "configurationThrottleMinimum": {
"message": "Minimum Throttle" "message": "Motor Idle Throttle Value (absolute / percent)"
}, },
"configurationThrottleMinimumHelp": { "configurationThrottleMinimumHelp": {
"message": "This is the 'idle' value that is sent to the ESCs when the craft is armed and the trottle stick is at minimum position. Adjust this so the motors run as slow as possible while still running smoothly." "message": "This is the 'idle' value (absolute / as a percentage of the throttle range) that is sent to the ESCs when the craft is armed and the trottle stick is at minimum position. Increase the value or to gain more idle speed."
}, },
"configurationThrottleMaximum": { "configurationThrottleMaximum": {
"message": "Maximum Throttle" "message": "Maximum Throttle"
@ -1839,6 +1845,15 @@
"configurationPidProcessDenom": { "configurationPidProcessDenom": {
"message": "PID loop frequency" "message": "PID loop frequency"
}, },
"configurationPidProcessDenomHelp": {
"message": "The maximum frequency for the PID loop is limited by the maximum frequency that updates can be sent by the chosen ESC / motor protocol."
},
"configurationGyroUse32kHz": {
"message": "Use 32 kHz gyro update frequency instead of 8 kHz"
},
"configurationGyroUse32kHzHelp": {
"message": "32 kHz gyro update frequency is only possible if the gyro chip supports it (currently MPU6500, MPU9250, and ICM20689 if connected over SPI). If in doubt, consult the specification for your board."
},
"configurationAccHardware": { "configurationAccHardware": {
"message": "Accelerometer" "message": "Accelerometer"
}, },

View File

@ -256,7 +256,9 @@ var FC = {
pid_process_denom: 0, pid_process_denom: 0,
use_unsyncedPwm: 0, use_unsyncedPwm: 0,
fast_pwm_protocol: 0, fast_pwm_protocol: 0,
motor_pwm_rate: 0 motor_pwm_rate: 0,
digitalIdlePercent: 0,
gyroUse32kHz: 0
}; };
FILTER_CONFIG = { FILTER_CONFIG = {
@ -283,7 +285,9 @@ var FC = {
toleranceBandReduction: 0, toleranceBandReduction: 0,
itermThrottleGain: 0, itermThrottleGain: 0,
pidMaxVelocity: 0, pidMaxVelocity: 0,
pidMaxVelocityYaw: 0 pidMaxVelocityYaw: 0,
levelAngleLimit: 0,
levelSensitivity: 0
}; };
SENSOR_CONFIG = { SENSOR_CONFIG = {

View File

@ -617,6 +617,13 @@ MspHelper.prototype.process_data = function(dataHandler) {
PID_ADVANCED_CONFIG.use_unsyncedPwm = data.readU8(); PID_ADVANCED_CONFIG.use_unsyncedPwm = data.readU8();
PID_ADVANCED_CONFIG.fast_pwm_protocol = data.readU8(); PID_ADVANCED_CONFIG.fast_pwm_protocol = data.readU8();
PID_ADVANCED_CONFIG.motor_pwm_rate = data.readU16(); PID_ADVANCED_CONFIG.motor_pwm_rate = data.readU16();
if (semver.gte(CONFIG.apiVersion, "1.24.0")) {
PID_ADVANCED_CONFIG.digitalIdlePercent = data.readU16() / 100;
if (semver.gte(CONFIG.apiVersion, "1.25.0")) {
PID_ADVANCED_CONFIG.gyroUse32kHz = data.readU8();
}
}
break; break;
case MSPCodes.MSP_FILTER_CONFIG: case MSPCodes.MSP_FILTER_CONFIG:
FILTER_CONFIG.gyro_soft_lpf_hz = data.readU8(); FILTER_CONFIG.gyro_soft_lpf_hz = data.readU8();
@ -651,6 +658,10 @@ MspHelper.prototype.process_data = function(dataHandler) {
ADVANCED_TUNING.pidMaxVelocity = data.readU16(); ADVANCED_TUNING.pidMaxVelocity = data.readU16();
ADVANCED_TUNING.pidMaxVelocityYaw = data.readU16(); ADVANCED_TUNING.pidMaxVelocityYaw = data.readU16();
} }
if (semver.gte(CONFIG.apiVersion, "1.24.0")) {
ADVANCED_TUNING.levelAngleLimit = data.readU8();
ADVANCED_TUNING.levelSensitivity = data.readU8();
}
break; break;
case MSPCodes.MSP_SENSOR_CONFIG: case MSPCodes.MSP_SENSOR_CONFIG:
SENSOR_CONFIG.acc_hardware = data.readU8(); SENSOR_CONFIG.acc_hardware = data.readU8();
@ -1130,6 +1141,13 @@ MspHelper.prototype.crunch = function(code) {
.push8(PID_ADVANCED_CONFIG.use_unsyncedPwm) .push8(PID_ADVANCED_CONFIG.use_unsyncedPwm)
.push8(PID_ADVANCED_CONFIG.fast_pwm_protocol) .push8(PID_ADVANCED_CONFIG.fast_pwm_protocol)
.push16(PID_ADVANCED_CONFIG.motor_pwm_rate); .push16(PID_ADVANCED_CONFIG.motor_pwm_rate);
if (semver.gte(CONFIG.apiVersion, "1.24.0")) {
buffer.push16(PID_ADVANCED_CONFIG.digitalIdlePercent * 100);
if (semver.gte(CONFIG.apiVersion, "1.25.0")) {
buffer.push8(PID_ADVANCED_CONFIG.gyroUse32kHz);
}
}
break; break;
case MSPCodes.MSP_SET_FILTER_CONFIG: case MSPCodes.MSP_SET_FILTER_CONFIG:
buffer.push8(FILTER_CONFIG.gyro_soft_lpf_hz) buffer.push8(FILTER_CONFIG.gyro_soft_lpf_hz)
@ -1160,6 +1178,10 @@ MspHelper.prototype.crunch = function(code) {
.push8(ADVANCED_TUNING.itermThrottleGain) .push8(ADVANCED_TUNING.itermThrottleGain)
.push16(ADVANCED_TUNING.pidMaxVelocity) .push16(ADVANCED_TUNING.pidMaxVelocity)
.push16(ADVANCED_TUNING.pidMaxVelocityYaw); .push16(ADVANCED_TUNING.pidMaxVelocityYaw);
if (semver.gte(CONFIG.apiVersion, "1.24.0")) {
buffer.push8(ADVANCED_TUNING.levelAngleLimit)
.push8(ADVANCED_TUNING.levelSensitivity);
}
} }
// only supports 1 version pre bf 3.0 // only supports 1 version pre bf 3.0
else { else {

View File

@ -90,16 +90,28 @@
<div class="helpicon cf_tip" i18n_title="configurationMidRcHelp"></div> <div class="helpicon cf_tip" i18n_title="configurationMidRcHelp"></div>
</label> </label>
</div> </div>
<div class="number"> <div class="number digitalIdlePercent">
<label>
<div class="numberspacer">
<input type="number" name="digitalIdlePercent" min="0.00" max="20.00" step="0.01"/>
</div>
<span i18n="configurationDigitalIdlePercent"></span>
<div class="helpicon cf_tip" i18n_title="configurationDigitalIdlePercentHelp"></div>
</label>
</div>
<div class="number minthrottle">
<label> <label>
<div class="numberspacer"> <div class="numberspacer">
<input type="number" name="minthrottle" min="0" max="2000" /> <input type="number" name="minthrottle" min="0" max="2000" />
</div> </div>
<div class="numberspacer">
<input type="number" name="idlePercent" min="0.00" max="20.00" step="0.01"/>
</div>
<span i18n="configurationThrottleMinimum"></span> <span i18n="configurationThrottleMinimum"></span>
<div class="helpicon cf_tip" i18n_title="configurationThrottleMinimumHelp"></div> <div class="helpicon cf_tip" i18n_title="configurationThrottleMinimumHelp"></div>
</label> </label>
</div> </div>
<div class="number"> <div class="number maxthrottle">
<label> <label>
<div class="numberspacer"> <div class="numberspacer">
<input type="number" name="maxthrottle" min="0" max="2000" /> <input type="number" name="maxthrottle" min="0" max="2000" />
@ -107,7 +119,7 @@
<span i18n="configurationThrottleMaximum"></span> <span i18n="configurationThrottleMaximum"></span>
</label> </label>
</div> </div>
<div class="number"> <div class="number mincommand">
<label> <label>
<div class="numberspacer"> <div class="numberspacer">
<input type="number" name="mincommand" min="0" max="2000" /> <input type="number" name="mincommand" min="0" max="2000" />
@ -252,6 +264,14 @@
<p i18n="configurationLoopTimeHelp"></p> <p i18n="configurationLoopTimeHelp"></p>
</div> </div>
</div> </div>
<div class="select gyroUse32kHz">
<div style="float: left; height: 20px; margin-right: 15px; margin-left: 3px;">
<input type="checkbox" id="gyroUse32kHz" class="toggle" />
</div>
<label for="gyroUse32kHz"> <span class="freelabel" i18n="configurationGyroUse32kHz"></span>
</label>
<div class="helpicon cf_tip" i18n_title="configurationGyroUse32kHzHelp"></div>
</div>
<div class="select"> <div class="select">
<label> <label>
<select class="gyroSyncDenom"> <select class="gyroSyncDenom">
@ -266,6 +286,7 @@
<!-- list generated here --> <!-- list generated here -->
</select> </select>
<span i18n="configurationPidProcessDenom"></span> <span i18n="configurationPidProcessDenom"></span>
<div class="helpicon cf_tip" i18n_title="configurationPidProcessDenomHelp"></div>
</label> </label>
</div> </div>
<div class="hardwareSelection"> <div class="hardwareSelection">

View File

@ -1,6 +1,8 @@
'use strict'; 'use strict';
TABS.configuration = {}; TABS.configuration = {
DSHOT_PROTOCOL_MIN_VALUE: 5
};
TABS.configuration.initialize = function (callback, scrollPosition) { TABS.configuration.initialize = function (callback, scrollPosition) {
var self = this; var self = this;
@ -156,7 +158,6 @@ TABS.configuration.initialize = function (callback, scrollPosition) {
// select current mixer configuration // select current mixer configuration
mixer_list_e.val(BF_CONFIG.mixerConfiguration).change(); mixer_list_e.val(BF_CONFIG.mixerConfiguration).change();
var radioGroups = [];
var features_e = $('.tab-configuration .features'); var features_e = $('.tab-configuration .features');
BF_CONFIG.features.generateElements(features_e); BF_CONFIG.features.generateElements(features_e);
@ -175,13 +176,10 @@ TABS.configuration.initialize = function (callback, scrollPosition) {
'CW 270° flip' 'CW 270° flip'
]; ];
var orientation_gyro_e = $('select.gyroalign'); var orientation_gyro_e = $('select.gyroalign');
var orientation_acc_e = $('select.accalign'); var orientation_acc_e = $('select.accalign');
var orientation_mag_e = $('select.magalign'); var orientation_mag_e = $('select.magalign');
if (semver.lt(CONFIG.apiVersion, "1.15.0")) { if (semver.lt(CONFIG.apiVersion, "1.15.0")) {
$('.tab-configuration .sensoralignment').hide(); $('.tab-configuration .sensoralignment').hide();
} else { } else {
@ -196,7 +194,6 @@ TABS.configuration.initialize = function (callback, scrollPosition) {
} }
// ESC protocols // ESC protocols
var escprotocols = [ var escprotocols = [
'PWM', 'PWM',
'ONESHOT125', 'ONESHOT125',
@ -221,79 +218,97 @@ TABS.configuration.initialize = function (callback, scrollPosition) {
} }
esc_protocol_e.val(PID_ADVANCED_CONFIG.fast_pwm_protocol+1); esc_protocol_e.val(PID_ADVANCED_CONFIG.fast_pwm_protocol+1);
esc_protocol_e.change(function () {
if ($(this).val() - 1 >= self.DSHOT_PROTOCOL_MIN_VALUE) {
$('div.minthrottle').hide();
$('div.maxthrottle').hide();
$('div.mincommand').hide();
$('div.digitalIdlePercent').show();
} else {
$('div.minthrottle').show();
$('div.maxthrottle').show();
$('div.mincommand').show();
$('div.digitalIdlePercent').hide();
}
}).change();
$('input[id="unsyncedPWMSwitch"]').prop('checked', PID_ADVANCED_CONFIG.use_unsyncedPwm !== 0); $('input[id="unsyncedPWMSwitch"]').prop('checked', PID_ADVANCED_CONFIG.use_unsyncedPwm !== 0);
$('input[name="unsyncedpwmfreq"]').val(PID_ADVANCED_CONFIG.motor_pwm_rate); $('input[name="unsyncedpwmfreq"]').val(PID_ADVANCED_CONFIG.motor_pwm_rate);
if (PID_ADVANCED_CONFIG.use_unsyncedPwm) { $('input[name="digitalIdlePercent"]').val(PID_ADVANCED_CONFIG.digitalIdlePercent);
$('div.unsyncedpwmfreq').show();
}
else {
$('div.unsyncedpwmfreq').hide();
}
// Gyro and PID update // Gyro and PID update
var gyroFreq = [ var gyroUse32kHz_e = $('input[id="gyroUse32kHz"]');
"8KHz",
"4KHz",
"2.67KHz",
"2KHz",
"1.6KHz",
"1.33KHz",
"1.14KHz",
"1KHz"
];
var gyro_select_e = $('select.gyroSyncDenom'); var gyro_select_e = $('select.gyroSyncDenom');
var pid_select_e = $('select.pidProcessDenom');
for (var i = 0; i < gyroFreq.length; i++) { var updateGyroDenom = function (gyroBaseFreq) {
gyro_select_e.append('<option value="'+(i+1)+'">'+gyroFreq[i]+'</option>'); var originalGyroDenom = gyro_select_e.val();
gyro_select_e.empty();
for (var i = 1; i <= 8; i++) {
gyro_select_e.append('<option value="' + i + '">' + ((gyroBaseFreq / i * 100).toFixed(0) / 100) + ' kHz</option>');
}
gyro_select_e.val(originalGyroDenom);
gyro_select_e.change();
};
if (semver.gte(CONFIG.apiVersion, "1.25.0")) {
gyroUse32kHz_e.prop('checked', PID_ADVANCED_CONFIG.gyroUse32kHz !== 0);
gyroUse32kHz_e.change(function () {
var gyroBaseFreq;
if ($(this).is(':checked')) {
gyroBaseFreq = 32;
} else {
gyroBaseFreq = 8;
}
updateGyroDenom(gyroBaseFreq);
}).change();
} else {
$('div.gyroUse32kHz').hide();
updateGyroDenom(8);
} }
gyro_select_e.val(PID_ADVANCED_CONFIG.gyro_sync_denom); gyro_select_e.val(PID_ADVANCED_CONFIG.gyro_sync_denom);
var gyroDenom = PID_ADVANCED_CONFIG.gyro_sync_denom; gyro_select_e.change(function () {
var pidFreq = [ var originalPidDenom = pid_select_e.val();
8 / (gyroDenom * 1),
8 / (gyroDenom * 2), var pidBaseFreq = 8;
8 / (gyroDenom * 3), if (semver.gte(CONFIG.apiVersion, "1.25.0") && gyroUse32kHz_e.is(':checked')) {
8 / (gyroDenom * 4), pidBaseFreq = 32;
8 / (gyroDenom * 5), }
8 / (gyroDenom * 6),
8 / (gyroDenom * 7), pidBaseFreq = pidBaseFreq / parseInt($(this).val());
8 / (gyroDenom * 8)
]; pid_select_e.empty();
for (var i = 1; i <= 8; i++) {
pid_select_e.append('<option value="' + i + '">' + ((pidBaseFreq / i * 100).toFixed(0) / 100) + ' kHz</option>');
}
if (semver.gte(CONFIG.apiVersion, "1.24.0")) {
for (var i = 9; i <= 16; i++) {
pid_select_e.append('<option value="' + i + '">' + ((pidBaseFreq / i * 100).toFixed(0) / 100) + ' kHz</option>');
}
}
pid_select_e.val(originalPidDenom);
}).change();
var pid_select_e = $('select.pidProcessDenom');
for (var i = 0; i < pidFreq.length; i++) {
var pidF = (1000 * pidFreq[i] / 10); // Could be done better
pidF = pidF.toFixed(0);
pid_select_e.append('<option value="'+(i+1)+'">'+(pidF / 100).toString()+'KHz</option>');
}
pid_select_e.val(PID_ADVANCED_CONFIG.pid_process_denom); pid_select_e.val(PID_ADVANCED_CONFIG.pid_process_denom);
$('select.gyroSyncDenom').change(function() {
var gyroDenom = $('select.gyroSyncDenom').val();
var newPidFreq = [
8 / (gyroDenom * 1),
8 / (gyroDenom * 2),
8 / (gyroDenom * 3),
8 / (gyroDenom * 4),
8 / (gyroDenom * 5),
8 / (gyroDenom * 6),
8 / (gyroDenom * 7),
8 / (gyroDenom * 8)
];
for (var i=0; i<newPidFreq.length;i++) {
var pidF = (1000 * newPidFreq[i] / 10); // Could be done better
pidF = pidF.toFixed(0);
$('select.pidProcessDenom option[value="'+(i+1)+'"]').text((pidF / 100).toString()+'KHz');}
});
$('input[id="accHardwareSwitch"]').prop('checked', SENSOR_CONFIG.acc_hardware !== 1); $('input[id="accHardwareSwitch"]').prop('checked', SENSOR_CONFIG.acc_hardware !== 1);
$('input[id="baroHardwareSwitch"]').prop('checked', SENSOR_CONFIG.baro_hardware !== 1); $('input[id="baroHardwareSwitch"]').prop('checked', SENSOR_CONFIG.baro_hardware !== 1);
$('input[id="magHardwareSwitch"]').prop('checked', SENSOR_CONFIG.mag_hardware !== 1); $('input[id="magHardwareSwitch"]').prop('checked', SENSOR_CONFIG.mag_hardware !== 1);
// Only show these sections for supported FW // Only show these sections for supported FW
if (semver.lt(CONFIG.flightControllerVersion, "2.8.1")) { if (semver.lt(CONFIG.flightControllerVersion, "2.8.1")) {
$('.selectProtocol').hide(); $('.selectProtocol').hide();
@ -311,8 +326,6 @@ TABS.configuration.initialize = function (callback, scrollPosition) {
$('.miscSettings').hide(); $('.miscSettings').hide();
} }
// generate GPS // generate GPS
var gpsProtocols = [ var gpsProtocols = [
'NMEA', 'NMEA',
@ -439,10 +452,30 @@ TABS.configuration.initialize = function (callback, scrollPosition) {
// fill throttle // fill throttle
$('input[name="midrc"]').val(MISC.midrc); $('input[name="midrc"]').val(MISC.midrc);
$('input[name="minthrottle"]').val(MISC.minthrottle); var minThrottle_e = $('input[name="minthrottle"]');
minThrottle_e.val(MISC.minthrottle);
$('input[name="maxthrottle"]').val(MISC.maxthrottle); $('input[name="maxthrottle"]').val(MISC.maxthrottle);
$('input[name="mincommand"]').val(MISC.mincommand); $('input[name="mincommand"]').val(MISC.mincommand);
var idlePercent_e = $('input[name="idlePercent"]');
idlePercent_e.change(function () {
if (esc_protocol_e.val() - 1 < self.DSHOT_PROTOCOL_MIN_VALUE) {
var idlePercent = parseFloat($(this).val())
var minCommand = parseInt($('input[name="mincommand"]').val());
var maxThrottle = parseInt($('input[name="maxthrottle"]').val());
minThrottle_e.val(Math.trunc(minCommand + (maxThrottle - minCommand) * idlePercent / 100));
}
});
minThrottle_e.change(function () {
var minThrottle = parseInt($(this).val());
var minCommand = parseInt($('input[name="mincommand"]').val());
var maxThrottle = parseInt($('input[name="maxthrottle"]').val());
idlePercent_e.val(Math.trunc((minThrottle - minCommand) / (maxThrottle - minCommand) * 10000) / 100);
}).change();
// fill battery // fill battery
if (semver.gte(CONFIG.flightControllerVersion, "3.1.0")) { if (semver.gte(CONFIG.flightControllerVersion, "3.1.0")) {
var batteryMeterTypes = [ var batteryMeterTypes = [
@ -614,7 +647,7 @@ TABS.configuration.initialize = function (callback, scrollPosition) {
} else { } else {
$('div.unsyncedpwmfreq').hide(); $('div.unsyncedpwmfreq').hide();
} }
}); }).change();
$('a.save').click(function () { $('a.save').click(function () {
// gather data that doesn't have automatic change event bound // gather data that doesn't have automatic change event bound
@ -662,6 +695,10 @@ TABS.configuration.initialize = function (callback, scrollPosition) {
PID_ADVANCED_CONFIG.motor_pwm_rate = parseInt($('input[name="unsyncedpwmfreq"]').val()); PID_ADVANCED_CONFIG.motor_pwm_rate = parseInt($('input[name="unsyncedpwmfreq"]').val());
PID_ADVANCED_CONFIG.gyro_sync_denom = parseInt(gyro_select_e.val()); PID_ADVANCED_CONFIG.gyro_sync_denom = parseInt(gyro_select_e.val());
PID_ADVANCED_CONFIG.pid_process_denom = parseInt(pid_select_e.val()); PID_ADVANCED_CONFIG.pid_process_denom = parseInt(pid_select_e.val());
PID_ADVANCED_CONFIG.digitalIdlePercent = parseFloat($('input[name="digitalIdlePercent"]').val());
if (semver.gte(CONFIG.apiVersion, "1.25.0")) {
PID_ADVANCED_CONFIG.gyroUse32kHz = $('input[id="gyroUse32kHz"]').is(':checked') ? 1 : 0;
}
function save_serial_config() { function save_serial_config() {
if (semver.lt(CONFIG.apiVersion, "1.6.0")) { if (semver.lt(CONFIG.apiVersion, "1.6.0")) {
@ -732,7 +769,6 @@ TABS.configuration.initialize = function (callback, scrollPosition) {
var next_callback = save_name; var next_callback = save_name;
if (semver.gte(CONFIG.flightControllerVersion, "2.8.2")) { if (semver.gte(CONFIG.flightControllerVersion, "2.8.2")) {
SENSOR_CONFIG.acc_hardware = $('input[id="accHardwareSwitch"]').is(':checked') ? 0 : 1;
SENSOR_CONFIG.baro_hardware = $('input[id="baroHardwareSwitch"]').is(':checked') ? 0 : 1; SENSOR_CONFIG.baro_hardware = $('input[id="baroHardwareSwitch"]').is(':checked') ? 0 : 1;
SENSOR_CONFIG.mag_hardware = $('input[id="magHardwareSwitch"]').is(':checked') ? 0 : 1; SENSOR_CONFIG.mag_hardware = $('input[id="magHardwareSwitch"]').is(':checked') ? 0 : 1;
MSP.send_message(MSPCodes.MSP_SET_SENSOR_CONFIG, mspHelper.crunch(MSPCodes.MSP_SET_SENSOR_CONFIG), false, next_callback); MSP.send_message(MSPCodes.MSP_SET_SENSOR_CONFIG, mspHelper.crunch(MSPCodes.MSP_SET_SENSOR_CONFIG), false, next_callback);