Forum: Mikrocontroller und Digitale Elektronik Mit poti position eines schrittmotors steuern


von JSP (Gast)


Lesenswert?

Hallo,

ich versuch gerade über eine analogspannug (poti) am adc eines Atmega8 
die position eins schrittmotor's zu steuern (nicht die Drehzahl)!
damit meine ich z.b.
anlaogspannug (poti wird gedreht) wird kleiner = schrittmotor dreht 
rechts
analogspannug                     wird größer  = schrittmotor dreht 
links

ich versuch eigentlich das gleich wie hier im viedeo zu erreichen:
http://www.youtube.com/watch?v=dSKac6EPkrc

Blos mit einem Atmega 8 und in Assembler!

Bis jetzt hab ich es geschafft denn analogwert zu erfassen und zu lesen.

ich such schon seit zwei tagen nach einer lösung bzw. denkanstöße im 
internet, leider vergebens! Und meine fingernägel sind auch schon alle 
abgenagt!

ich würd mich über eine lösung risieg freuen!

von Karl H. (kbuchegg)


Lesenswert?

JSP schrieb:

> Bis jetzt hab ich es geschafft denn analogwert zu erfassen und zu lesen.

Gut, dann leg das mal beiseite und fang mit einem 2-ten Teilprojekt an: 
Ansteuerung eines Schrittmotors.

> ich such schon seit zwei tagen nach einer lösung bzw. denkanstöße im
> internet, leider vergebens!

Dann fang erst mal damit an, im Web nachg Motortreiber zu googeln. Davon 
hängt dann nämlich ab, wie das ganze konkret programmiert wird.

> Und meine fingernägel sind auch schon alle
> abgenagt!

Leg die Fingernägel beiseite.
Hast du schon die Leitungen deines Schrittmotors identifiziert?

von Michael H. (michael_h45)


Lesenswert?

JSP schrieb:
> ich such schon seit zwei tagen nach einer lösung bzw. denkanstöße im
Ist jetzt aber nicht dein Ernst, oder?
> internet, leider vergebens! Und meine fingernägel sind auch schon alle
Du konntest nichts darüber finden, wie man mit einem Atmega8 einen 
Schrittmotor ansteuert???
Das klingt etwas unglaublich =)

> ich würd mich über eine lösung risieg freuen!
L297+L298. Das findet man überall

Dann brauchst du noch einen Endschalter für deine Position, die du bei 
der Initialisierung anfährst, um zu wissen, wo der Schrittmotor gerade 
steht.

Der Atmel schaltet an, fährt den Schrittmotor in eine Richtung, bis der 
Endschalter auslöst.
Dann errechnest du aus deiner analogen Spannung die zugehörige Position.
Zum Beispiel: 0,5V entsprechen +1000 Schritten von der Endposition weg.
Dann gibst du Richtung an den L297 vor und gibst 1000 Taktzyklen an den 
Clock-Eingang des L297.

Fertig.

von JSP (Gast)


Lesenswert?

danke erst mal für die schnellen antworten!

Geht das nicht ohne endschalter?

mein schrittmotor ist ein sehr kleiner bipolar motor (4 anschlüsse)
ich dacht eher das ich sie über ULN2003 bzw. ULN 2004 ansteuer!

von Karl H. (kbuchegg)


Lesenswert?

JSP schrieb:
> danke erst mal für die schnellen antworten!
>
> Geht das nicht ohne endschalter?

Woher willst du dann nach dem Anlegen der Spannung wissen, in welcher 
Position der Motor gerade steht? Wenn du dir an die Motorwelle einen 
Zeiger aus Pappe aufsteckst, dann soll die ja wohl nach dem Einschalten 
bei Potistellung 0 immer in die gleiche Richtung zeigen. Wenn dir das 
fürs erste egal ist, dann gehts natürlich auch so.

> mein schrittmotor ist ein sehr kleiner bipolar motor (4 anschlüsse)
> ich dacht eher das ich sie über ULN2003 bzw. ULN 2004 ansteuer!

Wieviel Strom braucht denn der Motor? Schafft das der ULN?

Machbar ist das prinzipiell schon mit einem 'diskreten Motortreiber'. 
Ist alles nur eine Frage der richtigen Reihenfolge des Ein/Ausschaltens 
der jeweiligen Leitungen.

von JSP (Gast)


Lesenswert?

hmmm.... ich dachte es mir so:

2,5V nullpunkt der strecke!
5V gleich z.b 20 Umdrechungen rechts vom nullpunkt!
0V gleich 20 Umdrehungen links vom nullpunkt


also der uln schafft das locker!

von Jan M. (7_of_9)


Lesenswert?

Michael H. schrieb:
> Dann errechnest du aus deiner analogen Spannung die zugehörige Position.
> Zum Beispiel: 0,5V entsprechen +1000 Schritten von der Endposition weg.

Ich glaub ganz so einfach ist es nicht.
Denn woher weiß der µC, dass das gemessene Spannung gerade die Spannung 
ist die "angefahren" werden soll. Es kann ja gerade sein das man noch 
dreht während gesampelt wird.

Ich würde eine maximale frequenz festlegen mit der der Motor Schritte 
machen darf, dann würde ich ka 20x? in der sekunde einen Spannungswert 
messen und mit dem vorherigen vergleichen. Eine gewisse anzahl an mV 
sind dann 1 Schritt. Und um wie viele mV es sich geändert hat soviele 
Taktimpulse an den Motor geben (mit der als maximal festgelegten 
frequenz).

Evtl die Taktimpulse immer in einer Variablen aufaddieren damit keiner 
verloren geht falls man mal schneller am Poti dreht als der Motor sich 
drehen soll.

Ka obs so geht ^^ ich mach mir da auch einen Knoten in den Kopf.

von Karl H. (kbuchegg)


Lesenswert?

Karl heinz Buchegger schrieb:

>> mein schrittmotor ist ein sehr kleiner bipolar motor (4 anschlüsse)
>> ich dacht eher das ich sie über ULN2003 bzw. ULN 2004 ansteuer!
>
> Wieviel Strom braucht denn der Motor? Schafft das der ULN?
>
> Machbar ist das prinzipiell schon mit einem 'diskreten Motortreiber'.

Ich vergass.
Du hast ja einen bipolaren Motor. Da wird das nichts mit einem ULN. Dazu 
brauchst du eine H-Brücke für jede Wicklung.

von Karl H. (kbuchegg)


Lesenswert?

Jan M. schrieb:
> Michael H. schrieb:
>> Dann errechnest du aus deiner analogen Spannung die zugehörige Position.
>> Zum Beispiel: 0,5V entsprechen +1000 Schritten von der Endposition weg.
>
> Ich glaub ganz so einfach ist es nicht.

Im Prinzip wars das schon.
Man muss nur eine etwas clevere Strategie machen, nach der der Motor 
angesteuert wird.

Aus dem ADC kommt der Vorgabewerte, in Form einer fiktiven Schrittzahl, 
die der Motor anzufahren hat. Gleichzeitig zählt man auch die reale 
Schrittzahl, die der Motor seit dem Einschalten schon gemacht hat mit.

In einer ISR (Timergesteuert) passiert dann:
Ist nun die Vorgabe größer als die reale Schrittzahl, dann lässt man den 
Motor einen Schritt in die positive Richtung machen. Ist sie kleiner 
dann einen Schritt in die andere Richtung. Danach wird die reale 
Schrittzahl um diesen 1 gemachten Schritt korrigiert.


In Summe läuft es darauf hinaus, dass der Motor regelmässig immer 1 
Schritt macht um seine eigene Schrittzahl auf die Vorgabe abzugleichen. 
Will ich den Motor auf die Position Schritt 978 schicken, dann brauch 
ich die nur in diese Vorgabevariable schreiben und der regelmässige 
Timerinterrupt sorgt dafür, dass der Motor diese Position anfährt. 
Andere ich meine Meinung während der Motor gerade fährt ist auch das 
kein Problem: Ich geb eine neue Vorgabe und der Motor fährt diese an. 
Bei Bedarf schaltet sich dann auch die Richtung automatisch um.

Solange die Schrittfrequenz nicht zu hoch ist, so dass Beschleunigungs 
und Bremsrampen notwendig sind, funktioniert das dann schon.


> messen und mit dem vorherigen vergleichen. Eine gewisse anzahl an mV
> sind dann 1 Schritt.

Ich hab das so verstanden, dass ein am Motor angebrachter Zeiger im 
Prinzip der Potistellung folgen soll: Dreh ich das Poti auf 
Linksanschlag soll auch der Zeiger auf 'Linksanschlag' gehen. Dreh ich 
das Poti auf Rechtsanschlag soll auch der Zeiger auf Rechtsanschlag 
gehen.

Die Potistellung regelt also die Position des Zeigers und nicht der 
Drehzahl mit der der Motor drehen soll

von Michael H. (michael_h45)


Lesenswert?

Jan M. schrieb:
> Ich glaub ganz so einfach ist es nicht.
Doch doch ^^
> Denn woher weiß der µC, dass das gemessene Spannung gerade die Spannung
> ist die "angefahren" werden soll. Es kann ja gerade sein das man noch
Und? Muss er das wissen? Was passiert, wenn er es nicht weiß?
> dreht während gesampelt wird.
Und? Was geschieht, wenn das passiert?

> Evtl die Taktimpulse immer in einer Variablen aufaddieren damit keiner
> verloren geht falls man mal schneller am Poti dreht als der Motor sich
> drehen soll.
Nicht sinnvoll.
Der Controller kennt die absolute Position des Motors. Setz damit an.

> Ka obs so geht ^^ ich mach mir da auch einen Knoten in den Kopf.
Na dann geh mal ne halbe Stunde weg vom PC, mach Musik\TV\Fenster aus 
und schließ die Tür.
Konzentriert nachdenken. Ist jetzt wirklich nicht schwer.

von Jan M. (7_of_9)


Lesenswert?

Michael H. schrieb:
>> Denn woher weiß der µC, dass das gemessene Spannung gerade die Spannung
>> ist die "angefahren" werden soll. Es kann ja gerade sein das man noch
> Und? Muss er das wissen? Was passiert, wenn er es nicht weiß?
>> dreht während gesampelt wird.
> Und? Was geschieht, wenn das passiert?

Michael H. schrieb:
> Dann errechnest du aus deiner analogen Spannung die zugehörige Position.
> Zum Beispiel: 0,5V entsprechen +1000 Schritten von der Endposition weg.
> Dann gibst du Richtung an den L297 vor und gibst 1000 Taktzyklen an den
> Clock-Eingang des L297.

Das Problem ist nach deiner Vorgabe, das du bei 0,5V 1000Schritte machen 
willst.
Jetzt drehe ich sagen wir von Endposition im Poti 0V auf 0,5V.
es wird bei 0,2V gesampelt und bei 0,5V. Dann würdest du für 0,2V 
400Schritte auf den Motor geben und nochmal für 0,5V 1000 und landest 
bei 1400.
..und darauf hab ich hingewiesen das der gesampelte Wert nicht der 
Absolutwert sein muss ist der angefahren werden soll.

Die Methode von Karl Heinz scheint mir aber sehr elegant dafür zu sein.

>> Evtl die Taktimpulse immer in einer Variablen aufaddieren damit keiner
>> verloren geht falls man mal schneller am Poti dreht als der Motor sich
>> drehen soll.
>Nicht sinnvoll.
>Der Controller kennt die absolute Position des Motors. Setz damit an.

Da bin ich aber mal gespannt wie das geht ohne intern mitzuzählen ;-)

von Juppi J. (juppiii)


Lesenswert?

Ohne Endschalter,gegen Anschlag fahren.
Wurde und wird heute noch bei Scannern gemacht.

von Michael H. (michael_h45)


Lesenswert?

Jan M. schrieb:
> Da bin ich aber mal gespannt wie das geht ohne intern mitzuzählen ;-)
hab ich nie gesagt.

Meinen Vorschlag hast du noch immer nicht genau gelesen/verstanden.
Ich bleib beim letzten Absatz meines vorigen Posts.

von Jan M. (7_of_9)


Lesenswert?

michi du kleiner schelm =)

Michael H. schrieb:
> Jan M. schrieb:
>> Da bin ich aber mal gespannt wie das geht ohne intern mitzuzählen ;-)
> hab ich nie gesagt.

Michael H. schrieb:
> Evtl die Taktimpulse immer in einer Variablen aufaddieren damit keiner
> verloren geht falls man mal schneller am Poti dreht als der Motor sich
> drehen soll.
>> Nicht sinnvoll.

Also das hat für mich bedeutet du hältst es nicht für 
sinnvollmitzuzählen eijo. Dann hältst du es eben doch für sinnvoll 
wollen wir nicht dramatisieren.


>> Meinen Vorschlag hast du noch immer nicht genau gelesen/verstanden.
>> Ich bleib beim letzten Absatz meines vorigen Posts.

Naja ich dachte du wolltest beim positionieren des Motors genauso 
vorgehen.
Messen und den vorher aufgenommenen Wert entsprechend skalieren und die 
Schritte machen.
Tut mir leid wenn du dich damit angegriffen gefühlt hast... war nicht 
beabsichtig.

von Michael H. (michael_h45)


Lesenswert?

Jan M. schrieb:
> michi du kleiner schelm =)
holla die waldfee! =)

> wollen wir nicht dramatisieren.
Keine schlechte Idee.

> Naja ich dachte du wolltest beim positionieren des Motors genauso
> vorgehen.
> Messen und den vorher aufgenommenen Wert entsprechend skalieren und die
> Schritte machen.
Klingt ja prinzipiell nicht schlecht. Aber es fehlen noch diese 
Kleinigkeiten.
Du kannst dir das Leben einfach machen und Messungen erst wieder 
starten, wenn der Motor seine (vorige) Sollposition erreicht hat. Das 
wäre mein Vorschlag gewesen und hätte als Einstig immerhin Funktion 
geboten.

Oder aber du gehst gleich die wesentlich elegantere Lösung an, die du 
schon präsentiert bekommen hast. Nur eines vielleicht noch zur sicheren 
Klarheit.
Karl heinz Buchegger schrieb:
> Aus dem ADC kommt der Vorgabewerte, in Form einer fiktiven Schrittzahl,
Mit dieser fiktiven Schrittzahl ist eine Zahl gemeint, die einer 
absoluten Position des Motors (mit Referenz der Nullposition) 
entspricht.
Willkürliches Analogon: dein Motor fährt zu Position A, also an Position 
3453 Schritte.
Nicht gemeint ist eine relative Größe wie 10 Umdrehungen oder 45°, da 
man hier nur Größenänderung, nicht aber Absolutposition kennt.
> die der Motor anzufahren hat. Gleichzeitig zählt man auch die reale
> Schrittzahl, die der Motor seit dem Einschalten schon gemacht hat mit.
Um eben seine Nullposition zu kennen.
>
> In einer ISR (Timergesteuert) passiert dann:
> Ist nun die Vorgabe größer als die reale Schrittzahl, dann lässt man den
> Motor einen Schritt in die positive Richtung machen. Ist sie kleiner
> dann einen Schritt in die andere Richtung. Danach wird die reale
> Schrittzahl um diesen 1 gemachten Schritt korrigiert.
>
>
> In Summe läuft es darauf hinaus, dass der Motor regelmässig immer 1
> Schritt macht um seine eigene Schrittzahl auf die Vorgabe abzugleichen.
> Will ich den Motor auf die Position Schritt 978 schicken, dann brauch
> ich die nur in diese Vorgabevariable schreiben und der regelmässige
> Timerinterrupt sorgt dafür, dass der Motor diese Position anfährt.
> Andere ich meine Meinung während der Motor gerade fährt ist auch das
> kein Problem: Ich geb eine neue Vorgabe und der Motor fährt diese an.

von JSP (Gast)


Lesenswert?

Karl heinz Buchegger schrieb:
> Ich vergass.
>
> Du hast ja einen bipolaren Motor. Da wird das nichts mit einem ULN. Dazu
>
> brauchst du eine H-Brücke für jede Wicklung.


Stimmt hast recht!

Also bis jetzt habt ihr mich alle etwas verwirrt, und versteh nur noch 
Bahnhof!

Also ich will das gleich wie oben  auf  dem viedeo erreichen und das 
ohne endschalter und das alles mit L297+L298!

von Karl H. (kbuchegg)


Lesenswert?

JSP schrieb:

> Also ich will das gleich wie oben  auf  dem viedeo erreichen und das
> ohne endschalter und das alles mit L297+L298!

Na, passt doch!
Wenn du den L297 L298 schon hast, dann am Motor die Leitungen für die 
beiden Wicklungen identifizieren, jeweils eine Wicklung am 298 an den 
dafür vorgesehenen Pins anschliessen, den 297 davor setzen und im 
Prinzip steht dann schon mal die Hardware.

Hast du die schon?

Der Rest ist dann einfach:
Direction Eingang vom 297 in die gewünschte Richtung schalten, und mit 
jedem Puls am Clock Eingang des 297 macht der Motor einen Schritt in die 
eingestellte Richtung. Der Rest ist dann nur noch: Schritte zählen bzw. 
vom ADC Wert her ausrechnen auf welcher Schrittposition man eigentlich 
stehen sollte und wie oben angesprochen ein etwas cleveres Schema, wie 
eine ISR im Hintergrund diese Schrittposition sukzessive anfährt.

Aber auch hier wieder:
Nicht zuviel auf einmal. Für den Anfang ist es Softwareseitig genug, 
wenn der Motor erst mal dreht. Dann vielleicht mit einer Taster einen 
Schritt machen lassen. Dann die Nachführ - ISR programmieren, die ev. 
von 2 Tastern jeweils unterschiedliche Vorgabewerte bekommt. Und dann 
kommt der große Moment: ADC gibt die Vorgabewerte vor.


Jetzt muss ich mich aber schon wundern. Solche Schaltungen bzw. 
Ansteuerungen gibts doch, auch hier im Forum, wie Sand am Meer.

von JSP (Gast)


Lesenswert?

Also die Hardware anschließen ist kein problem!
Mir macht eher die sofware probleme, irgendwie krieg ich das nicht in 
meinen Kopf wie das funktionieren soll.


Karl heinz Buchegger schrieb:
> Jetzt muss ich mich aber schon wundern. Solche Schaltungen bzw.
>
> Ansteuerungen gibts doch, auch hier im Forum, wie Sand am Meer.

Hab überall gesucht aber nichts, wie ich es will gefunden bzw. in 
Assembler!

von Karl H. (kbuchegg)


Lesenswert?

JSP schrieb:

> Hab überall gesucht aber nichts, wie ich es will gefunden bzw. in
> Assembler!

Wie du es willst ... wirst du sowieso nie 100% finden
Darum muss man die einzelnen Thematiken auch lernen damit man selber in 
der Lage ist, die Einzelteile zusammenzusetzen.

Programmieren ist nicht 'Malen nach Zahlen', wo man vorgefertigten Code 
nur noch übernimmt.

von Karl H. (kbuchegg)


Lesenswert?

JSP schrieb:

> Mir macht eher die sofware probleme, irgendwie krieg ich das nicht in
> meinen Kopf wie das funktionieren soll.

Dann stell dir zunächst ein einfacheres Ziel: Dein Motor soll einen 
Schritt machen, wenn du auf einen Taster drückst.

Ziel ist es, dass du lernst, wie man mit dem L297 arbeitet. Danach hast 
du keine Probleme mehr, wenn dein Schrittmotor laut deiner µC internen 
Rechnung auf der Schrittzahl 387 steht, so anzusteuern, dass er auf der 
Schrittzahl 4872 (wieder im µC mitgezählt) wieder stehen bleibt. Alles 
nur eine Frage von: muss ein Schritt in eine bestimmte Richtung gemacht 
werden und wenn ja: dann schicke einen Clockpuls an den Motortreiber.

Der springende Punkt ist ganz einfach der:
Eine bestimmte 'Position' deines Motors ist nichts anderes als eine 
bestimmte Schrittzahl (ausgehend von der 0-Stellung). Die Vorgabe an 
deinen Motor lautet nicht "dreh nach links" sondern "bewege dich auf 
Position 387" oder "bewege dich auch Position 8723", wobei 'Position' 
nichts anderes ist als die Anzahl der Schritte von 0 weg gezählt.
Und dazu musst du natürlich im µC mitzählen wieviele Schritte schon 
gemacht wurden. Schaltest du den Klimbim ein, so nimmst du an der Motor 
steht auf 0. Um dann die Vorgabe "Bewege dich auf Position 387" 
auszuführen, muss der Motor 387 Schritte nach rechts durchführen. Ist er 
dort angekommen so steht der Motor in der Position 387. Auf das neue 
Kommando "bewege dich auf Position 417" braucht der Motor daher nur noch 
417-387 = 30 Schritte nach rechts machen und danach ist er in Position 
417. Um von dort zu Position 243 zu gelangen, muss der Motor 417 - 243 = 
174 Schritte nach links machen. Danach steht der Motor in der Position 
243.

Du musst aber im Grunde gar nicht grossartig rechnen.
Es genügt ja völlig in einer Schleife festzustellen ob der Motor einen 
Schritt machen muss oder nicht. Als Pseudocode so

1
schleife:
2
   if vorgabe > aktuelle_position
3
   {
4
     mache 1 Schritt nach rechts
5
     aktuelle_position = aktuelle_position + 1
6
   }
7
8
   if vorgabe < aktuelle_position
9
   {
10
     mach 1 Schritt nach links
11
     aktuelle_position = aktuelle_position - 1
12
   }
13
14
   mach was anderes, zb den ADC abfragen und eine neue Vorgabe ausrechnen
15
16
   rjmp schleife

bei jedem Schleifendurchlauf wird der Motor 1 Schritt in die richtige 
Richtung gesteuert, so dass sich die Different zwischen 
aktuelle_position und vorgabe verringert. Hat der Motor die vorgabe 
erreicht, so bleibt er dort stehen, weil ja keine Schritte mehr gemacht 
werden. Die Schleife läuft aber weiter, bis du irgendwann am ADC drehst 
und einen anderen Wert für die vorgabe vorgibst, die dann auch brav 
innerhalb der Schleife sofort in Einzelschritten angefahren wird, da 
sich ja die aktuelle_position von der vorgabe unterscheidet und damit 
jeweils 1 Schritt bei jedem Schleifendurchlauf in die richtige Richtung 
gemacht wird.

Aber wie gesagt: Dazu solltest du vorher eine Vorübung machen, wei man 
den Motortreiber dazu bringt, 1 Schritt in eine Richtung auszuführen.

Auch eine Vorübung in Sachen Timer + Interrupts ist eine extrem gute 
Idee.

Du hast noch einen mittelweiten Weg vor dir, ehe du die 
Software-Einzelteile zu einem Gesamtsystem zusammenmontieren kannst.

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.