GA25-371 Schrittmotor anschließen

Hi,

Ich spiele gerade an einem Zwei-Räder-Robot rum. Jetzt möchte ich gerne den Encoder von dem Schrittmotor auslesen doch werde aus den Dokumenten nicht schlau. Wenn ich +/- auf rot und schwarz lege bekomme ich den Motor aus laufen. In der Beschreibung sieht es aber anders aus. Kann ich den Interrupt Ausgang des Encoders raus? Danke schon mal.

Herrx90: Wenn ich +/- auf rot und schwarz lege bekomme ich den Motor aus laufen. In der Beschreibung sieht es aber anders aus.

Möglicherweise paßt dieses Bild besser:

|500x491

Das hat mit einem Schrittmotor aber nichts zu tun. Das ist ein mormaler DC-Motor mit einem Encoder auf Hall-Basis.

Herrx90: Wenn ich +/- auf rot und schwarz lege bekomme ich den Motor aus laufen. In der Beschreibung sieht es aber anders aus.

Was sieht da anders aus? Da es ein normaler DC-Motor ist, wird der einfach über die Spannung an rot/schwarz betrieben. Wenn man ihn regeln will, muss man dazu den Encoder heranziehen.

MicroBahner: Was sieht da anders aus?

In #0 Rot/Weiß Motor Power In #1 Rot/Schwarz Motor +-

Hi

Herrx90: Kann ich den Interrupt Ausgang des Encoders raus? Danke schon mal.

Das ist das Einzige, was irgendwie einer Frage ähnelt - leider bin ich nicht in der Lage, Diese inhaltlich zu verstehen.

MfG

PS: Bis jetzt sieht's so aus, daß der Motor unabhängig vom Sensor zu bestromen ist (macht PWM auch einfacher). Der Sensor wird dann 'ganz normal' als Drehencoder ausgewertet.

unsigned long ticks = 0;
unsigned long ticks2 = 0;

void setup() {
  Serial.begin(57600);
  pinMode(9, INPUT);
  pinMode(3, INPUT);
  attachInterrupt(9, countTicks, CHANGE);
  attachInterrupt(3, countTicks2, CHANGE);
}

void loop() {
  Serial.print("yellow: ");
  Serial.println(ticks);
  Serial.print("white: ");
  Serial.println(ticks2);
}

void countTicks()
{
  ticks++;
}
void countTicks2()
{
  ticks2++;
}

Habe mal nach dem Schema weiße und gelbe Leitung Hallsensor-Ausgang verkabelt.

Ohne das Rad zu drehen.

Ausgabe:

.....

1:01:35.373 -> white: 0
11:01:35.373 -> yellow: 278
11:01:35.373 -> white: 0
11:01:35.373 -> yellow: 281
11:01:35.373 -> white: 0
11:01:35.373 -> yellow: 281
11:01:35.373 -> white: 0
11:01:35.373 -> yellow: 281
11:01:35.373 -> white: 0
11:01:35.373 -> yellow: 281
11:01:35.373 -> white: 0
....

Das ist das Einzige, was irgendwie einer Frage ähnelt - leider bin ich nicht in der Lage, Diese inhaltlich zu verstehen.

OK Sorry. Ich habe den oben beschrieben Motor und würde gerne die Drehrichtung anhand der Hall-Sensor-Werte bestimmen. Leider bekomme ich nur den Motor zum Drehen. Die Werte die auslesen kann ich nicht auswerten oder sind falsch. Daher die Frage wie ich sicher gehenb kann das meine Werte richtig sind. Verdratungsfehler Programmfehler sind nicht ausgeschlossen.

Hi

Sieht so aus, daß white den Zustand nie geändert hat, yellow wohl 278 bzw 281 Mal. Somit nehme ich einen Verdrahtungsfehler an. Auch sind Deine Interrupt-Routinen nicht sonderlich schön. Du kannst hier durchaus ein 'Prellen' des einen Ausgang erkannt haben - also der Hall-Sensor steht 'auf Kante' und je nach Erschütterung schaltet Der gerade durch, oder eben nicht. Bei jedem Wechsel (change) zündet der entsprechende Interrupt und zählt yellow 1 hoch.

Ändert sich an white etwas, wenn der Motor dreht? Nein: Verdrahtungsfehler Zählt yellow mit der Motordrehzahl anders? Nein: Verdrahrtungsfehler (muß also bei stehendem Motor - zumindest zu >90%) auch auf dem Wert verharren. Bei Drehung entsprechend schnell hoch zählen.

Dann sind Deine Variablen, Die Du INNERHALB UND AUSSERHALB der ISR benutzt, länger als ein Byte - der Arduino bearbeitet Variablen byteweise - Das kann schnell zu Datenmüll führen. Deklariere Variablen, Die innerhalb UND außerhalb einer ISR benutzt werden als volatile. volatile long tick=0;

MfG

Zusätzlich: Lies die Werte der Variablen aus der ISR atomar (ausgeschaltete Interrupts) in Hilfsvariablen und arbeite mit diesen im loop weiter.

Gruß Tommy

postmaster-ino: Ändert sich an white etwas, wenn der Motor dreht?

Nein: Verdrahtungsfehler Zählt yellow mit der Motordrehzahl anders? Nein: Verdrahrtungsfehler (muß also bei stehendem Motor - zumindest zu >90%) auch auf dem Wert verharren. Bei Drehung entsprechend schnell hoch zählen.

Keine Chance. also yellow war immer 0.

Jetzt habe ich das noch mal mit meinem Schaltbild aus dem ersten Post verdratet (yellow und green signal) und jetzt bekomme ich bei beiden den Wert 0 den ich nicht beeinflussen kann. +/- ist an blue/black.

Tommy56:
Zusätzlich: Lies die Werte der Variablen aus der ISR atomar (ausgeschaltete Interrupts) in Hilfsvariablen und arbeite mit diesen im loop weiter.

Gruß Tommy

volatile long ticks = 0;
volatile long ticks2 = 0;
unsigned long yellow, white;

void setup() {
  Serial.begin(57600);
  pinMode(9, INPUT);
  pinMode(3, INPUT);
  attachInterrupt(3, countTicks, CHANGE);
  attachInterrupt(9, countTicks2, CHANGE);
}

void loop() {
  yellow=ticks;
  white =ticks2;
  Serial.print("yellow: ");
  Serial.println(yellow);
  Serial.print("white: ");
  Serial.println(white);
}

void countTicks()
{
  ticks++;
}
void countTicks2()
{
  ticks2++;
}

So dann ?

Nö, so:

void loop() {
  cli();
  yellow=ticks;
  white =ticks2;
  sei();
  Serial.print("yellow: ");
  Serial.println(yellow);
  Serial.print("white: ");
  Serial.println(white);
}

Gruß Tommy

Hi

yellow und whithe wird nicht in der ISR benutzt, ein volatile ist hier unnötig (kostet nur unnötig Zeit, weil der Variableninhalt bei JEDEM Zugriff neu ausgelesen/neu geschrieben wird - hier kann der Kompiler einen mehrfach-Zugriff nicht dadurch beschleunigen, daß der Wert in einem Register behalten wird, da sich ja der Variablenwert extern geändert haben kann).

Theoretisch müsste um white= ... yellow= ... noch ein cli/sti (oder nointerrupt(); drüber und interrupt(); drunter) - damit Interrupts während des Auslesen der Werte unterbunden sind.

MfG

PS: Tommy56 war schneller

PPS: In Deinem Bild (Start-Post) ist der 6.te Draht als GND-Motor benannt - vll. ist hier WS der GND - dann dürfte sich der Motor aber nicht mit anderen Drähten bestromen lassen.

postmaster-ino: yellow und whithe wird nicht in der ISR benutzt, ein volatile ist hier unnötig

Die sind auch nicht volatile, sondern die ticks.

Gruß Tommy

Tommy56: Nö, so:

void loop() {
  cli();
  yellow=ticks;
  white =ticks2;
  sei();
  Serial.print("yellow: ");
  Serial.println(yellow);
  Serial.print("white: ");
  Serial.println(white);
}

Gruß Tommy

Beim compilieren bekomme ich error: 'cli' was not declared in this scope

Fehlt da noch ne lib?

postmaster-ino: PPS: In Deinem Bild (Start-Post) ist der 6.te Draht als GND-Motor benannt - vll. ist hier WS der GND - dann dürfte sich der Motor aber nicht mit anderen Drähten bestromen lassen.

Habe ich auch mal versucht. Weis ->GND und Gelb +5v dann bekommt ich auf beiden anderen Drähten (grün und blau) immer nur 0.

Hi

Wenn cli() angemeckert wird, heißt Das ggf. nur cli; Zur Not kann man auch die Arduino-Funktion noInterrupts(); davor und interrupts(); danach (statt sti) nutzen.

cli -> clear interrupt (flag) sti -> set interrupt (flag)

Manches Mal schadet Es nicht, selber ein zwei Kleinigkeiten in den Tiefen des WWW oder des Datenblatt des verwendeten µC zu suchen.

MfG

Ich habe heute noch ein bisschen weiter rumprobiert.

Das mit dem sei() und cli() lag an meinem Arduino. Ich verwende das IoT 33, auf dem Mega hat es keine Fehler ausgeworfen auf dem IoT 33 konnte ich nur kompilieren, wenn die Zeilen auskomentiert waren.

Auf dem Mega habe gar keine Interrupts aufnehmen können und auf dem IoT 33 habe ich ein unkontrolliertes hochzählen von der gelben Leitung darstellen können.

Wenn ich 1kOhm Widerstände als Pull-Up verwendet habe konnte ich lediglich bei dem IoT 33 das hochzählen stoppen.

Hat noch einer eine Idee was ich noch testen/verändern könnte um vernünftige Hallsensor Signale zu bekommen? Danke schon mal.

Ich habe jetzt ein Bild gefunden, dass das auslesen von dem Encoder beschreibt. Leider verstehe ich nicht genau wie ich die Schaltung rechts oben aufbauen/beschalten soll. Kann mir da jemand eine Erklärung zu geben? Danke schon mal.

Hi

SIG sind Deine beiden Sensor-OUTs - also die Schaltung ist PRO KANAL. Zu sehen ist Vcc (Plus), ein Widerstand (PullUP), ein Transistor (der Sensor kann den Transistor ansteuern), was SIG auf GND runter zieht. Also hast Du in Ruhelage VCC und wenn der Sensor aktiv ist, GND. Das zwei Mal.

Die Signale sind um 90° versetzt - Du hast also immer nur EINEN Wechsel (00 01 11 10 oder anders herum). Der Signalversatz kann um bis zu 1T (wer immer T ist) verschoben sein - wir dürften aber davon ausgehen können, daß Diese immer noch satt verschoben sind.

Also VCC Sensor auf 5V, GND Sensor auf GND, die beiden SIG sind Deine Spuren A und B. Dann bleiben noch zwei Drähte über, Die direkt an den Motor gehen.

MfG

Ok. Aber Kabel geht jetzt an die Basis von dem NPN-Transistor?