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!
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?
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.
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!
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.
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!
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.
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.
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
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.
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 ;-)
Ohne Endschalter,gegen Anschlag fahren. Wurde und wird heute noch bei Scannern gemacht.
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.
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.
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.
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!
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.
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!
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.