jayadamsmorgan

AnglePID.cpp

Apr 21st, 2016
40
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.39 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <algorithm>
  4. #include <ctime>
  5.  
  6. int sample_time, current_time, last_time = 0.0f;
  7. float Pitch_PTerm, Pitch_DTerm, Pitch_ITerm = 0.0f;
  8. float Yaw_PTerm, Yaw_DTerm, Yaw_ITerm = 0.0f;float error, last_error, int_error = 0.0f;
  9. float windup_guard = 3.6f; //max value of Integral part of PID
  10. float SetPoint = 0.0f;
  11.  
  12. using namespace std;
  13.  
  14. int yawPID(float currentAngle, float targetAngle, float P, float I, float D) {
  15.         SetPoint = targetAngle;
  16.         error = std::min(SetPoint - currentAngle, 360.0f - (SetPoint - currentAngle));
  17.         current_time = millis();
  18.         float delta_time = current_time - last_time;
  19.         float delta_error = error - last_error;
  20.         if (delta_time >= sample_time) {
  21.                 Yaw_PTerm = P * error;
  22.                 Yaw_ITerm += error * delta_time;
  23.         }
  24.         if (Yaw_ITerm < -windup_guard) {
  25.                 Yaw_ITerm = -windup_guard;
  26.         } else if (Yaw_ITerm > windup_guard) {
  27.                 Yaw_ITerm = windup_guard;
  28.         }
  29.         Yaw_DTerm = 0.0f;
  30.         if (delta_time > 0.0f) {
  31.                 Yaw_DTerm = delta_error / delta_time;
  32.         }
  33.         last_time = current_time;
  34.         last_error = error;
  35.         int output = (int)(Yaw_PTerm + (I * Yaw_ITerm) + (D * Yaw_DTerm));
  36.         return output;
  37. }
  38.  
  39. int pitchPID(float currentAngle, float targetAngle, float P, float I, float D) {
  40.         SetPoint = targetAngle;
  41.         error = std::min(SetPoint - currentAngle, 360.0f - (SetPoint - currentAngle));
  42.         current_time = millis();
  43.         float delta_time = current_time - last_time;
  44.         float delta_error = error - last_error;
  45.         if (delta_time >= sample_time) {
  46.                 Pitch_PTerm = P * error;
  47.                 Pitch_ITerm += error * delta_time;
  48.         }
  49.         if (Pitch_ITerm < -windup_guard) {
  50.                 Pitch_ITerm = -windup_guard;
  51.         } else if (Pitch_ITerm > windup_guard) {
  52.                 Pitch_ITerm = windup_guard;
  53.         }
  54.         Pitch_DTerm = 0.0f;
  55.         if (delta_time > 0.0f) {
  56.                 Pitch_DTerm = delta_error / delta_time;
  57.         }
  58.         last_time = current_time;
  59.         last_error = error;
  60.         int output = (int)(Pitch_PTerm + (I * Pitch_ITerm) + (D * Pitch_DTerm));
  61.         return output;
  62. }
  63.  
  64.  
  65. //set interval for PID
  66. void setSampleTime(float newSampleTime) {
  67.         sample_time = newSampleTime;
  68. }
Add Comment
Please, Sign In to add comment