Forum: Mikrocontroller und Digitale Elektronik Ansteuerung Schrittmotor atmega8, in C, Winkel mit Poti


von Peter S. (peter117)


Lesenswert?

Hallo zusammen,

ich bin ganz neu, sowohl im Forum als auch in der 
Micro-Controller-Programmierung. Nach meinem Problem habe ich schon 
gesucht aber noch nicht das richtige gefunden (bitte korrigiert mich).
Was ich schon gefunden habe :
Beitrag "Mit poti position eines schrittmotors steuern"
nur verstehe ich es noch nicht ganz.

Es geht um die Ansteuerung eines Schrittmotors mittels eines ATmega8, 
programmiert in C.
Die Elektronik für die Ansteuerung ist schon vorhanden.
Eingestellt werden soll die Position des Motors, der Winkel (keine 
Drehzahl oder ähnliches).


Es gibt zwei Pins für die Ansteuerung des Motors.
Über einen wird ein Rechtecksignal (0V; 5V) erwartet, dessen Frequenz 
der Schrittfrequenz des Motors entspricht (maximale Schrittfrequenz 580 
Hz).
Über den zweiten Pin kann die Drehrichtung vorgegeben werden (0V --> 
dreht links, 5V --> dreht rechts).
Der Motor verfügt über einen Hall-Sensor der für die Position verwendet 
werden kann. Beim Überschreiten der Mittelposition wechselt die Ausgabe 
des Sensors von 0V auf 5V.
Von dieser Position aus hat der Motor 200 Schritte nach links 
(entspricht 15°) und 100 Schritte nach rechts (-7.5°).
Mit einem Potentiometer will ich jetzt die Position (Sollwinkel) des 
Motors vorgeben.

Die einzigen freien Ports sind:
PB5 für das Rechtecksignal und PC0 für die Drehrichtung.

Was schon klappt ist das Digitale Einlesen des Potis. Da skaliere ich 
den Bereich von -15° bis +15°.
Für mich steht fest, dass das Rechtecksignal mittels Interrupt 
realisiert werden soll.
Beim Einschalten dachte ich mir ist es sinnvoll eine Referenzfahrt zu 
machen bis der Motor in der Mittelposition steht, um von dort aus 
loszulegen.

Woran es noch hängt:

1.) Wie genau das mit den Interrups geht weiß ich noch nicht.
2.) Ich habe noch keine Richtige Vorstellung wie ich die Anforderungen 
in einem Programm realisieren kann.

Wenn mir hier jemand helfen könnte wäre super. Es muss nicht direkt Code 
sein, eine Idee für einen Ablaufplan würde schon sehr helfen. Das ganz 
noch mit einer Code-Idee wäre natürlich on top.

Danke schon mal im Voraus

von Rainer U. (r-u)


Lesenswert?

Peter S. schrieb:
> Für mich steht fest, dass das Rechtecksignal mittels Interrupt
> realisiert werden soll.

Warum?

Peter S. schrieb:
> eine Idee für einen Ablaufplan würde schon sehr helfen.

Vorbereitung: Motor in die Mitte stellen, Variable auf 0

Ablauf:
1) Poti einlesen und Sollposition ausrechnen
2) Istposition aus der Variable lesen und Richtung/Schritte zur 
Sollposition berechnen
3) Richtung / Schritte ausgeben
4) neue Position in der Variable speichern und goto 1)

Falls Du bei Bei 3) die 0 überfährst, kannst Du schauen, ob sie noch 
stimmt.

von Imperator (Gast)


Lesenswert?

Servus,
was muss der ATmega noch leisten?

Wenn du nur die Motorregelung machst, dann kannst du auch pollen. In 
einer ISR ließt du alle 10ms den Istwert. In der Mainloop werden die 
Schritte einfach angepasst. Die Pulsansteuerung kann man mittels eines 
delays erstellen.

Schrittmotoren werden normalerweise mithilfe einer Rampe gesteuert. Hier 
musst man testen, ob diese vernachlässigbar ist.

von Peter S. (peter117)


Lesenswert?

Hallo

vielen Dank schon mal für die Antworten.

Rainer U. schrieb:
> Peter S. schrieb:
>> Für mich steht fest, dass das Rechtecksignal mittels Interrupt
>> realisiert werden soll.
>
> Warum?

Wenn ich es richtig verstanden habe könnte ich nur an den Pins PB0, PB1 
und PB2 mit dem internen Wave-Generator ein Rechtecksignal erzeugen. Die 
sind aber schon belegt mit anderen Sachen, die eine PWM benötigen.

Insgesamt geht es um einen Scheinwerfer. Der Schrittmotor ist für das 
Kurvenlicht und die Pins PB0-2 sind für Lampen die über eine Sekunde 
hinweg eingeschaltet werden sollen. Das mit einer PWM von 0% 
Tastverhältnis bis zu 100% innerhalb der Sekunde (also einer Rampe). 
Oder ich müsste die Einschaltrampe für die Lampen anders erzeugen? Dazu 
muss ich sagen, dass die Lampen nur direkt an oder aus geschaltet werden 
können. Auf die Stromregelung habe ich keinen Zugriff.

Der Ablaufplan hat schon mal sehr geholfen. Vielen Dank

Imperator schrieb:
> Servus,
> was muss der ATmega noch leisten?

Sonst sind andere Elemente des Scheinwerfers angeschlossen. Blinker 
Abblendlicht, Abbiegelicht etc.

Imperator schrieb:
> Die Pulsansteuerung kann man mittels eines
> delays erstellen.

Wenn ich die Pulse im Main Loop mit delay mache, ist dann nicht die 
Frequenz etwas undefiniert, je nachdem welche Interrups möglicherweise 
zwischendrin aufgerufen werden?

von Imperator (Gast)


Lesenswert?

Peter S. schrieb:
> Das mit einer PWM von 0%
> Tastverhältnis bis zu 100% innerhalb der Sekunde (also einer Rampe).
> Oder ich müsste die Einschaltrampe für die Lampen anders erzeugen? Dazu
> muss ich sagen, dass die Lampen nur direkt an oder aus geschaltet werden
> können. Auf die Stromregelung habe ich keinen Zugriff.

Normale Glühbirnen brennen meistens beim Einschalten durch.
Leds brauchen eine PWM von 2khz und mehr sonst flimmern diese...

> Wenn ich die Pulse im Main Loop mit delay mache, ist dann nicht die
> Frequenz etwas undefiniert, je nachdem welche Interrups möglicherweise
> zwischendrin aufgerufen werden?

Man kann Interrupts auch aus-/einschalten und wenn diese "kurz" sind 
dann entstehen sehr kleine Latenzzeiten. Das wäre halt eine quick and 
dirty Programmierung.

Mache lieber die Ansteuerung in einer ISR. Dazu erstelle eine Funktion 
die nicht blockierend ist und je nach Regelabweichung wird eine ISR 
aufgerufen. Den Step Puls kannst du mittels eines delay_us() erstellen. 
Dazu kannst du auch asm("nop") ein paar mal einfügen um einen Pinchange 
zu erstellen.

Sensoren und weitere Eingänge immer pollen z.B. entweder in einer ISR 
oder du machst für deine Teilprogramme Task. Z.B:
-alle 20ms den Sollwert überprüfen
-alle 5ms Eingänge checken

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.