Hallo liebe Freunde der Technik,
in meinem aktuellen Projekt und komme mit meinem informatischen Latein an meine Grenze. Nach dem ich bisher auf fast jede Arduino-Frage in diesem Forum eine Antwort gefunden habe, nun aber nicht mehr weiter komme , verfasse ich jetzt ganz offiziell meinen ersten Post hier und würde mich über eure Hilfe freuen.
Eine kleine Übersicht:
In meinem Projekt würde ich gerne einen Brushless DC 12V 30A Motor ansteuern. Dieser verfährt eine Spindel von Pos. A zu Pos. B.
Bisher klappt dies auch ganz gut. Ich verwende einen Arduino Mega und eine IBT_2 H-Bridge zum Ansteuern und beidseitigen Verfahren.Weil ich mich langsam an die Thematik herantaste wird der Motor aktuell noch über einen 10k Ohm Poti geregelt und manuell verfahren.
Da ich die Bewegung gerne per Knopfdruck ausführen möchte, bediene ich mich an den Signalen der integrierten Hall Sensoren. Zu diesen besitze ich leider kein Datenblatt und diese sind verdeckt verbaut. Das High Low Signal konnte ich allerdings nach ein wenig rumprobieren ausfindig machen.
Angeschlossen nach dem diesem Prinzip

bekomme ich bei der Motorbewegung Abwechselnd ein HIGH oder LOW Signal. Da beide Sensoren scheinbar Winkelversetzt verbaut sind ist auch eine Richtungsbestimmung möglich, je nachdem wessen Flanke als erstes Abfällt).
So weit so gut. Kalibriere ich jetzt jedoch eine Null-Position (z.B. am Anschlag), verfahre den Motor und kehre zur Ausgangsposition zurück. Habe ich eine negative Abweichung von ca 10%. Also werden einige Schritte doppelt oder gar nicht gezählt. Nachdem ich viele Ansätze ausprobiert habe um dieses Problem zu lösen, bin ich nun Ratlos. Das Signal der Hall-Sensoren kommt gleichmäßig an aber nach der Verrechnung passen die Positionen nicht mehr.
Anbei füge ich den Code ein, da ich befürchte der Fehler liegt in der interrupt Funktion mit der ich bisher noch nie gearbeitet habe.
Vielen Dank schonmal für eure Hilfe
const int SENSOR_PIN = A2; // center pin of the potentiometer
const int HALL_PIN1 = 2;
const int HALL_PIN2 = 3;
const int Bauf = 22; //B=Button
const int Bzu = 24;
const int Bcal = 26;
const int RPWM_Output = 9; // Arduino PWM output pin 5; connect to IBT-2 pin 1 (RPWM)
const int LPWM_Output = 10; // Arduino PWM output pin 6; connect to IBT-2 pin 2 (LPWM)
int BaufLastState = 0;
int BzuLastState = 0;
int BcalLastState = 0;
int BaufState = 0;
int BzuState = 0;
int BcalState = 0;
volatile int counter = 0;
void setup(){
TCCR2B = TCCR2B & 0b11111000 | 0x01;
Serial.begin (9600);
pinMode(RPWM_Output, OUTPUT);
pinMode(LPWM_Output, OUTPUT);
pinMode(HALL_PIN1, INPUT);
pinMode(HALL_PIN2, INPUT);
pinMode(Bauf, INPUT);
pinMode(Bzu, INPUT);
pinMode(Bcal, INPUT);
attachInterrupt(digitalPinToInterrupt(HALL_PIN1),Bewegung,FALLING);
}
void loop(){
//Verfahren des Motors
int POTI = analogRead(SENSOR_PIN);
// sensor value is in the range 0 to 1023
// the lower half of it we use for reverse rotation; the upper half for forward rotation
if (POTI < 512) {
// reverse rotation
int reversePWM = -(POTI - 511) / 2;
analogWrite(LPWM_Output, 0);
analogWrite(RPWM_Output, reversePWM);
}
else {
// forward rotation
int forwardPWM = (POTI - 512) / 2;
analogWrite(LPWM_Output, forwardPWM);
analogWrite(RPWM_Output, 0);
}
//Ausgabe Informationen
Serial.print("POTI ");
Serial.print(POTI);
Serial.print("\t");
Serial.print("Position ");
Serial.print(counter);
Serial.print("\t");
Serial.print("Buttonstate ");
Serial.println(BcalState);
//Knopf 0 Position
BcalState = digitalRead(Bcal);
if (BcalState != BcalLastState) { // if the state has changed, increment the counter
if (BcalState == HIGH) { // if the current state is HIGH then the button went from off to on
counter=0;
}
}
BcalLastState = BcalState;
}
void Bewegung() {
volatile int HALL2 = digitalRead(HALL_PIN2);
if (HALL2==0){
counter--;
}
else{
counter++;
}
}
Und bitte entschuldigt die unschöne Programmierung :-X