mirror of https://github.com/ArduPilot/ardupilot
Plane: implement new TRIM_AUTO functionality
this fixes TRIM_AUTO for new scaled output approach to servo functions
This commit is contained in:
parent
b50ab75f4c
commit
725244ff8a
|
@ -687,7 +687,7 @@ const AP_Param::Info Plane::var_info[] = {
|
||||||
|
|
||||||
// @Param: TRIM_AUTO
|
// @Param: TRIM_AUTO
|
||||||
// @DisplayName: Automatic trim adjustment
|
// @DisplayName: Automatic trim adjustment
|
||||||
// @Description: Set RC trim PWM levels to current levels when switching away from manual mode. When this option is enabled and you change from MANUAL to any other mode then the APM will take the current position of the control sticks as the trim values for aileron, elevator and rudder. It will use those to set RC1_TRIM, RC2_TRIM and RC4_TRIM. This option is disabled by default as if a pilot is not aware of this option and changes from MANUAL to another mode while control inputs are not centered then the trim could be changed to a dangerously bad value. You can enable this option to assist with trimming your plane, by enabling it before takeoff then switching briefly to MANUAL in flight, and seeing how the plane reacts. You can then switch back to FBWA, trim the surfaces then again test MANUAL mode. Each time you switch from MANUAL the APM will take your control inputs as the new trim. After you have good trim on your aircraft you can disable TRIM_AUTO for future flights.
|
// @Description: Set RC trim PWM levels to current levels when switching away from manual mode. When this option is enabled and you change from MANUAL to any other mode then the APM will take the current position of the control sticks as the trim values for aileron, elevator and rudder. It will use those to set the SERVOn_TRIM values and the RCn_TRIM values. This option is disabled by default as if a pilot is not aware of this option and changes from MANUAL to another mode while control inputs are not centered then the trim could be changed to a dangerously bad value. You can enable this option to assist with trimming your plane, by enabling it before takeoff then switching briefly to MANUAL in flight, and seeing how the plane reacts. You can then switch back to FBWA, trim the surfaces then again test MANUAL mode. Each time you switch from MANUAL the APM will take your control inputs as the new trim. After you have good trim on your aircraft you can disable TRIM_AUTO for future flights. You should also see the newer and much safer SERVO_AUTO_TRIM parameter.
|
||||||
// @Values: 0:Disabled,1:Enabled
|
// @Values: 0:Disabled,1:Enabled
|
||||||
// @User: Standard
|
// @User: Standard
|
||||||
GSCALAR(auto_trim, "TRIM_AUTO", AUTO_TRIM),
|
GSCALAR(auto_trim, "TRIM_AUTO", AUTO_TRIM),
|
||||||
|
|
|
@ -314,42 +314,51 @@ void Plane::trim_control_surfaces()
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Store control surface trim values
|
// trim ailerons if not used as old elevons
|
||||||
// ---------------------------------
|
if (g.elevon_output == MIXING_DISABLED) {
|
||||||
if(g.mix_mode == 0) {
|
SRV_Channels::set_trim_to_servo_out_for(SRV_Channel::k_aileron);
|
||||||
if (channel_roll->get_radio_in() != 0) {
|
|
||||||
channel_roll->set_radio_trim(channel_roll->get_radio_in());
|
|
||||||
}
|
|
||||||
if (channel_pitch->get_radio_in() != 0) {
|
|
||||||
channel_pitch->set_radio_trim(channel_pitch->get_radio_in());
|
|
||||||
}
|
|
||||||
|
|
||||||
// the secondary aileron/elevator is trimmed only if it has a
|
|
||||||
// corresponding transmitter input channel, which k_aileron
|
|
||||||
// doesn't have
|
|
||||||
SRV_Channels::set_trim_to_radio_in_for(SRV_Channel::k_aileron_with_input);
|
|
||||||
SRV_Channels::set_trim_to_radio_in_for(SRV_Channel::k_elevator_with_input);
|
|
||||||
} else{
|
|
||||||
if (elevon.ch1_temp != 0) {
|
|
||||||
elevon.trim1 = elevon.ch1_temp;
|
|
||||||
}
|
|
||||||
if (elevon.ch2_temp != 0) {
|
|
||||||
elevon.trim2 = elevon.ch2_temp;
|
|
||||||
}
|
|
||||||
//Recompute values here using new values for elevon1_trim and elevon2_trim
|
|
||||||
//We cannot use radio_in[CH_ROLL] and radio_in[CH_PITCH] values from read_radio() because the elevon trim values have changed
|
|
||||||
uint16_t center = 1500;
|
|
||||||
channel_roll->set_radio_trim(center);
|
|
||||||
channel_pitch->set_radio_trim(center);
|
|
||||||
}
|
|
||||||
if (channel_rudder->get_radio_in() != 0) {
|
|
||||||
channel_rudder->set_radio_trim(channel_rudder->get_radio_in());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// save to eeprom
|
// trim elevator if not used as old elevons or vtail
|
||||||
channel_roll->save_eeprom();
|
if (g.elevon_output == MIXING_DISABLED && g.vtail_output == MIXING_DISABLED) {
|
||||||
channel_pitch->save_eeprom();
|
SRV_Channels::set_trim_to_servo_out_for(SRV_Channel::k_elevator);
|
||||||
channel_rudder->save_eeprom();
|
}
|
||||||
|
|
||||||
|
// trim rudder if not used as old vtail
|
||||||
|
if (g.vtail_output == MIXING_DISABLED) {
|
||||||
|
SRV_Channels::set_trim_to_servo_out_for(SRV_Channel::k_rudder);
|
||||||
|
}
|
||||||
|
|
||||||
|
SRV_Channels::set_trim_to_servo_out_for(SRV_Channel::k_aileron_with_input);
|
||||||
|
SRV_Channels::set_trim_to_servo_out_for(SRV_Channel::k_elevator_with_input);
|
||||||
|
|
||||||
|
// trim elevons
|
||||||
|
SRV_Channels::set_trim_to_servo_out_for(SRV_Channel::k_elevon_left);
|
||||||
|
SRV_Channels::set_trim_to_servo_out_for(SRV_Channel::k_elevon_right);
|
||||||
|
|
||||||
|
// trim vtail
|
||||||
|
SRV_Channels::set_trim_to_servo_out_for(SRV_Channel::k_vtail_left);
|
||||||
|
SRV_Channels::set_trim_to_servo_out_for(SRV_Channel::k_vtail_right);
|
||||||
|
|
||||||
|
if (SRV_Channels::get_output_scaled(SRV_Channel::k_rudder) == 0) {
|
||||||
|
// trim differential spoilers if no rudder input
|
||||||
|
SRV_Channels::set_trim_to_servo_out_for(SRV_Channel::k_dspoilerLeft1);
|
||||||
|
SRV_Channels::set_trim_to_servo_out_for(SRV_Channel::k_dspoilerLeft2);
|
||||||
|
SRV_Channels::set_trim_to_servo_out_for(SRV_Channel::k_dspoilerRight1);
|
||||||
|
SRV_Channels::set_trim_to_servo_out_for(SRV_Channel::k_dspoilerRight1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (SRV_Channels::get_output_scaled(SRV_Channel::k_flap_auto) == 0 &&
|
||||||
|
SRV_Channels::get_output_scaled(SRV_Channel::k_flap) == 0) {
|
||||||
|
// trim flaperons if no flap input
|
||||||
|
SRV_Channels::set_trim_to_servo_out_for(SRV_Channel::k_flaperon_left);
|
||||||
|
SRV_Channels::set_trim_to_servo_out_for(SRV_Channel::k_flaperon_right);
|
||||||
|
}
|
||||||
|
|
||||||
|
// now save input trims, as these have been moved to the outputs
|
||||||
|
channel_roll->set_and_save_trim();
|
||||||
|
channel_pitch->set_and_save_trim();
|
||||||
|
channel_rudder->set_and_save_trim();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Plane::trim_radio()
|
void Plane::trim_radio()
|
||||||
|
|
Loading…
Reference in New Issue