Hallo, ich versuche, einen bipolaren Schrittmotor zum Laufen zu bringen und komme da nicht so wirklich weiter. Der Schrittmotor (1,8° Step) soll eine Masse von ca. 300g bewegen. Als Auflösung reichen viertelschritte. Allerdings soll die Bewegung ruhig und ruckelfrei sein. Das Problem ist die Programmierung. Ich programmiere – oder versuche es zumindest ;-) - mit Bascom avr. Als erstes habe ich es mit dem Treiber L293D für den Schrittmotor versucht. Im Vollschrittmodus lief er gut. Jedoch sprang der Motor immer nur ruckhaft einen Schritt weiter und drehte sich nicht gleichmäßig. Nächster Versuch war, 4 Software PWM-Ports zu erstellen, um den Motor im Mikroschrittmodus zu betreiben. Allerdings vibrierter der Motor sehr stark und drehte sich nicht, der Motor musste hierbei keine Last bewegen. (Wenn ich anstatt des Motors 4 LED’s anschließe, dimmen die LED‘s genauso wie erwartet.) Eine Weitere Idee ist jetzt, das Ganze mit der Treiberkombination PBM 3960 + PBL 3771 bzw. NJU 39610 + NJM 3771 zu versuchen. Hier verstehe ich jedoch die Vorgehensweise nicht so ganz. An die Inputregister D0 bis D6 gebe ich über den Mikrocontroller ein Bitmuster aus, mit D7 bestimme ich die Richtung, in welcher der Motor sich drehen soll und dann generiere ich einen WR-Puls damit sich der Motor dreht? Funktioniert das so? Was mache ich dann mit A0, A1 und CS? Im Datenblatt steht ja, dass es nicht sinnvoll ist, alle theoretisch möglichen Mikroschritte aus zu nutzen. Heißt dass, das ich das Register nicht immer um binär 1 erhöhe sondern um binär 10 oder binär 100? In welcher Frequenz müssen die Mikroschritte generiert werden, damit eine saubere Drehung entsteht? Datenblatt PBM 3960: http://pdf1.alldatasheet.com/datasheet-pdf/view/60248/ERICSSON/PBM3960-1.html Am liebsten würde ich beide Varianten zum Laufen bekommen. Hat jemand vielleicht ein paar Tipps für mich? Gruß Christian
Christian Kl schrieb: > bewegen. (Wenn ich anstatt des Motors 4 LED’s anschließe, dimmen die > LED‘s genauso wie erwartet.) Vielleicht sind deine Erwartungen fehlerhaft? Poste mal den Code.
Christian Kl schrieb: > Allerdings vibrierter der Motor sehr > stark und drehte sich nicht, der Motor musste hierbei keine Last > bewegen. (Wenn ich anstatt des Motors 4 LED’s anschließe, dimmen die > LED‘s genauso wie erwartet. Nur um Missverständnissen vorzubeugen: Schliesst du die 4 PWM Signale direkt an die Motorphasen an, oder über 4 Transistoren? Zur Variante mit dem L293D gibt es mehr als genügend Beispiele für Soft- und Hardware hier im forum und im Internet. Mit etwas Suchen lässt sich da leicht ein gutes Beispiel finden.
Hallo, Zum L293D Beschaltung: Die 4 „Soft-PWM – Portpins“ habe ich an den L293D angeschlossen und zwar an 1A, 2A, 3A und 4A. Weiterhin habe ich noch 1-2 EN und 2-3 EN an den Mikrocontroller angeschlossen um eventuell später mal mehrere Motoren betreiben zu können. Außerdem habe ich gelesen, dass man hiermit den Strom begrenzen, bzw. erhöhen kann falls mehr Drehmoment erforderlich ist. Das wollte ich aber erst mal beiseite lassen. Y1 bis Y4 des L293D gehen dann an die beiden Motorphasen. Wozu brauche ich jetzt noch Transistoren? (Der L293D hat eingebaute Freilaufdioden) Da ich programmiertechnisch nicht ganz so bewandert bin, habe ich einen anderen Code adaptiert. Es ging mir zunächst nur um eine saubere Drehung:
1 | ' ------ Soft PWM für Mikroschrittmotor ------------- |
2 | |
3 | |
4 | |
5 | |
6 | $crystal = 8000000 |
7 | $regfile "m16def.dat" |
8 | $programmer = 7 'STK 500 |
9 | $hwstack = 8 |
10 | $swstack = 6 |
11 | $framesize = 10 |
12 | |
13 | |
14 | Dim M1_w1afreq As Integer , M1_w1bfreq As Integer , M1_w2afreq As Integer , M1_w2bfreq As Integer |
15 | Dim Updn As Byte |
16 | Dim Wartems As Integer |
17 | Dim Zeit As Integer |
18 | Dim N As Integer |
19 | Dim Flimit As Integer |
20 | |
21 | |
22 | '-------- Bitmuster für Vollschrittbetrieb -------- |
23 | ' Mit dem hier auskommentiere Bitmuster funktioniert der Schrittmotor im |
24 | ' Vollschrittbetrieb deshalb habe ich es aus dem Code erstaml nicht |
25 | 'rausgelöscht. |
26 | |
27 | 'Portb.0 = 1 ' 1-2 EN |
28 | 'Portb.5 = 1 ' 2-3 EN |
29 | |
30 | 'Portb.1 = 1 |
31 | 'Portb.2 = 0 |
32 | 'Portb.3 = 0 |
33 | 'Portb.4 = 1 |
34 | 'Waitms 500 |
35 | |
36 | 'Portb.1 = 1 |
37 | 'Portb.2 = 0 |
38 | 'Portb.3 = 1 |
39 | 'Portb.4 = 0 |
40 | |
41 | 'Waitms 500 |
42 | |
43 | 'Portb.1 = 0 |
44 | 'Portb.2 = 1 |
45 | 'Portb.3 = 1 |
46 | 'Portb.4 = 0 |
47 | |
48 | 'Waitms 500 |
49 | |
50 | 'Portb.1 = 0 |
51 | 'Portb.2 = 1 |
52 | 'Portb.3 = 0 |
53 | 'Portb.4 = 1 |
54 | |
55 | |
56 | ' Waitms 500 |
57 | |
58 | 'Portb.1 = 1 |
59 | 'Portb.2 = 0 |
60 | 'Portb.3 = 0 |
61 | 'Portb.4 = 1 |
62 | 'Waitms 500 |
63 | |
64 | '------- Ende Bitmuster für Vollschrittbetrieb ------ |
65 | |
66 | |
67 | |
68 | |
69 | Const Timerstartwert = 10 'Wert ab dem bis 256 bzw. 1024 gezählt wird. |
70 | Config Timer0 = Timer , Prescale = 1 'Prescale: Bei Ausgabe des Bitmusters an LED's ist alles andere außer 1 zu schnell. |
71 | Timer0 = Timerstartwert |
72 | On Timer0 Ontimer0 |
73 | Enable Timer0 |
74 | Enable Interrupts |
75 | |
76 | Motor1_w1a Alias Portb.1 'Motorwicklung 1 Ende "a" der ersten Spule. PortB.1 geht zum L293 1A |
77 | Motor1_w1b Alias Portb.2 'Motorwicklung 1 Ende "b" der ersten Spule. PortB.2 geht zum L293 2A |
78 | Motor1_w2a Alias Portb.3 'Motorwicklung 2 Ende "a" der zweiten Spule. PortB.3 geht zum L293 3A |
79 | Motor1_w2b Alias Portb.4 'Motorwicklung 2 Ende "b" der zweiten Spule. PortB.4 geht zum L293 4A |
80 | |
81 | |
82 | |
83 | Config Motor1_w1a = Output ' PortB.1 bis PortB.4 als |
84 | Config Motor1_w1b = Output ' Ausgang setzen |
85 | Config Motor1_w2a = Output |
86 | Config Motor1_w2b = Output |
87 | |
88 | |
89 | |
90 | Motor1_w1a = 0 ' Werte initialisieren für den ersten Start |
91 | Motor1_w1a = 0 |
92 | Motor1_w1a = 0 |
93 | Motor1_w1a = 0 |
94 | |
95 | |
96 | |
97 | Flimit = 400 'Zählerbegrenzer |
98 | Zeit = 3 'Vergleichszaehler für Pulsweite im Interrupt |
99 | Wartems = 1 'Wartevariable fuer waitms. |
100 | Updn = 1 'Toggle fuer Hoch/Runter-Zaehlen der Intervalle. |
101 | 'Bei Wert groesser 1 wird Wartems nicht hoch/runtergezaehlt |
102 | |
103 | M1_w1afreq = 0 |
104 | M1_w1bfreq = 0 |
105 | M1_w2afreq = 0 |
106 | M1_w2bfreq = 0 |
107 | |
108 | |
109 | |
110 | Portb.1 = 1 |
111 | Portb.2 = 0 |
112 | Portb.3 = 0 |
113 | Portb.4 = 1 |
114 | |
115 | Macro Motor 1 Schritt 1 '1001-->1010 |
116 | M1_w1afreq = Flimit |
117 | M1_w1bfreq = 0 |
118 | M1_w2afreq = 0 |
119 | M1_w2bfreq = Flimit |
120 | |
121 | |
122 | Waitms Wartems |
123 | For N = 1 To Flimit |
124 | |
125 | Incr M1_w2afreq |
126 | Decr M1_w2bfreq |
127 | |
128 | Waitms Wartems |
129 | |
130 | Next N |
131 | M1_w1afreq = Flimit |
132 | |
133 | |
134 | |
135 | End Macro |
136 | |
137 | |
138 | |
139 | Macro Motor 1 Schritt 2 '--> 0110 |
140 | M1_w1afreq = Flimit |
141 | M1_w1bfreq = 0 |
142 | M1_w2afreq = Flimit |
143 | M1_w2bfreq = 0 |
144 | |
145 | |
146 | Waitms Wartems |
147 | For N = 1 To Flimit |
148 | |
149 | Decr M1_w1afreq |
150 | Incr M1_w1bfreq |
151 | |
152 | Waitms Wartems |
153 | |
154 | Next N |
155 | M1_w1afreq = Flimit |
156 | |
157 | |
158 | |
159 | |
160 | |
161 | End Macro |
162 | |
163 | Macro Motor 1 Schritt 3 '--> 0101 |
164 | M1_w1afreq = 0 |
165 | M1_w1bfreq = Flimit |
166 | M1_w2afreq = Flimit |
167 | M1_w2bfreq = 0 |
168 | |
169 | |
170 | Waitms Wartems |
171 | For N = 1 To Flimit |
172 | |
173 | |
174 | Decr M1_w2afreq |
175 | Incr M1_w2bfreq |
176 | |
177 | Waitms Wartems |
178 | |
179 | Next N |
180 | M1_w1afreq = Flimit |
181 | |
182 | |
183 | End Macro |
184 | |
185 | Macro Motor 1 Schritt 4 '--> 1001 |
186 | M1_w1afreq = 0 |
187 | M1_w1bfreq = Flimit |
188 | M1_w2afreq = 0 |
189 | M1_w2bfreq = Flimit |
190 | |
191 | |
192 | Waitms Wartems |
193 | For N = 1 To Flimit |
194 | |
195 | Incr M1_w1afreq |
196 | Decr M1_w1bfreq |
197 | |
198 | |
199 | Waitms Wartems |
200 | |
201 | Next N |
202 | M1_w1afreq = Flimit |
203 | |
204 | |
205 | End Macro |
206 | |
207 | |
208 | |
209 | Do 'Hauptschleife |
210 | Portb.0 = 1 ' 1-2 EN gibt am L 293 die Wicklung 1 frei |
211 | Portb.5 = 1 ' 2-3 EN gibt am L 293 die Wicklung 2 frei |
212 | Motor 1 Schritt 1 |
213 | Motor 1 Schritt 2 |
214 | Motor 1 Schritt 3 |
215 | Motor 1 Schritt 4 |
216 | |
217 | |
218 | If Updn = 1 Then |
219 | Wartems = Wartems + 3 |
220 | If Wartems >= 100 Then Updn = 0 |
221 | Elseif Updn = 0 Then |
222 | Wartems = Wartems - 3 |
223 | If Wartems = 0 Then Updn = 1 |
224 | End If |
225 | Loop |
226 | |
227 | End |
228 | |
229 | Ontimer0: |
230 | Incr Zeit 'Bei jedem Interruptueberlauf Zeit um 1 erhöhen |
231 | If Zeit < M1_w1afreq Then Motor1_w1a = 0 Else Motor1_w1a = 1 |
232 | If Zeit < M1_w1bfreq Then Motor1_w1b = 0 Else Motor1_w1b = 1 |
233 | If Zeit < M1_w2afreq Then Motor1_w2a = 0 Else Motor1_w2a = 1 |
234 | If Zeit < M1_w2bfreq Then Motor1_w2b = 0 Else Motor1_w2b = 1 |
235 | If Zeit >= Flimit Then Zeit = 0 'Bei erreichen von Flimit zurücksetzen |
236 | Timer0 = Timerstartwert |
237 | Return |
Im Internet habe ich bis jetzt immer nur tolle Abhandelungen gefunden, wie so ein Schrittmotor in der Theorie funktioniert, welche Kräfte wirken usw... Aber einen schönen, auskommentierten Quellcode in Basic leider nicht. Da ich Assembler und C nicht kann, helfen mir die Codes auch nicht viel weiter und ich denke ein verständlicher Quelltext in BASCOM würde auch vielen anderen Anfängern helfen. Falls jemand dazu einen Link hat würde ich mich freuen. Gruß Christian
Hallo Christian! > Zum L293D > Beschaltung: Die 4 „Soft-PWM – Portpins“ habe ich an den L293D > angeschlossen und zwar an 1A, 2A, 3A und 4A. Weiterhin habe ich noch 1-2 > EN und 2-3 EN an den Mikrocontroller angeschlossen um eventuell später > mal mehrere Motoren betreiben zu können. Außerdem habe ich gelesen, dass > man hiermit den Strom begrenzen, bzw. erhöhen kann falls mehr Drehmoment > erforderlich ist. Das wollte ich aber erst mal beiseite lassen. Was hat denn dein Motor für eine Nennspannung, und mit welcher Spannung betreibst du deinen L293? Ich habe so das Gefühl, dass schon die Hardware nicht optimal ist. Was es die Software angeht: > Als erstes habe ich es mit dem Treiber L293D für den Schrittmotor > versucht. Im Vollschrittmodus lief er gut. Jedoch sprang der Motor > immer nur ruckhaft einen Schritt weiter und drehte sich nicht > gleichmäßig. Bei welcher Geschwindigkeit bzw. Steprate war das? Bei niedrigen Geschwindigkeiten "steppt" der Schrittmotor nur, deswegen heißt er so. Wenn du auch bei niedrigen Geschwindigkeiten auf einen möglichst gleichmäßigen Lauf wert legst, wirst du um Mikroschritt nicht herumkommen. Da setzt man in der Regel aber Treiber mit Stromregelung ein. Reine gesteuerte PWM ist dafür zu ungenau. Ausserdem gibt es das alles schon fertig auf einem Chip, z.B. Allegro A3977 oder A3979. Mit freundlichen Grüßen Thorsten Ostermann
Hallo Thorsten, für den µC beträgt die Spannung 5V (über 7805 wie im Tutorial) der L293D bekommt 12V aus einem alten PC-Netzteil. Am 12V Eingang des L293 habe ich noch ein Stützkondensator von 1000µF gesetzt Der Schrittmotor ist ein „Reserve-Schrittmotor“ für ein gerät, an dem er auch mit 12V betrieben wird. Allerdings wird dort der PBL 3771 benutzt. Da ich hiervon auch noch Ersatztreiber habe, wollte ich es dann damit versuchen wie oben geschrieben. Nur verstehe ich nicht, wie der funktioniert. Im professionellen Bereich macht man es aber auch so. Die nehmen zwar einen L6204D aber das ist im Prinzip auch nur eine Brücke und somit nichts anderes als der L293. Es muss also an der Programmierung liegen. Nur finde ich kein konkretes Beispiel, an dem man sehen kann, wie man sowas in Bascom macht. Falls jemand ein funktionierendes Beispiel hat oder einen Link dazu würde ich mich sehr freuen.
> Jedoch sprang der Motor immer nur ruckhaft einen Schritt > weiter und drehte sich nicht gleichmäßig. Deswegen bekommen Schrittmotore eine Bremsresonatorplatte, also Gewicht. > PBM3960 + PBL3771 Veraltet. Nimm TB6560. Dann klappt's auch mit der Mikroschrittprogrammierung. Ich versteh übrigens deinen Code kein Stück: If Zeit < M1_w1afreq Then Motor1_w1a = 0 Else Motor1_w1a = 1 If Zeit < M1_w1bfreq Then Motor1_w1b = 0 Else Motor1_w1b = 1 If Zeit < M1_w2afreq Then Motor1_w2a = 0 Else Motor1_w2a = 1 If Zeit < M1_w2bfreq Then Motor1_w2b = 0 Else Motor1_w2b = 1 Du möchtest die Spannung PWM-Mässig einen Teil der Zeit einschalten und einen Teil der Zeit ausschalten ? Schrittmotore interessieren sich nicht für die Spannung, sondern für den Strom. Deswegen enthalten L297 und PBL3771 Strommmesshunts Rs und vergleichen deren Spannungsabfall mit einer Sollspannung. Irgendwie sehe ich überhaupt nichts davon in deinem Programm, aber vielleicht bin ich ja auch nur blind. In C (sorry, ich krieg bei BASCOM Augenkrebs so wie du sicher bei C): int sin[32]={0,20,38,56,71,83,92,98,100,98,92,83,71,56,56,38,20,0,-20,-38,-5 6,-71,-83,-92,-98,-100,-98,-92,-83,-71,-56,-56,-38,-20}; int cos[32]={-100,-98,-92,-83,-71,-56,-56,-38,-20,0,20,38,56,71,83,92,98,100 ,98,92,83,71,56,56,38,20,0,-20,-38,-56,-71,-83,-92,-98}; for(i=0;;i=t%32) { a=Analogmesswert shunt Wicklung X if(a>abs(sin[i])) if(sin[i]>0)) { portb.1=1; portb.2=0; } else { portb.1=1; portb.2=0; } else { portb.1=0; portb.2=0; } a=Analogmesswert shunt Wicklung X if(a>abs(cos[i])) if(cos[i]>0)) { portb.3=1; portb.4=0; } else { portb.3=1; portb.4=0; } else { portb.3=0; portb.4=0; } t=aktuelle Millisekundenzeit t*=Geschwindigkeitsfaktor; // also wie viele Steps pro Millisekunde } Nun wäre der Geschwindgkeitsfaktor interessant, denn ein Schrittmotor läuft nicht nur mit vollem Tempo, er will langsam beschleunigt werden und langsam bremsen, man muß also den Geschwindigkeitsfaktor von aussen vorgeben, eventuell durch ein Poti an einem Analogeingang des uC zu Testzwecken. Ebenso ist interessant, wie der uC seine aktuelle Millisekundenzeit bekommt. Man muß einen Timer programmieren und der kann überlaufen und die Überläufe wird man auch beachten müssen. Dieser Timer ist aber das einzige, was in einer Interrupt-Funktion gemacht werden sollte, die eigentliche Stromregelung muss so schnell wie möglich sein (gute Schrittmotortreiber machen das mit über 1MHz also unter 1us Reaktionszeit) also wird man die tunlichst als enge Assembleroptimierte Schleife bauen, wo A/D-Wandlung und Reaktion darauf zeitverschachtelt sind. Ein TB6560 ist einfacher zu programmieren...
Hallo, erst mal vielen Dank für die Antworten! Ich habe in den letzten Tagen das folgende Projekt nach gebaut: http://www.hoelscher-hi.de/hendrik/light/dmxstep.htm Es ist ein DMX-Interface, welches bis zu zwei Schrittmotoren antreibt. Ergebnis: Bei der Resetfahrt wackelt der Motor ein bisschen, dreht sich aber nicht. Schubst man ihn aber an, dreht er sich. Also gibt der L293D wohl nicht genug Strom her. Bzw. Muss man den Strom wohl an gewissen Punkten absenken. Somit hat sich der L293 erst mal erledigt. Bei der PBL 3771 / PBM 3960 Kombination, bin ich ein Stück weiter gekommen, aber nicht viel: Es gibt zwei Kanäle mit je 7 bit. Also einen Kanal pro Spule. A0 schaltet zwischen Kanal 1 und Kanal 2 um. Mit A1 kann man zwischen Drehrichtung oder Spannung umschalten. Die Werte für Drehrichtung oder Spannung werden über die 7 bits eingestellt. Die Werte werden mit zwei write- Pulsen übernommen. Was ich jetzt noch wissen müsste: In welcher Folge müssen sich die Kanal-bits ändern? Fange ich mit Kanal 1 bei 128 an und subtrahiere und bei Kanal 2 bei 1 und addiere? Das scheint nicht zu funktionieren. Allerdings habe ich die Spannung erst mal völlig außer Acht gelassen. Wie muss ich die bits für die Spannung ändern? Bezüglich des TB6560: Wie würde dieser denn funktionieren und wo kann man ihn bekommen?
Du solltest es vielleicht mal mit systematischer Suche nach deinen fehlenden Erkenntnissen probieren, und nicht drei verschiedene Aufbauten machen und jedesmal wohl wieder in dieselbe Falle stolpern. Motor kaputt, Kabel ab, vielleicht ist es gar kein Schrittmotor, es gibt viele Möglichkeiten warum etwas nicht funktioniert. Wenn du ein Netzteil hast, kannst du doch erst mal mit Kabeln versuchen, den Motor drehen zu lassen, immer abwechselnd die Spulen bestromen in Handarbeit, das geht, muss man nur was tun. Dann lässt man ihn per L293 langsam drehen (wobei er wohl nur zappelt) und misst dabei die Ausgangsspannungen. Dann sieht man ja wohl, ob was nicht stimmt. u.s.w. > und wo kann man ihn bekommen? Beim Elektronikhändler wie Darisus.de
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.