mirror of
https://github.com/PX4/PX4-Autopilot.git
synced 2026-05-31 02:16:53 +08:00
multirotor_attitude_control performance improved, tested in flight. PID library new functionality and bugfixes.
This commit is contained in:
@@ -128,8 +128,8 @@ int fixedwing_att_control_attitude(const struct vehicle_attitude_setpoint_s *att
|
|||||||
if (!initialized) {
|
if (!initialized) {
|
||||||
parameters_init(&h);
|
parameters_init(&h);
|
||||||
parameters_update(&h, &p);
|
parameters_update(&h, &p);
|
||||||
pid_init(&roll_controller, p.roll_p, 0, 0, 0, p.rollrate_lim, PID_MODE_DERIVATIV_NONE); //P Controller
|
pid_init(&roll_controller, p.roll_p, 0, 0, 0, p.rollrate_lim, PID_MODE_DERIVATIV_NONE, 0.0f); //P Controller
|
||||||
pid_init(&pitch_controller, p.pitch_p, 0, 0, 0, p.pitchrate_lim, PID_MODE_DERIVATIV_NONE); //P Controller
|
pid_init(&pitch_controller, p.pitch_p, 0, 0, 0, p.pitchrate_lim, PID_MODE_DERIVATIV_NONE, 0.0f); //P Controller
|
||||||
initialized = true;
|
initialized = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -179,9 +179,9 @@ int fixedwing_att_control_rates(const struct vehicle_rates_setpoint_s *rate_sp,
|
|||||||
if (!initialized) {
|
if (!initialized) {
|
||||||
parameters_init(&h);
|
parameters_init(&h);
|
||||||
parameters_update(&h, &p);
|
parameters_update(&h, &p);
|
||||||
pid_init(&roll_rate_controller, p.rollrate_p, p.rollrate_i, 0, p.rollrate_awu, 1, PID_MODE_DERIVATIV_NONE); // set D part to 0 because the controller layout is with a PI rate controller
|
pid_init(&roll_rate_controller, p.rollrate_p, p.rollrate_i, 0, p.rollrate_awu, 1, PID_MODE_DERIVATIV_NONE, 0.0f); // set D part to 0 because the controller layout is with a PI rate controller
|
||||||
pid_init(&pitch_rate_controller, p.pitchrate_p, p.pitchrate_i, 0, p.pitchrate_awu, 1, PID_MODE_DERIVATIV_NONE); // set D part to 0 because the contpitcher layout is with a PI rate contpitcher
|
pid_init(&pitch_rate_controller, p.pitchrate_p, p.pitchrate_i, 0, p.pitchrate_awu, 1, PID_MODE_DERIVATIV_NONE, 0.0f); // set D part to 0 because the contpitcher layout is with a PI rate contpitcher
|
||||||
pid_init(&yaw_rate_controller, p.yawrate_p, p.yawrate_i, 0, p.yawrate_awu, 1, PID_MODE_DERIVATIV_NONE); // set D part to 0 because the contpitcher layout is with a PI rate contpitcher
|
pid_init(&yaw_rate_controller, p.yawrate_p, p.yawrate_i, 0, p.yawrate_awu, 1, PID_MODE_DERIVATIV_NONE, 0.0f); // set D part to 0 because the contpitcher layout is with a PI rate contpitcher
|
||||||
initialized = true;
|
initialized = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -239,10 +239,10 @@ int fixedwing_pos_control_thread_main(int argc, char *argv[])
|
|||||||
|
|
||||||
parameters_init(&h);
|
parameters_init(&h);
|
||||||
parameters_update(&h, &p);
|
parameters_update(&h, &p);
|
||||||
pid_init(&heading_controller, p.heading_p, 0.0f, 0.0f, 0.0f, 10000.0f, PID_MODE_DERIVATIV_NONE); //arbitrary high limit
|
pid_init(&heading_controller, p.heading_p, 0.0f, 0.0f, 0.0f, 10000.0f, PID_MODE_DERIVATIV_NONE, 0.0f); //arbitrary high limit
|
||||||
pid_init(&heading_rate_controller, p.headingr_p, p.headingr_i, 0.0f, 0.0f, p.roll_lim, PID_MODE_DERIVATIV_NONE);
|
pid_init(&heading_rate_controller, p.headingr_p, p.headingr_i, 0.0f, 0.0f, p.roll_lim, PID_MODE_DERIVATIV_NONE, 0.0f);
|
||||||
pid_init(&altitude_controller, p.altitude_p, 0.0f, 0.0f, 0.0f, p.pitch_lim, PID_MODE_DERIVATIV_NONE);
|
pid_init(&altitude_controller, p.altitude_p, 0.0f, 0.0f, 0.0f, p.pitch_lim, PID_MODE_DERIVATIV_NONE, 0.0f);
|
||||||
pid_init(&offtrack_controller, p.xtrack_p, 0.0f, 0.0f, 0.0f , 60.0f * M_DEG_TO_RAD, PID_MODE_DERIVATIV_NONE); //TODO: remove hardcoded value
|
pid_init(&offtrack_controller, p.xtrack_p, 0.0f, 0.0f, 0.0f , 60.0f * M_DEG_TO_RAD, PID_MODE_DERIVATIV_NONE, 0.0f); //TODO: remove hardcoded value
|
||||||
|
|
||||||
/* error and performance monitoring */
|
/* error and performance monitoring */
|
||||||
perf_counter_t fw_interval_perf = perf_alloc(PC_INTERVAL, "fixedwing_pos_control_interval");
|
perf_counter_t fw_interval_perf = perf_alloc(PC_INTERVAL, "fixedwing_pos_control_interval");
|
||||||
|
|||||||
@@ -163,16 +163,12 @@ void multirotor_control_attitude(const struct vehicle_attitude_setpoint_s *att_s
|
|||||||
static uint64_t last_run = 0;
|
static uint64_t last_run = 0;
|
||||||
static uint64_t last_input = 0;
|
static uint64_t last_input = 0;
|
||||||
float deltaT = (hrt_absolute_time() - last_run) / 1000000.0f;
|
float deltaT = (hrt_absolute_time() - last_run) / 1000000.0f;
|
||||||
float dT_input = (hrt_absolute_time() - last_input) / 1000000.0f;
|
|
||||||
last_run = hrt_absolute_time();
|
last_run = hrt_absolute_time();
|
||||||
|
|
||||||
if (last_input != att_sp->timestamp) {
|
if (last_input != att_sp->timestamp) {
|
||||||
last_input = att_sp->timestamp;
|
last_input = att_sp->timestamp;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int sensor_delay;
|
|
||||||
sensor_delay = hrt_absolute_time() - att->timestamp;
|
|
||||||
|
|
||||||
static int motor_skip_counter = 0;
|
static int motor_skip_counter = 0;
|
||||||
|
|
||||||
static PID_t pitch_controller;
|
static PID_t pitch_controller;
|
||||||
@@ -190,10 +186,8 @@ void multirotor_control_attitude(const struct vehicle_attitude_setpoint_s *att_s
|
|||||||
parameters_init(&h);
|
parameters_init(&h);
|
||||||
parameters_update(&h, &p);
|
parameters_update(&h, &p);
|
||||||
|
|
||||||
pid_init(&pitch_controller, p.att_p, p.att_i, p.att_d, 1000.0f,
|
pid_init(&pitch_controller, p.att_p, p.att_i, p.att_d, 1000.0f, 1000.0f, PID_MODE_DERIVATIV_SET, 0.0f);
|
||||||
1000.0f, PID_MODE_DERIVATIV_SET);
|
pid_init(&roll_controller, p.att_p, p.att_i, p.att_d, 1000.0f, 1000.0f, PID_MODE_DERIVATIV_SET, 0.0f);
|
||||||
pid_init(&roll_controller, p.att_p, p.att_i, p.att_d, 1000.0f,
|
|
||||||
1000.0f, PID_MODE_DERIVATIV_SET);
|
|
||||||
|
|
||||||
initialized = true;
|
initialized = true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,9 @@
|
|||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
*
|
*
|
||||||
* Copyright (C) 2012 PX4 Development Team. All rights reserved.
|
* Copyright (C) 2013 PX4 Development Team. All rights reserved.
|
||||||
* Author: Tobias Naegeli <naegelit@student.ethz.ch>
|
* Author: Tobias Naegeli <naegelit@student.ethz.ch>
|
||||||
* Lorenz Meier <lm@inf.ethz.ch>
|
* Lorenz Meier <lm@inf.ethz.ch>
|
||||||
|
* Anton Babushkin <anton.babushkin@me.com>
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions
|
* modification, are permitted provided that the following conditions
|
||||||
@@ -40,6 +41,7 @@
|
|||||||
*
|
*
|
||||||
* @author Tobias Naegeli <naegelit@student.ethz.ch>
|
* @author Tobias Naegeli <naegelit@student.ethz.ch>
|
||||||
* @author Lorenz Meier <lm@inf.ethz.ch>
|
* @author Lorenz Meier <lm@inf.ethz.ch>
|
||||||
|
* @author Anton Babushkin <anton.babushkin@me.com>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "multirotor_rate_control.h"
|
#include "multirotor_rate_control.h"
|
||||||
@@ -150,14 +152,10 @@ static int parameters_update(const struct mc_rate_control_param_handles *h, stru
|
|||||||
void multirotor_control_rates(const struct vehicle_rates_setpoint_s *rate_sp,
|
void multirotor_control_rates(const struct vehicle_rates_setpoint_s *rate_sp,
|
||||||
const float rates[], struct actuator_controls_s *actuators)
|
const float rates[], struct actuator_controls_s *actuators)
|
||||||
{
|
{
|
||||||
static float roll_control_last = 0;
|
|
||||||
static float pitch_control_last = 0;
|
|
||||||
static uint64_t last_run = 0;
|
static uint64_t last_run = 0;
|
||||||
const float deltaT = (hrt_absolute_time() - last_run) / 1000000.0f;
|
const float deltaT = (hrt_absolute_time() - last_run) / 1000000.0f;
|
||||||
static uint64_t last_input = 0;
|
static uint64_t last_input = 0;
|
||||||
|
|
||||||
float dT_input = (hrt_absolute_time() - last_input) / 1000000.0f;
|
|
||||||
|
|
||||||
if (last_input != rate_sp->timestamp) {
|
if (last_input != rate_sp->timestamp) {
|
||||||
last_input = rate_sp->timestamp;
|
last_input = rate_sp->timestamp;
|
||||||
}
|
}
|
||||||
@@ -166,6 +164,9 @@ void multirotor_control_rates(const struct vehicle_rates_setpoint_s *rate_sp,
|
|||||||
|
|
||||||
static int motor_skip_counter = 0;
|
static int motor_skip_counter = 0;
|
||||||
|
|
||||||
|
static PID_t pitch_rate_controller;
|
||||||
|
static PID_t roll_rate_controller;
|
||||||
|
|
||||||
static struct mc_rate_control_params p;
|
static struct mc_rate_control_params p;
|
||||||
static struct mc_rate_control_param_handles h;
|
static struct mc_rate_control_param_handles h;
|
||||||
|
|
||||||
@@ -176,43 +177,35 @@ void multirotor_control_rates(const struct vehicle_rates_setpoint_s *rate_sp,
|
|||||||
parameters_init(&h);
|
parameters_init(&h);
|
||||||
parameters_update(&h, &p);
|
parameters_update(&h, &p);
|
||||||
initialized = true;
|
initialized = true;
|
||||||
|
|
||||||
|
pid_init(&pitch_rate_controller, p.attrate_p, p.attrate_i, p.attrate_d, 1.0f, 1.0f, PID_MODE_DERIVATIV_CALC_NO_SP, 0.003f);
|
||||||
|
pid_init(&roll_rate_controller, p.attrate_p, p.attrate_i, p.attrate_d, 1.0f, 1.0f, PID_MODE_DERIVATIV_CALC_NO_SP, 0.003f);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* load new parameters with lower rate */
|
/* load new parameters with lower rate */
|
||||||
if (motor_skip_counter % 2500 == 0) {
|
if (motor_skip_counter % 2500 == 0) {
|
||||||
/* update parameters from storage */
|
/* update parameters from storage */
|
||||||
parameters_update(&h, &p);
|
parameters_update(&h, &p);
|
||||||
// warnx("rate ctrl: p.yawrate_p: %8.4f, loop: %d Hz, input: %d Hz",
|
pid_set_parameters(&pitch_rate_controller, p.attrate_p, p.attrate_i, p.attrate_d, 1.0f, 1.0f);
|
||||||
// (double)p.yawrate_p, (int)(1.0f/deltaT), (int)(1.0f/dT_input));
|
pid_set_parameters(&roll_rate_controller, p.attrate_p, p.attrate_i, p.attrate_d, 1.0f, 1.0f);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* calculate current control outputs */
|
/* reset integral if on ground */
|
||||||
|
if (rate_sp->thrust < 0.01f) {
|
||||||
|
pid_reset_integral(&pitch_rate_controller);
|
||||||
|
pid_reset_integral(&roll_rate_controller);
|
||||||
|
}
|
||||||
|
|
||||||
/* control pitch (forward) output */
|
/* control pitch (forward) output */
|
||||||
float pitch_control = p.attrate_p * (rate_sp->pitch - rates[1]) - (p.attrate_d * pitch_control_last);
|
float pitch_control = pid_calculate(&pitch_rate_controller, rate_sp->pitch ,
|
||||||
|
rates[1], 0.0f, deltaT);
|
||||||
/* increase resilience to faulty control inputs */
|
|
||||||
if (isfinite(pitch_control)) {
|
|
||||||
pitch_control_last = pitch_control;
|
|
||||||
|
|
||||||
} else {
|
|
||||||
pitch_control = 0.0f;
|
|
||||||
warnx("rej. NaN ctrl pitch");
|
|
||||||
}
|
|
||||||
|
|
||||||
/* control roll (left/right) output */
|
/* control roll (left/right) output */
|
||||||
float roll_control = p.attrate_p * (rate_sp->roll - rates[0]) - (p.attrate_d * roll_control_last);
|
float roll_control = pid_calculate(&roll_rate_controller, rate_sp->roll ,
|
||||||
|
rates[0], 0.0f, deltaT);
|
||||||
|
|
||||||
/* increase resilience to faulty control inputs */
|
/* control yaw rate */ //XXX use library here
|
||||||
if (isfinite(roll_control)) {
|
|
||||||
roll_control_last = roll_control;
|
|
||||||
|
|
||||||
} else {
|
|
||||||
roll_control = 0.0f;
|
|
||||||
warnx("rej. NaN ctrl roll");
|
|
||||||
}
|
|
||||||
|
|
||||||
/* control yaw rate */
|
|
||||||
float yaw_rate_control = p.yawrate_p * (rate_sp->yaw - rates[2]);
|
float yaw_rate_control = p.yawrate_p * (rate_sp->yaw - rates[2]);
|
||||||
|
|
||||||
/* increase resilience to faulty control inputs */
|
/* increase resilience to faulty control inputs */
|
||||||
|
|||||||
@@ -1,9 +1,10 @@
|
|||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
*
|
*
|
||||||
* Copyright (C) 2008-2012 PX4 Development Team. All rights reserved.
|
* Copyright (C) 2008-2013 PX4 Development Team. All rights reserved.
|
||||||
* Author: @author Laurens Mackay <mackayl@student.ethz.ch>
|
* Author: @author Laurens Mackay <mackayl@student.ethz.ch>
|
||||||
* @author Tobias Naegeli <naegelit@student.ethz.ch>
|
* @author Tobias Naegeli <naegelit@student.ethz.ch>
|
||||||
* @author Martin Rutschmann <rutmarti@student.ethz.ch>
|
* @author Martin Rutschmann <rutmarti@student.ethz.ch>
|
||||||
|
* @author Anton Babushkin <anton.babushkin@me.com>
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions
|
* modification, are permitted provided that the following conditions
|
||||||
@@ -43,7 +44,7 @@
|
|||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
|
||||||
__EXPORT void pid_init(PID_t *pid, float kp, float ki, float kd, float intmax,
|
__EXPORT void pid_init(PID_t *pid, float kp, float ki, float kd, float intmax,
|
||||||
float limit, uint8_t mode)
|
float limit, uint8_t mode, float dt_min)
|
||||||
{
|
{
|
||||||
pid->kp = kp;
|
pid->kp = kp;
|
||||||
pid->ki = ki;
|
pid->ki = ki;
|
||||||
@@ -51,13 +52,13 @@ __EXPORT void pid_init(PID_t *pid, float kp, float ki, float kd, float intmax,
|
|||||||
pid->intmax = intmax;
|
pid->intmax = intmax;
|
||||||
pid->limit = limit;
|
pid->limit = limit;
|
||||||
pid->mode = mode;
|
pid->mode = mode;
|
||||||
pid->count = 0;
|
pid->dt_min = dt_min;
|
||||||
pid->saturated = 0;
|
pid->count = 0.0f;
|
||||||
pid->last_output = 0;
|
pid->saturated = 0.0f;
|
||||||
|
pid->last_output = 0.0f;
|
||||||
pid->sp = 0;
|
pid->sp = 0.0f;
|
||||||
pid->error_previous = 0;
|
pid->error_previous = 0.0f;
|
||||||
pid->integral = 0;
|
pid->integral = 0.0f;
|
||||||
}
|
}
|
||||||
__EXPORT int pid_set_parameters(PID_t *pid, float kp, float ki, float kd, float intmax, float limit)
|
__EXPORT int pid_set_parameters(PID_t *pid, float kp, float ki, float kd, float intmax, float limit)
|
||||||
{
|
{
|
||||||
@@ -136,14 +137,14 @@ __EXPORT float pid_calculate(PID_t *pid, float sp, float val, float val_dot, flo
|
|||||||
// Calculated current error value
|
// Calculated current error value
|
||||||
float error = pid->sp - val;
|
float error = pid->sp - val;
|
||||||
|
|
||||||
if (isfinite(error)) { // Why is this necessary? DEW
|
|
||||||
pid->error_previous = error;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Calculate or measured current error derivative
|
// Calculate or measured current error derivative
|
||||||
|
|
||||||
if (pid->mode == PID_MODE_DERIVATIV_CALC) {
|
if (pid->mode == PID_MODE_DERIVATIV_CALC) {
|
||||||
d = (error - pid->error_previous) / dt;
|
d = (error - pid->error_previous) / fmaxf(dt, pid->dt_min);
|
||||||
|
pid->error_previous = error;
|
||||||
|
|
||||||
|
} else if (pid->mode == PID_MODE_DERIVATIV_CALC_NO_SP) {
|
||||||
|
d = (-val - pid->error_previous) / fmaxf(dt, pid->dt_min);
|
||||||
|
pid->error_previous = -val;
|
||||||
|
|
||||||
} else if (pid->mode == PID_MODE_DERIVATIV_SET) {
|
} else if (pid->mode == PID_MODE_DERIVATIV_SET) {
|
||||||
d = -val_dot;
|
d = -val_dot;
|
||||||
@@ -152,6 +153,10 @@ __EXPORT float pid_calculate(PID_t *pid, float sp, float val, float val_dot, flo
|
|||||||
d = 0.0f;
|
d = 0.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!isfinite(d)) {
|
||||||
|
d = 0.0f;
|
||||||
|
}
|
||||||
|
|
||||||
// Calculate the error integral and check for saturation
|
// Calculate the error integral and check for saturation
|
||||||
i = pid->integral + (error * dt);
|
i = pid->integral + (error * dt);
|
||||||
|
|
||||||
@@ -162,7 +167,7 @@ __EXPORT float pid_calculate(PID_t *pid, float sp, float val, float val_dot, flo
|
|||||||
|
|
||||||
} else {
|
} else {
|
||||||
if (!isfinite(i)) {
|
if (!isfinite(i)) {
|
||||||
i = 0;
|
i = 0.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
pid->integral = i;
|
pid->integral = i;
|
||||||
@@ -170,17 +175,19 @@ __EXPORT float pid_calculate(PID_t *pid, float sp, float val, float val_dot, flo
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Calculate the output. Limit output magnitude to pid->limit
|
// Calculate the output. Limit output magnitude to pid->limit
|
||||||
float output = (pid->error_previous * pid->kp) + (i * pid->ki) + (d * pid->kd);
|
float output = (error * pid->kp) + (i * pid->ki) + (d * pid->kd);
|
||||||
|
|
||||||
if (output > pid->limit) output = pid->limit;
|
|
||||||
|
|
||||||
if (output < -pid->limit) output = -pid->limit;
|
|
||||||
|
|
||||||
if (isfinite(output)) {
|
if (isfinite(output)) {
|
||||||
|
if (output > pid->limit) {
|
||||||
|
output = pid->limit;
|
||||||
|
|
||||||
|
} else if (output < -pid->limit) {
|
||||||
|
output = -pid->limit;
|
||||||
|
}
|
||||||
|
|
||||||
pid->last_output = output;
|
pid->last_output = output;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
return pid->last_output;
|
return pid->last_output;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +1,10 @@
|
|||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
*
|
*
|
||||||
* Copyright (C) 2008-2012 PX4 Development Team. All rights reserved.
|
* Copyright (C) 2008-2013 PX4 Development Team. All rights reserved.
|
||||||
* Author: @author Laurens Mackay <mackayl@student.ethz.ch>
|
* Author: @author Laurens Mackay <mackayl@student.ethz.ch>
|
||||||
* @author Tobias Naegeli <naegelit@student.ethz.ch>
|
* @author Tobias Naegeli <naegelit@student.ethz.ch>
|
||||||
* @author Martin Rutschmann <rutmarti@student.ethz.ch>
|
* @author Martin Rutschmann <rutmarti@student.ethz.ch>
|
||||||
|
* @author Anton Babushkin <anton.babushkin@me.com>
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions
|
* modification, are permitted provided that the following conditions
|
||||||
@@ -47,8 +48,11 @@
|
|||||||
/* PID_MODE_DERIVATIV_CALC calculates discrete derivative from previous error
|
/* PID_MODE_DERIVATIV_CALC calculates discrete derivative from previous error
|
||||||
* val_dot in pid_calculate() will be ignored */
|
* val_dot in pid_calculate() will be ignored */
|
||||||
#define PID_MODE_DERIVATIV_CALC 0
|
#define PID_MODE_DERIVATIV_CALC 0
|
||||||
|
/* PID_MODE_DERIVATIV_CALC_NO_SP calculates discrete derivative from previous value, setpoint derivative is ignored
|
||||||
|
* val_dot in pid_calculate() will be ignored */
|
||||||
|
#define PID_MODE_DERIVATIV_CALC_NO_SP 1
|
||||||
/* Use PID_MODE_DERIVATIV_SET if you have the derivative already (Gyros, Kalman) */
|
/* Use PID_MODE_DERIVATIV_SET if you have the derivative already (Gyros, Kalman) */
|
||||||
#define PID_MODE_DERIVATIV_SET 1
|
#define PID_MODE_DERIVATIV_SET 2
|
||||||
// Use PID_MODE_DERIVATIV_NONE for a PI controller (vs PID)
|
// Use PID_MODE_DERIVATIV_NONE for a PI controller (vs PID)
|
||||||
#define PID_MODE_DERIVATIV_NONE 9
|
#define PID_MODE_DERIVATIV_NONE 9
|
||||||
|
|
||||||
@@ -62,12 +66,13 @@ typedef struct {
|
|||||||
float error_previous;
|
float error_previous;
|
||||||
float last_output;
|
float last_output;
|
||||||
float limit;
|
float limit;
|
||||||
|
float dt_min;
|
||||||
uint8_t mode;
|
uint8_t mode;
|
||||||
uint8_t count;
|
uint8_t count;
|
||||||
uint8_t saturated;
|
uint8_t saturated;
|
||||||
} PID_t;
|
} PID_t;
|
||||||
|
|
||||||
__EXPORT void pid_init(PID_t *pid, float kp, float ki, float kd, float intmax, float limit, uint8_t mode);
|
__EXPORT void pid_init(PID_t *pid, float kp, float ki, float kd, float intmax, float limit, uint8_t mode, float dt_min);
|
||||||
__EXPORT int pid_set_parameters(PID_t *pid, float kp, float ki, float kd, float intmax, float limit);
|
__EXPORT int pid_set_parameters(PID_t *pid, float kp, float ki, float kd, float intmax, float limit);
|
||||||
//void pid_set(PID_t *pid, float sp);
|
//void pid_set(PID_t *pid, float sp);
|
||||||
__EXPORT float pid_calculate(PID_t *pid, float sp, float val, float val_dot, float dt);
|
__EXPORT float pid_calculate(PID_t *pid, float sp, float val, float val_dot, float dt);
|
||||||
|
|||||||
Reference in New Issue
Block a user