Advertisement
Guest User

Untitled

a guest
Jul 25th, 2014
211
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 1.29 KB | None | 0 0
  1. #!/bin/bash
  2.  
  3. rm -f a.out
  4.  
  5. gcc -x c - <<EOF
  6. #include <stdio.h>
  7. #include <stdint.h>
  8.  
  9. #define return \
  10.     printf("m=%3.1f x=%2i, p=%3i, i=%7.3f", \
  11.       magic, measured, error, *integral); \
  12.     return
  13.  
  14. float magic;
  15. float kP = 0, kI = 0.1, kD = 0;
  16. float PID_INTERVAL = 1;
  17. int16_t MOTOR_MAX_SPEED = +100;
  18. int16_t MOTOR_MIN_SPEED = -100;
  19. int16_t pid_compute(int measured, int setpoint, uint16_t *prev_error, float *integral)
  20. {
  21.     int16_t error = setpoint - measured;
  22.     int16_t output;
  23.     float derivate;
  24.  
  25.     *integral = *integral*magic + (error * (float)PID_INTERVAL);
  26.     derivate = (error - *prev_error) / (float)PID_INTERVAL;
  27.     output = (kP * error) + (kI * (*integral)) + (kD * derivate);
  28.     *prev_error = error;
  29.  
  30.     if(output > MOTOR_MAX_SPEED) output = MOTOR_MAX_SPEED;
  31.     if(output < MOTOR_MIN_SPEED) output = MOTOR_MIN_SPEED;
  32.  
  33.     return output;
  34. }
  35. #undef return
  36. int main() {
  37.     uint16_t i;
  38.     float integral1, integral2;
  39.     uint16_t x1, e1, x2, e2;
  40.  
  41.     integral1 = x1 = e1 = 0;
  42.     integral2 = x2 = e2 = 0;
  43.     for(i=0;i<100;i++) {
  44.         magic = 1.0; x1 += pid_compute(x1, 10, &e1, &integral1);
  45.         printf(" <-> ");
  46.         magic = 0.9; x2 += pid_compute(x2, 10, &e2, &integral2);
  47.         printf("\n");
  48.     }
  49.     return 0;
  50. }
  51. EOF
  52.  
  53. ./a.out
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement