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?