Regelung Geschwindigkeit DC Motor

Hallo zusammen,

nach anfänglichen Schwierigkeiten, Interrupts auf die Pins A0 und A1 zu bekommen, stehe ich jetzt vor dem Problem, dass meine Geschwindigkeits-Regelung der DC Motoren mittels Gabellichtschranke und Lochscheibe nicht funktioniert. Kurze Erklärung. Bei steigender Flanke des digitalen Ausgangs der Gabellichtschranke wird ein Flag gesetzt, der den jeweiligen Teil im Hauptprogramm ausführt. Ausgerechnet wird die Zeitdifferenz zwischen einem und dem nächsten Loch. Dementsprechend wird die Geschwindigkeit erhöht oder gesenkt.

Ich habe mich an folgende Anleitung gehalten: Böcker Elektronik

Führe ich den Programmcode aus, werden beide Motoren immer schneller. Allerdings finde ich den Fehler in meinem Programmcode nicht.
Klammere ich den Programmteil des Linken Motors aus dann funktioniert die Regelung.

#define ENC_r A1
#define ENC_l A0


#include <AFMotor.h>
#include "PinChangeInterrupt.h"

AF_DCMotor motor_l(1, MOTOR12_64KHZ); // create motor #2, 64KHz pwm
AF_DCMotor motor_r(2, MOTOR12_64KHZ); // create motor #2, 64KHz pwm
int speedR = 170;
int speedL = 170;

unsigned long timeL, timeR, timeLPrev, timeRPrev;
unsigned long countR, countL, setTime;
unsigned int diffL, diffR;
boolean isrRFlag, isrLFlag;

void setup() {
pinMode (ENC_l, INPUT_PULLUP);
pinMode (ENC_r, INPUT_PULLUP);
Serial.begin(9600);
attachPCINT(digitalPinToPCINT(ENC_r), isr_int0, RISING);
attachPCINT(digitalPinToPCINT(ENC_l), isr_int1, RISING);
motor_r.setSpeed(speedR);
motor_l.setSpeed(speedL);
motor_l.run(FORWARD);
motor_r.run(FORWARD);
timeLPrev = micros();
timeRPrev = micros();
countR = 0;
countL = 0;
}

void loop() {

if (isrRFlag == true)
  {
  timeR = micros();
  diffR = timeR - timeRPrev;
  timeRPrev = timeR;
    if (countR == 10)
      {
      setTime = diffR;
      }
    if (countR >=11)
      {
          if (diffR > setTime)
          {
          Serial.print("rechts zu langsam: ");
          Serial.print(diffR);
          Serial.print(" zu: ");
          Serial.print(setTime);
          speedR++;
          Serial.print(" -- SpeedR = ");
          Serial.println(speedR);
          }

          if (diffR < setTime)
          {
          Serial.print("rechts zu schnell ");
          Serial.print(diffR);
          Serial.print(" zu: ");
          Serial.print(setTime);
          speedR--;
          Serial.print(" -- SpeedR = ");
          Serial.println(speedR);
          }
      }
  isrRFlag = false;
  motor_r.setSpeed(speedR);
  
  }

if (isrLFlag == true)
  {
  timeL = micros();
  diffL = timeL - timeLPrev;
  timeLPrev = timeL;
    if (countL >=11)
      {
          if (diffL > setTime)
          {
          Serial.print("links zu langsam: ");
          Serial.print(diffL);
          Serial.print(" zu: ");
          Serial.print(setTime);
          speedL++;
          Serial.print(" -- SpeedL = ");
          Serial.println(speedL);
          Serial.println(timeL);
          Serial.println(timeLPrev);
          }

          if (diffL < setTime)
          {
          Serial.print("links zu schnell ");
          Serial.print(diffL);
          Serial.print(" zu: ");
          Serial.print(setTime);
          speedL--;
          Serial.print(" -- SpeedL = ");
          Serial.println(speedL);
          Serial.println(timeL);
          Serial.println(timeLPrev);
          }
      }
  isrLFlag = false;
  motor_l.setSpeed(speedL);
  
  }


}

void isr_int0()
{
isrRFlag = true;
countR++;
}

void isr_int1()
{
isrLFlag = true;
countL++;
}

Der Serielle Monitor gibt bei Verwendung beider Motoren folgendes aus:

Komischerweise ändert sich die ausgerechnete Differenz nicht mehr?! Folglich wird die Geschwindigkeit bei jedem Interrupt erhöht?!

Klammere ich den linken Motor aus, sieht der Serielle Monitor so aus:

Wo ist mein Denkfehler?

Pauleheisster:
Wo ist mein Denkfehler?

Keine Ahnung. Den Code habe ich nur kurz durchgescrollt und gesehen, dass der wohl zusammenkopiert wurde (für copy+paste-Programme habe ich nur Verachtung übrig). Echt witzig sind aber die Bilder (!) dessen, was der Serielle Monitor ausgibt.

Ich wusste nicht, dass das Ding auch graue Balken kann.

Gruß

Gregor

gregorss:
Keine Ahnung. Den Code habe ich nur kurz durchgescrollt und gesehen, dass der wohl zusammenkopiert wurde (für copy+paste-Programme habe ich nur Verachtung übrig).

Hallo Gregorss,

deine Verachtung ist hier aber tatsächlich fehl am Platz. Ich habe mich natürlich an der Anleitung orientiert, den Code aber tatsächlich komplett selber geschrieben. Wusste nicht, dass man aus Bildern Code kopieren kann?

gregorss:
Ich wusste nicht, dass das Ding auch graue Balken kann.

Muss man den Witz verstehen?

Pauleheisster:
deine Verachtung ist hier aber tatsächlich fehl am Platz. Ich habe mich natürlich an der Anleitung orientiert, den Code aber tatsächlich komplett selber geschrieben. Wusste nicht, dass man aus Bildern Code kopieren kann?

Dann programmierst Du schonmal echt gut auf eine Weise, die man mit c+p-Programmierung verwechseln kann.

Pauleheisster:
Muss man den Witz verstehen?

Mach mal einen Rechtsklick und „Bild anzeigen“. Ich sehe da nur die Andeutung einer Textausgabe.

Gruß

Gregor

gregorss:
Mach mal einen Rechtsklick und „Bild anzeigen“. Ich sehe da nur die Andeutung einer Textausgabe.

Na klar, weil du dann nur auf das Vorschaubild kommst, schonmal mit einem normalen Linksklick auf das Bild probiert?

Pauleheisster:
Na klar, weil du dann nur auf das Vorschaubild kommst, schonmal mit einem normalen Linksklick auf das Bild probiert?

Uh shit. Falsch geklickt. Sorry.

Gruß

Gregor