1
0
Fork 0
mirror of https://github.com/betaflight/betaflight-configurator.git synced 2025-07-17 21:35:33 +03:00

Work with gyro native sampling

This commit is contained in:
Miguel Angel Mulero Martinez 2020-02-04 11:35:03 +01:00
parent 55aab38680
commit 9394d5901c
7 changed files with 115 additions and 73 deletions

View file

@ -1358,6 +1358,18 @@
"configurationCalculatedCyclesSec": {
"message": "Cycles/Sec [Hz]"
},
"configurationSpeedGyroNoGyro": {
"message": "No gyro",
"description": "When no gyro is configured this appears in place of the speed of the gyro in kHz"
},
"configurationSpeedPidNoGyro": {
"message": "Gyro / {{value}}",
"description": "When no gyro is configured this appears in place of the speed of the PID in kHz. Try to keep it short."
},
"configurationKHzUnitLabel": {
"message": "{{value}} kHz",
"description": "Value for some options that show the speed of gyro, pid, etc. in kHz"
},
"configurationLoopTimeHelp": {
"message": "<strong>Note:</strong> Make sure your FC is able to operate at these speeds! Check CPU and cycletime stability. Changing this may require PID re-tuning. TIP: Disable Accelerometer and other sensors to gain more performance."
},

View file

@ -432,10 +432,18 @@
width: 100%;
}
.tab-configuration .gyroSyncDenom, .tab-configuration .pidProcessDenom {
.tab-configuration .gyroSyncDenom, .tab-configuration .pidProcessDenom, .tab-configuration .gyroFrequency {
width:90px;
}
.tab-configuration .gyroFrequency {
border: none;
background-color: var(--alternativeBackground);
padding-left: 6px;
margin-right: 10px;
font-weight: bold;
}
.tab-configuration ._3dSettings {
margin-top: 10px;
float: left;

View file

@ -104,6 +104,7 @@ var FC = {
signature: [],
mcuTypeId: 255,
configurationState: 0,
sampleRateHz: 0,
};
BF_CONFIG = {

View file

@ -800,6 +800,11 @@ MspHelper.prototype.process_data = function(dataHandler) {
if (semver.gte(CONFIG.apiVersion, "1.42.0")) {
CONFIG.configurationState = data.readU8();
if (semver.gte(CONFIG.apiVersion, "1.43.0")) {
CONFIG.sampleRateHz = data.readU16();
}
}
} else {
CONFIG.mcuTypeId = 255;

View file

@ -557,57 +557,73 @@ TABS.configuration.initialize = function (callback, scrollPosition) {
}).change();
// Gyro and PID update
var gyroUse32kHz_e = $('input[id="gyroUse32kHz"]');
var gyro_select_e = $('select.gyroSyncDenom');
var pid_select_e = $('select.pidProcessDenom');
const gyroUse32kHzElement = $('input[id="gyroUse32kHz"]');
const gyroTextElement = $('input.gyroFrequency');
const gyroSelectElement = $('select.gyroSyncDenom');
const pidSelectElement = $('select.pidProcessDenom');
function addDenomOption(element, denom, baseFreq) {
element.append('<option value="' + denom + '">' + ((baseFreq / denom * 100).toFixed(0) / 100) + ' kHz</option>');
let denomDescription;
if (baseFreq === 0) {
denomDescription = i18n.getMessage('configurationSpeedPidNoGyro', {'value' : denom});
} else {
denomDescription = i18n.getMessage('configurationKHzUnitLabel', { 'value' : (baseFreq / denom).toFixed(2)});
}
element.append(`<option value="${denom}">${denomDescription}</option>`);
}
var updateGyroDenom = function (gyroBaseFreq) {
var originalGyroDenom = gyro_select_e.val();
const updateGyroDenom = function (gyroBaseFreq) {
gyro_select_e.empty();
gyroTextElement.hide();
var denom = 1;
while (denom <= 8) {
addDenomOption(gyro_select_e, denom, gyroBaseFreq);
denom ++;
const originalGyroDenom = gyroSelectElement.val();
gyroSelectElement.empty();
const MAX_DENOM = semver.gte(CONFIG.apiVersion, "1.25.0") ? 32 : 8;
for (let denom = 1; denom <= MAX_DENOM; denom++) {
addDenomOption(gyroSelectElement, denom, gyroBaseFreq);
}
if (semver.gte(CONFIG.apiVersion, "1.25.0")) {
while (denom <= 32) {
addDenomOption(gyro_select_e, denom, gyroBaseFreq);
gyroSelectElement.val(originalGyroDenom);
denom ++;
gyroSelectElement.change();
};
const updateGyroDenomReadOnly = function (gyroFrequency) {
gyroSelectElement.hide();
let gyroContent;
if (gyroFrequency === 0) {
gyroContent = i18n.getMessage('configurationSpeedGyroNoGyro');
} else {
gyroContent = i18n.getMessage('configurationKHzUnitLabel', { 'value' : (gyroFrequency / 1000).toFixed(2)});
}
}
gyro_select_e.val(originalGyroDenom);
gyro_select_e.change();
gyroTextElement.val(gyroContent);
};
if (semver.gte(CONFIG.apiVersion, "1.25.0") && semver.lt(CONFIG.apiVersion, "1.41.0")) {
gyroUse32kHz_e.prop('checked', PID_ADVANCED_CONFIG.gyroUse32kHz !== 0);
gyroUse32kHzElement.prop('checked', PID_ADVANCED_CONFIG.gyroUse32kHz !== 0);
gyroUse32kHz_e.change(function () {
var gyroBaseFreq;
if ($(this).is(':checked')) {
gyroBaseFreq = 32;
} else {
gyroBaseFreq = 8;
}
gyroUse32kHzElement.change(function () {
const gyroBaseFreq = ($(this).is(':checked'))? 32 : 8;
updateGyroDenom(gyroBaseFreq);
}).change();
} else {
$('div.gyroUse32kHz').hide();
if (semver.gte(CONFIG.apiVersion, "1.43.0")) {
updateGyroDenomReadOnly(CONFIG.sampleRateHz);
} else {
updateGyroDenom(8);
}
gyroSelectElement.val(PID_ADVANCED_CONFIG.gyro_sync_denom);
}
if (semver.gte(CONFIG.apiVersion, "1.41.0")) {
$('.systemconfigNote').html(i18n.getMessage('configurationLoopTimeNo32KhzHelp'));
@ -615,39 +631,32 @@ TABS.configuration.initialize = function (callback, scrollPosition) {
$('.systemconfigNote').html(i18n.getMessage('configurationLoopTimeHelp'));
}
gyro_select_e.val(PID_ADVANCED_CONFIG.gyro_sync_denom);
gyroSelectElement.change(function () {
const originalPidDenom = pidSelectElement.val();
gyro_select_e.change(function () {
var originalPidDenom = pid_select_e.val();
var pidBaseFreq = 8;
if (semver.gte(CONFIG.apiVersion, "1.25.0") && semver.lt(CONFIG.apiVersion, "1.41.0") && gyroUse32kHz_e.is(':checked')) {
let pidBaseFreq;
if (semver.gte(CONFIG.apiVersion, "1.43.0")) {
pidBaseFreq = CONFIG.sampleRateHz / 1000;
} else {
pidBaseFreq = 8;
if (semver.gte(CONFIG.apiVersion, "1.25.0") && semver.lt(CONFIG.apiVersion, "1.41.0") && gyroUse32kHzElement.is(':checked')) {
pidBaseFreq = 32;
}
pidBaseFreq = pidBaseFreq / parseInt($(this).val());
pid_select_e.empty();
var denom = 1;
while (denom <= 8) {
addDenomOption(pid_select_e, denom, pidBaseFreq);
denom ++;
}
if (semver.gte(CONFIG.apiVersion, "1.24.0")) {
while (denom <= 16) {
addDenomOption(pid_select_e, denom, pidBaseFreq);
pidSelectElement.empty();
denom ++;
}
const MAX_DENOM = semver.gte(CONFIG.apiVersion, "1.24.0") ? 16 : 8;
for (let denom = 1; denom <= MAX_DENOM; denom++) {
addDenomOption(pidSelectElement, denom, pidBaseFreq);
}
pid_select_e.val(originalPidDenom);
pidSelectElement.val(originalPidDenom);
}).change();
pid_select_e.val(PID_ADVANCED_CONFIG.pid_process_denom);
pidSelectElement.val(PID_ADVANCED_CONFIG.pid_process_denom);
$('input[id="accHardwareSwitch"]').prop('checked', SENSOR_CONFIG.acc_hardware !== 1);
$('input[id="baroHardwareSwitch"]').prop('checked', SENSOR_CONFIG.baro_hardware !== 1);
@ -1194,8 +1203,8 @@ TABS.configuration.initialize = function (callback, scrollPosition) {
PID_ADVANCED_CONFIG.fast_pwm_protocol = parseInt(esc_protocol_e.val()-1);
PID_ADVANCED_CONFIG.use_unsyncedPwm = $('input[id="unsyncedPWMSwitch"]').is(':checked') ? 1 : 0;
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.pid_process_denom = parseInt(pid_select_e.val());
PID_ADVANCED_CONFIG.gyro_sync_denom = parseInt(gyroSelectElement.val());
PID_ADVANCED_CONFIG.pid_process_denom = parseInt(pidSelectElement.val());
PID_ADVANCED_CONFIG.digitalIdlePercent = parseFloat($('input[name="digitalIdlePercent"]').val());
if (semver.gte(CONFIG.apiVersion, "1.25.0") && semver.lt(CONFIG.apiVersion, "1.41.0")) {
PID_ADVANCED_CONFIG.gyroUse32kHz = $('input[id="gyroUse32kHz"]').is(':checked') ? 1 : 0;

View file

@ -192,15 +192,21 @@ TABS.onboard_logging.initialize = function (callback) {
function populateLoggingRates(loggingRatesSelect) {
// Offer a reasonable choice of logging rates (if people want weird steps they can use CLI)
var loggingRates = [];
var pidRateBase = 8000;
let loggingRates = [];
let pidRate;
if (semver.gte(CONFIG.apiVersion, "1.43.0")) {
pidRate = CONFIG.sampleRateHz / PID_ADVANCED_CONFIG.pid_process_denom;
} else {
let pidRateBase = 8000;
if (semver.gte(CONFIG.apiVersion, "1.25.0") && semver.lt(CONFIG.apiVersion, "1.41.0") && PID_ADVANCED_CONFIG.gyroUse32kHz !== 0) {
pidRateBase = 32000;
}
var pidRate = pidRateBase / PID_ADVANCED_CONFIG.gyro_sync_denom /
PID_ADVANCED_CONFIG.pid_process_denom;
pidRate = pidRateBase / PID_ADVANCED_CONFIG.gyro_sync_denom / PID_ADVANCED_CONFIG.pid_process_denom;
}
if (semver.gte(CONFIG.apiVersion, "1.36.0")) {
loggingRates = [

View file

@ -60,6 +60,7 @@
<div class="helpicon cf_tip" i18n_title="configurationGyroUse32kHzHelp"></div>
</div>
<div class="select">
<input type="text" class="gyroFrequency" readonly />
<select class="gyroSyncDenom">
<!-- list generated here -->
</select>