Advertisement
Guest User

Untitled

a guest
Jun 25th, 2019
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.67 KB | None | 0 0
  1. #include "nnxt.h"
  2. #include <stdio.h>
  3.  
  4. #define DEG_TO_RPM 166.6667 // Umrechnungsfaktor [°/ms] in [U/min]
  5. #define PI 3.14159
  6.  
  7. double to_cm_in_sek(double rpm) {
  8.  
  9. double durchmesser = 4.12;
  10. double umfang = PI * durchmesser;
  11. double sekunden = 60.0;
  12.  
  13. return rpm * umfang / sekunden;
  14. }
  15.  
  16. void MotorLinks(){
  17. char rpmMsg[25]; // enthält Umdrehung/min als String für Ausgabe auf Display
  18. uint32_t prev_deg, deg; // deg enthält Differenz vom Zähler jetzt und bei der letzten Messung vor 500ms (prev_deg)
  19. double dt, prev_tick = GetSysTime(); // dt enthält Differenz der Zeiten jetzt und der Zeit der letzten Messung (prev_tick)
  20. double rpm; // enthält Wert der Umdrehungen pro Minute
  21. double sIst = 0, sSoll, sDelta = 0;
  22.  
  23. double s=0,a;
  24. double sDeltaAlt;
  25. uint8_t speed = 20;
  26.  
  27. MotorPortInit(Port_A);
  28. MotorPortInit(Port_B);
  29. Motor_Tacho_GetCounter(Port_A, &prev_deg);
  30. Motor_Drive(Port_A, Motor_dir_forward, speed); // hier gerne mal anpassen und probieren
  31. Motor_Drive(Port_B, Motor_dir_forward, speed); // hier gerne mal anpassen und probieren
  32. while(1) {
  33. Delay(500); // Abtastintervall 500ms
  34. dt = GetSysTime() - prev_tick; // Zeitdifferenz seit letzter Messung ermitteln
  35. Motor_Tacho_GetCounter(Port_A, &deg);
  36. deg = deg - prev_deg; // um wieviel ist der Umdrehungszähler seit letzter Messung gewachsen
  37. rpm = ((deg*2.045) * DEG_TO_RPM) / (double)dt; // deg*1.33 weil Auflösung Drehzahlsensor 1 Digit entspr. 1,33 Grad
  38. Motor_Tacho_GetCounter(Port_A, &prev_deg); // Zählerstand für nächste Messung vorbereiten
  39. prev_tick = GetSysTime(); // Zeitmessung für nächste Messung vorbereiten
  40.  
  41.  
  42. sIst = to_cm_in_sek(rpm); // aktuelle geschwindigkeit [cm/s]
  43. sSoll = 6.0; // gegebene geschwindigkeit [cm/s]
  44. //sDelta = sSoll - sIst; // differenz geschwindigkeit [cm/s]
  45. dt = dt/1000; // Umwandlung ms in s
  46. sDelta = sSoll - sIst ; // strecke
  47.  
  48.  
  49. s = s + sDelta; // aktuelle differenz der strecke
  50.  
  51. // P-Regler
  52. //a = 1.8 * sDelta;
  53.  
  54. // PI-Regler
  55. //a = 1.4 * sDelta + 1.1 * dt * s;
  56.  
  57. // PD-Regler
  58. //a = 1.8 * sDelta + (1.0 * (sDelta - sDeltaAlt)/dt) ;
  59.  
  60. //PID-Regler
  61. a = 20 + 0.1 * sDelta + 0.2 * dt * s + (0.1 * (sDelta - sDeltaAlt) / dt);
  62.  
  63. sDeltaAlt = sDelta; // speichern des alten Delta
  64.  
  65. // Motor geschwindigkeit
  66. //speed = (int8_t)speed + (int8_t)a;
  67. Motor_Drive(Port_A, Motor_dir_forward, a);
  68. Motor_Drive(Port_B, Motor_dir_forward, a);
  69.  
  70. // Ausgabe
  71. sprintf(rpmMsg,"%d rpm",(int)rpm);
  72. NNXT_LCD_DisplayStringAtLine(0,rpmMsg);
  73.  
  74. sprintf(rpmMsg,"%d cm/s sDelta",(int)sDelta);
  75. NNXT_LCD_DisplayStringAtLine(1,rpmMsg);
  76.  
  77. sprintf(rpmMsg,"%d cm/s sDeltaDif",(int)(sDelta - sDeltaAlt));
  78. NNXT_LCD_DisplayStringAtLine(2,rpmMsg);
  79.  
  80. sprintf(rpmMsg,"%d s",(int)s);
  81. NNXT_LCD_DisplayStringAtLine(3,rpmMsg);
  82.  
  83. sprintf(rpmMsg,"%d a",(int)a);
  84. NNXT_LCD_DisplayStringAtLine(4,rpmMsg);
  85.  
  86. sprintf(rpmMsg,"speed %d ",speed);
  87. NNXT_LCD_DisplayStringAtLine(5,rpmMsg);
  88. }
  89. return 0;
  90. }
  91.  
  92. void MotorRechts(){
  93.  
  94. }
  95.  
  96. int main(){
  97.  
  98.  
  99. CreateAndStartTask(MotorLinks);
  100. //CreateAndStartTask(MotorRechts);
  101. StartScheduler();
  102.  
  103. return 0;
  104. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement