Advertisement
Guest User

Untitled

a guest
Mar 22nd, 2019
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.90 KB | None | 0 0
  1. #include <PID_v1.h>
  2. #include <Wire.h> // Library für I2C-Interface
  3. #include <LiquidCrystal_I2C.h> // LCD i2c Library einbinden
  4.  
  5. LiquidCrystal_I2C lcd1(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
  6. LiquidCrystal_I2C lcd2(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
  7.  
  8.  
  9. int HallPin = 2;
  10. int pwmPin  = 9;
  11. int PotiPin = 0;
  12.  
  13. //PID parameters
  14. double Kp = 0, Ki = 10, Kd = 0;
  15.  
  16. double Setpoint, Input, Output;
  17.  
  18.  
  19. int Umax = 1500; // Max Drehzahl des Motors
  20. int upmSoll;
  21. int Prozent; // Prozentwert aus Potistellung
  22. int hpin;                       //  Impuls vom Hallgeber
  23.  
  24. float Force; // gemessene Kraft
  25. unsigned long pwm = 0; //
  26. char buf[17]; // Puffer für Zeichenkette
  27. unsigned long upmIst = 0; // aktuell gemessene Drehzahl
  28. int diff = 0; // Differenz zwischen Vorgabe und Ist-Drehzahl
  29. //Define Variables we'll be connecting to
  30. //create PID instance
  31.  
  32. const int AVG = 4; // Glättung über mindestens 4 Messwerte
  33. volatile unsigned long dauer = 0; // microsekunden seit dem letzten Interrupt
  34. volatile unsigned long last = 0; // Zählerwert beim letzten Interrupt
  35. volatile unsigned long average = 1; // Integrierte Dauer // =1: divide by 0 vermeiden
  36. volatile int avgcnt = 0;
  37.  
  38. PID myPID(&Input, &Output, &Setpoint, Kp, Ki, Kd, DIRECT);
  39.  
  40. void setup()
  41. {
  42.   Serial.begin(9600);
  43.   pinMode(PotiPin, INPUT); // lesender Zugriff
  44.   pinMode(HallPin, INPUT); // dito
  45.   pinMode(pwmPin, OUTPUT); // schreibender Zugriff
  46.   analogWrite(pwmPin, 0); // für definierten Anfangszustand
  47.  
  48.   attachInterrupt(digitalPinToInterrupt(HallPin), readmicros, RISING);
  49.  
  50.   upmIst = analogRead(HallPin);
  51.   upmSoll = 0;
  52.   myPID.SetMode(AUTOMATIC);
  53.   //Adjust PID values
  54.   myPID.SetTunings(Kp, Ki, Kd);
  55.  
  56.  
  57.   lcd1.begin(16, 2);
  58.   lcd1.backlight();
  59.  
  60.   lcd2.begin(16, 2);
  61.   lcd2.backlight();
  62. }
  63. void loop()
  64. {
  65.  
  66.   Prozent = map(analogRead(PotiPin), 0, 1023, 0, 100);
  67.   upmSoll = map(Prozent, 0, 100, 0, Umax);
  68.  
  69.   hpin = digitalRead(HallPin);
  70.   //Serial.print("HallPin: ");
  71.   //Serial.println(hpin);
  72.  
  73.  
  74.  
  75.  
  76.   myPID.Compute();
  77.   //analogWrite(pwmPin, Output); //LED is set to digital 3 this is a pwm pin.
  78.   Serial.print(upmSoll);
  79.   Serial.print(" ");
  80.   Serial.println(pwm);
  81.   Serial.print(" ");
  82.   Serial.println(upmSoll);
  83.  
  84. UpmIst();
  85.  
  86. if (upmIst > upmSoll) {
  87.   diff = upmIst - upmSoll;
  88.   pwm = map(diff, 0, upmSoll, 0, 255);
  89.   pwm = min(pwm, 255);
  90. } else {
  91.   diff = 0;
  92.   pwm = 0;
  93.  
  94. }
  95. analogWrite(pwmPin, pwm);
  96.  
  97. //Serial.print("Prozent: "); Serial.print(Prozent);
  98. //Serial.print(" UpmSoll: "); Serial.print(upmSoll);
  99. //Serial.print(" UpmIst: "); Serial.print(upmIst);
  100. //Serial.print(" Diff: "); Serial.print(diff);
  101. //Serial.print(" PWM: "); Serial.println(pwm);
  102.  
  103.  Lcd1();
  104.  Lcd2();
  105.  
  106. //delay(500);
  107. }
  108. void UpmIst (void) {
  109.   if (dauer != 0) {
  110.     upmIst = (60000000 / average); // Drehzahl ausrechnen und runden
  111.   } else {
  112.     upmIst = 0; // keine Messung? -> Stillstand
  113.     avgcnt = 0;
  114.   }
  115.   sprintf(buf, "%4lu", upmIst);
  116.   Serial.println("_UpmIst: " + String(buf));
  117.  
  118.   dauer >>= 10;                                   // Flag für Stillstand ( : 1024 )
  119.   //delay(500);
  120. }
  121.  
  122. void readmicros() { // Interrupt-Routine
  123.   detachInterrupt(digitalPinToInterrupt(HallPin)); // Interrupt ausschalten damit er uns nicht beißt
  124.   int avgmax;
  125.   unsigned long us = micros(); // Microsekundenzähler auslesen
  126.   if (last == 0) { // erster Messwert?
  127.     last = us; // merken und nicht weiter bearbeiten
  128.   } else {
  129.     if ( us < last ) { // Zählerüberlauf
  130.       dauer = 4294967295 - last + us; // erzeugt einen Fehler von 1µS - vernachlässigbar
  131.     } else {
  132.       dauer = us - last; // Differenz zum letzten Durchlauf berechnen
  133.     }
  134.     if (dauer > 5000) { // ignorieren wenn <= 5ms (Kontaktpreller)
  135.       average = dauer + average * avgcnt++; // Wert in buffer und mit Faktor avgcnt glätten
  136.       average /= avgcnt; // und zurückrechnen
  137.       avgmax = 1000000 / dauer; // dynamische Größe des Integrationspuffers
  138.       if (avgmax < AVG) avgmax = AVG; // Trägheit mindestens 1 Sekunde
  139.       if (avgcnt >= avgmax) avgcnt--;
  140.       last = us; // und wieder den letzten Wert merken
  141.   }
  142.     else {
  143.       dauer = 0;
  144.     }
  145.   }
  146.   attachInterrupt(digitalPinToInterrupt(HallPin), readmicros, RISING ); // Interrupt wieder einschalten
  147. }
  148. void Lcd1(void) { // Ausgabe-Komplett am LCD1
  149.  
  150.   lcd1.setCursor(0, 0);
  151.   lcd1.print("Force[Nm]:");
  152.   lcd1.setCursor(10, 0);
  153.   lcd1.print(Force, 3); // gewicht ausgabe
  154.   lcd1.setCursor(0, 1);
  155.   lcd1.print("Drehzahl ");
  156.   lcd1.print(Prozent); // Prozent ausgabe
  157.   lcd1.print("%");
  158. }
  159. void Lcd2(void) { // Ausgabe-Komplett am LCD2
  160.  
  161.   lcd2.clear(); // Soll es BLINKEN ODER NICHT????
  162.   lcd2.setCursor(0, 0);
  163.   lcd2.print("SOLL[U/min]:");
  164.   lcd2.setCursor(12, 0);
  165.   lcd2.print((int)upmSoll);
  166.   lcd2.setCursor(0, 1);
  167.   lcd2.print("IST [U/min]:");
  168.   lcd2.setCursor(12, 1);
  169.   lcd2.print((int)upmIst);
  170.   // lcd2.setCursor(12, 1);
  171.   // lcd2.print(Umax); //Max UPM Schwellwert zum schalten der Bremse
  172. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement