Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
src/pid_controller.cpp
- Committer:
- rwgriffithv
- Date:
- 2018-11-26
- Revision:
- 3:35deb5c21b33
- Parent:
- 1:6f18bb7a77a5
File content as of revision 3:35deb5c21b33:
#include "pid_controller.h"
#include "globals.h"
PIDController::PIDController() {
reset();
}
void PIDController::reset() {
encoders.reset();
goal_x_ = 0;
goal_w_ = 0;
counts_x_ = 0;
counts_w_ = 0;
error_x_ = 0;
error_w_ = 0;
pwm_x_ = 0;
pwm_w_ = 0;
}
void PIDController::update() {
get_sensor_feedback();
x_controller();
w_controller();
update_motor_pwm();
if (is_done()) {
reset();
}
}
void PIDController::get_sensor_feedback() {
const float k_counts_r = (float)encoders.getPulsesR();
const float k_counts_l = (float)encoders.getPulsesL();
counts_x_ = (k_counts_r + k_counts_l) / 2.0f;
counts_w_ = k_counts_r - 360.0f/357.0f*k_counts_l;
}
void PIDController::x_controller() {
error_prev_x_ = error_x_;
error_x_ = goal_x_ - counts_x_;
pwm_x_ = limit_pwm(g_KPX * error_x_ + g_KDX * (error_x_ - error_prev_x_));
}
void PIDController::w_controller() {
error_prev_w_ = error_w_;
error_w_ = goal_w_ - counts_w_;
pwm_w_ = limit_pwm(g_KPW * error_w_ + g_KDW * (error_w_ - error_prev_w_));
}
void PIDController::update_motor_pwm() {
const float k_pwm_r = pwm_x_ + pwm_w_;
const float k_pwm_l = pwm_x_ - pwm_w_;
if (abs(k_pwm_r) < g_MIN_SPEED && abs(k_pwm_l) < g_MIN_SPEED)
stop_cnt_++;
motors.setRightPwm(k_pwm_r);
motors.setLeftPwm(k_pwm_l);
}
void PIDController::set_goal_x(int counts) { goal_x_ = counts; stop_cnt_ = 0; }
void PIDController::set_goal_w(int counts) { goal_w_ = counts; stop_cnt_ = 0; }
bool PIDController::is_done() const {
return stop_cnt_ > g_DONE_THRESHOLD;
}
char* PIDController::get_data() {
sprintf(data_buf_, "goal_x: %d\tgoal_w: %d\tcounts_x: %.3f\tcounts_w: %.3f\terror_x: %.3f\terror_w: %.3f\tpwm_x: %.3f\tpwm_w: %.3f\n",
goal_x_,
goal_w_,
counts_x_,
counts_w_,
error_x_,
error_w_,
pwm_x_,
pwm_w_);
return data_buf_;
}
float PIDController::limit_pwm(float pwm) const {
if (abs(pwm) > g_MAX_SPEED){
return (pwm > 0) ? g_MAX_SPEED : -g_MAX_SPEED;
} else return pwm;
}
