mirror of
https://gitee.com/mirrors_PX4/PX4-Autopilot.git
synced 2026-10-06 15:08:53 +08:00
use trim values to set mixer:scaler.offset
clamp mixer output offset to [-.2,.2] ([-2000, 2000] in mixer file) add 8 main PWM trim parameters add long desc to parameters and bump minor parameter version
This commit is contained in:
committed by
Lorenz Meier
parent
619efa7b45
commit
a0c8a78a14
@@ -192,6 +192,7 @@ public:
|
||||
*/
|
||||
virtual void set_max_delta_out_once(float delta_out_max) {};
|
||||
|
||||
virtual unsigned set_trim(float trim) = 0;
|
||||
|
||||
protected:
|
||||
/** client-supplied callback used when fetching control values */
|
||||
@@ -333,6 +334,17 @@ public:
|
||||
*/
|
||||
virtual void set_max_delta_out_once(float delta_out_max);
|
||||
|
||||
/*
|
||||
* Invoke the set_offset method of each mixer in the group
|
||||
* for each value in page r_page_servo_control_trim
|
||||
*/
|
||||
unsigned set_trims(uint16_t *v, unsigned n);
|
||||
|
||||
unsigned set_trim(float trim)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
private:
|
||||
Mixer *_first; /**< linked list of mixers */
|
||||
|
||||
@@ -369,6 +381,12 @@ public:
|
||||
|
||||
virtual unsigned mix(float *outputs, unsigned space, uint16_t *status_reg);
|
||||
virtual void groups_required(uint32_t &groups);
|
||||
virtual void set_offset(float trim) {};
|
||||
unsigned set_trim(float trim)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -445,6 +463,8 @@ public:
|
||||
*/
|
||||
int check();
|
||||
|
||||
unsigned set_trim(float trim);
|
||||
|
||||
protected:
|
||||
|
||||
private:
|
||||
@@ -551,6 +571,11 @@ public:
|
||||
*/
|
||||
virtual void set_max_delta_out_once(float delta_out_max) {_delta_out_max = delta_out_max;}
|
||||
|
||||
unsigned set_trim(float trim)
|
||||
{
|
||||
return _rotor_count;
|
||||
}
|
||||
|
||||
private:
|
||||
float _roll_scale;
|
||||
float _pitch_scale;
|
||||
|
||||
@@ -112,6 +112,28 @@ MixerGroup::mix(float *outputs, unsigned space, uint16_t *status_reg)
|
||||
return index;
|
||||
}
|
||||
|
||||
unsigned
|
||||
MixerGroup::set_trims(uint16_t *values, unsigned n)
|
||||
{
|
||||
Mixer *mixer = _first;
|
||||
unsigned index = 0;
|
||||
|
||||
while ((mixer != nullptr) && (index < n)) {
|
||||
/* hardwired assumption that PWM output range is [1000, 2000] usec */
|
||||
float offset = ((float)values[index] - 1500) / 500;
|
||||
|
||||
/* to be safe, clamp offset to range of [-100, 100] usec */
|
||||
if (offset < -0.2f) { offset = -0.2f; }
|
||||
|
||||
if (offset > 0.2f) { offset = 0.2f; }
|
||||
|
||||
index += mixer->set_trim(offset);
|
||||
mixer = mixer->_next;
|
||||
}
|
||||
|
||||
return index;
|
||||
}
|
||||
|
||||
unsigned
|
||||
MixerGroup::count()
|
||||
{
|
||||
|
||||
@@ -72,6 +72,12 @@ SimpleMixer::~SimpleMixer()
|
||||
}
|
||||
}
|
||||
|
||||
unsigned SimpleMixer::set_trim(float trim)
|
||||
{
|
||||
_pinfo->output_scaler.offset = trim;
|
||||
return 1;
|
||||
}
|
||||
|
||||
int
|
||||
SimpleMixer::parse_output_scaler(const char *buf, unsigned &buflen, mixer_scaler_s &scaler)
|
||||
{
|
||||
|
||||
@@ -206,15 +206,15 @@ void pwm_limit_calc(const bool armed, const bool pre_armed, const unsigned num_c
|
||||
control_value = -1.0f * control_value;
|
||||
}
|
||||
|
||||
if (trim_pwm[i] == 0) {
|
||||
effective_pwm[i] = control_value * (max_pwm[i] - min_pwm[i]) / 2 + (max_pwm[i] + min_pwm[i]) / 2;
|
||||
// if (trim_pwm[i] == 0) {
|
||||
effective_pwm[i] = control_value * (max_pwm[i] - min_pwm[i]) / 2 + (max_pwm[i] + min_pwm[i]) / 2;
|
||||
|
||||
} else if (control_value < 0) {
|
||||
effective_pwm[i] = control_value * (trim_pwm[i] - min_pwm[i]) + trim_pwm[i];
|
||||
|
||||
} else {
|
||||
effective_pwm[i] = control_value * (max_pwm[i] - trim_pwm[i]) + trim_pwm[i];
|
||||
}
|
||||
// } else if (control_value < 0) {
|
||||
// effective_pwm[i] = control_value * (trim_pwm[i] - min_pwm[i]) + trim_pwm[i];
|
||||
//
|
||||
// } else {
|
||||
// effective_pwm[i] = control_value * (max_pwm[i] - trim_pwm[i]) + trim_pwm[i];
|
||||
// }
|
||||
|
||||
/* last line of defense against invalid inputs */
|
||||
if (effective_pwm[i] < min_pwm[i]) {
|
||||
|
||||
Reference in New Issue
Block a user