Hallo und einen schönen Sonttag euch allen.
Bin hier ein bissel am Basteln und möchte mit meinem Atmega8 und einem
L293D einen Schrittmotor ansteuern.
Hab bei den ersten tests einfach die Ausgänge des Atmega8 (die an den
richtigen Eingängen des L293Ds angeschlossen sind) nach folgenden Schema
geschaltet was auch wunderbar funktioniert hat.
Nach dem ich mich ein bissel ausgetobt habe, hab ich mich dran gemacht
und versucht mit einem Rechteck Signal (Takte) den Schrittmotor zum
laufen zu bringen. Das Problem ist das der Motor total unrund läuft und
auch keine Power hat wie bei den ersten versuchen. Hier ist mein Ansatz
vielleicht nicht die eleganteste weise aber bin ja noch am lernen.
Wenn ich Dein µC wäre, würde ich mich vermutlich mit Stacküberlauf
verabschieden.
Mach die Sache doch nicht so kompliziert!
Nimm ein Feld (Tabelle) mit den vier möglichen Zuständen an PortB und
gib diese Muster nacheinander an PortB aus. Dann dreht sich der Motor je
nach Takt der Impulsausgabe vor oder zurück.
Den Takt erzeugt man am besten mit einem Timer und die Taktausgabe im
Timer-Interrupt, wenn Du es verbessern willst.
Fertig.
schreiben.
Man darf das ruhig hier in Bit oder Bitmaskenschreibweise schreiben
1
uint8_tvs[4]={
2
1<<PB2|0<<PB3|1<<PB4|0<<PB5,
3
0<<PB2|1<<PB3|1<<PB4|0<<PB5,
4
0<<PB2|1<<PB3|0<<PB4|1<<PB5,
5
1<<PB2|0<<PB3|0<<PB4|1<<PB5,
6
};
(die 0 << xx sind natürlich im Grunde sinnlos und dienen nur als
Platzhalter, dass dieses Bit eben nicht zu setzen ist und um eine schöne
Tabellenstruktur erhalten zu können)
und natürlich bei der Ausgabe aufs Port entsprechend anpassen.
irgendwie bleibt der an der 4. stelle (0110) stehen und das wars.
Kann den so ein Feld überhaupt so einen großen wert in einem Feldelement
speichern?
Sieht jemand einen Denkfehler? Hoffe ich hab es auch richtig verstanden.
lg
shabi
Shabi N. schrieb:> uint8_t vs[4]={> (PORTB |= 1<<PB2) | (PORTB &= ~(1<<PB3)) | (PORTB |= 1<<PB4) |
Du kannst doch hier keine Zuweisungen machen!
Da wird eine Variable in Form eines Arrays definiert! EIne Variable hält
Daten. Zum Beispiel Daten, die man an einen Port ausgeben kann. Aber
eine Variable enthält keine ausführbare Anweisungen.
Vielleicht doch mal ein C-Buch konsultieren und grundlegende
Programmkonzepte erst mal erlernen?
Achssooooooo jetzt verstehe ich das.
Ich kann ja gar kein Array ausführen sondern wie du ober geschrieben
hast mein Datenfeld dem Port zuweisen...
Mann mann bin ich blöd.
Super danke jetzt hab ich es gerafft.
LG
Shabi
So es hat geklappt wenn ich delays reinbaue läuft der Motor perfekt.
Ich hab den Code auch mal auf die Halbschritte erweitert funktioniert
auch einwandfrei.
Und jetzt kommt das nächste Problem :-).
Ich möchte ja das ganze richtung und Taktgesteuert machen.
Hab jetzt mal etwas rum probiert und bekomme mit dem neuen Code auch das
gleiche Problem das der Motor unrund läuft und keine Power hat. Der
läuft noch nicht mal in einer Richtung sondern macht was er will.
Das ist mein aktueller Code:
1
intmain(void)
2
{inti=0;
3
DDRB=(1<<PB5)|(1<<PB4)|(1<<PB3)|(1<<PB2);
4
DDRC=(0<<PC0);
5
uint8_tvs[8]=
6
{
7
1<<PB2|0<<PB3|0<<PB4|1<<PB5,
8
0<<PB2|0<<PB3|0<<PB4|1<<PB5,
9
0<<PB2|1<<PB3|0<<PB4|1<<PB5,
10
0<<PB2|1<<PB3|0<<PB4|0<<PB5,
11
0<<PB2|1<<PB3|1<<PB4|0<<PB5,
12
0<<PB2|0<<PB3|1<<PB4|0<<PB5,
13
1<<PB2|0<<PB3|1<<PB4|0<<PB5,
14
1<<PB2|0<<PB3|0<<PB4|0<<PB5,
15
};
16
17
while(1)
18
{PORTB=vs[i];
19
if(PINC&(1<<PINC0))
20
{
21
i++;
22
}
23
if(i==8)
24
i=0;
25
}
26
}
Hier "if (PINC & (1<<PINC0))" möchte ich sagen wenn PC0 == 1 dann i++.
Und irgendwie scheint das Problem genau da zu liegen.
Hab schon alles was mir so einfällt probiert komme aber nicht drauf was
das Problem sein könnte.
LG
Shabi N. schrieb:> while(1)> { PORTB = vs[i];> if (PINC & (1<<PINC0))> {> i++;> }> if( i == 8 )> i = 0;> }
zu schnell.
Viel zu schnell!
Da kommt kein Motor mehr mit.
> Hier "if (PINC & (1<<PINC0))" möchte ich sagen wenn PC0 == 1 dann i++.> Und irgendwie scheint das Problem genau da zu liegen.
Nein.
Dein Problem ist, dass dein Motor nicht alle 0.0000001 Sekunden einen
Schritt machen kann. Schon gar nicht aus dem Stand heraus. Ein bischen
mehr Realismus!
PC0 soll hier wohl ein Takt_EINGANG_ darstellen. Dann mach Dich mal zum
Thema Flankenerkennung schlau. Bei Dir rauscht die if-Abfrage nur so
durch, weil der Takt ja längere Zeit (für den Controller eine gefühlte
Ewigkeit) auf 1 sein wird.
hallo
Ja genau das Problem habe ich gerade. ich hab mal ein delay eingebaut.
Der Motor dreht wunderbar und mit dem delay wert kann ich die Drehzahl
festlegen. Allerdings möchte ich ja wie du schon bemerkt hast das ganze
Taktgesteuert machen.
So wie es aktuell ist, dreht der Motor sich so lange ich den taster
gedrückt halte.
Flanken auswerten dann brauch ich bestimt timer.
Ich muss noch hinzu sagen das ich das ganze auch gern erweitern würde
und eine kleine 3Achs steuerung basteln will.
Ich brauch in prinziep pro achse 2 Eingänge und 4 Ausgänge.
Rein rechnerich gesehen würde der Atmega ja reichen. Ist nur die Frage
ob ich die Ports so nutzen kann.
Karl Heinz schrieb:> und natürlich bei der Ausgabe aufs Port entsprechend anpassen.
Ob in den über Oder-Verknüpfungen erzeugten Bitmustern nun PBx, PCx oder
sonst irgendein Portname auftaucht, ist doch völlig Schnuppe.
Entscheidend ist einzig und alleine die Bitnummer.
Wolfgang schrieb:> Karl Heinz schrieb:>> und natürlich bei der Ausgabe aufs Port entsprechend anpassen.>> Ob in den über Oder-Verknüpfungen erzeugten Bitmustern nun PBx, PCx oder> sonst irgendein Portname auftaucht, ist doch völlig Schnuppe.> Entscheidend ist einzig und alleine die Bitnummer.
Ja.
Trotzdem verändert man keine Bits, an denen nichts hängt.
1
PORTB=vs[i];
ist ein Rundumschlag an allen Port-Bits.
Ich weiß nicht, wie du das siehst. Aber für mich ist das nicht
akzeptabel.
Shabi N. schrieb:> festlegen. Allerdings möchte ich ja wie du schon bemerkt hast das ganze> Taktgesteuert machen.
Saublöde Frage.
Waru verwendest du dann nicht gleich einen Schrittmotorcontroller?
Der kann das alles perfekt.
> So wie es aktuell ist, dreht der Motor sich so lange ich den taster> gedrückt halte.>> Flanken auswerten dann brauch ich bestimt timer.
Kommt drauf an. Wenn das EIngangssignal nicht prellt brauchst du keinen
Timer. Du brauchst nur eine Flankenerkennung.
@ Karl Heinz
Weil die Schrittmotorcontroller z.b. L297 nur einen Schrittmotor
betreiben können. Mein Ziel ist es einen Atmega und 3 L293D um eine
kleine 3achs Steuerung zu bauen.
Das Signal was dann rein kommt (Also die Flanken) ist ein reines
Rechtecksignal was z.b. in der CNC (EMC² oder Mach3...) verwendet wird.
Die Frequenz des taktes bestimmt die drehzahl des Motors.
Und Richtungswechsel wird dann mit H oder L realisiert.
Das ist aber erstmal nicht wichtig. zuerst muss die Steuerung einfach
nur laufen.
Shabi N. schrieb:> Weil die Schrittmotorcontroller z.b. L297 nur einen Schrittmotor> betreiben können.
Hätte halt den Vorteil, dass es schon längst laufen würde.
Aber ok. Wer weiß wozu es gut ist.
> Das Signal was dann rein kommt (Also die Flanken) ist ein reines> Rechtecksignal was z.b. in der CNC (EMC² oder Mach3...) verwendet wird.
Na dann.
Flanken erkennung und die Chose ist gegessen.
Eine Flanke liegt dann vor, wenn in der while Schleife der aktuell
festgestellte Pegel sich vom Pegel im letzten Durchlauf der while
Schleife unterscheidet.
(Ist um Grunde ganz einfach. Wenn du alle 10 Sekunden beim Fenster
raussiehst und im Nachbarhaus brennt kein Licht, dann hat sich nichts
getan. Siehst du aber raus und plötzlich brennt das Licht, welches 10
Sekunden zuvor noch nicht gebrannt hat, dann hat offenbar in der
Zwischenzeit wer eingeschaltet. Siehst du 10 Sekunden später wieder raus
und das Licht brennt noch immer, dann hat sich offenbar wieder nichts
getan. Du vergleichst also einfach: brennt das Licht jetzt und wie war
das vor 10 Sekunden? Immer schön vergleichen - dich interessiert nur, ob
alles gleich bleibt oder ob sich was verändert hat)
1
...
2
3
uint8_tPegel,PegelAlt;
4
5
...
6
7
8
PegelAlt=(PIND&(1<<PD1));
9
10
while(1)
11
{
12
Pegel=(PIND&(1<<PD1));
13
14
if(Pegel!=PegelAlt)// Hoppla, da hat sich was getan
15
// der Pin hat nicht mehr den Zustand von
16
// vorher
17
{
18
if(Pegel)// wie hat er sich denn verändert? Wenn er jetzt
HI
>Weil die Schrittmotorcontroller z.b. L297 nur einen Schrittmotor>betreiben können. Mein Ziel ist es einen Atmega und 3 L293D um eine>kleine 3achs Steuerung zu bauen.
Mit einem L293 kannst du aber nicht annähernd die Leistung aus deinen
Schrittmotoren herausholen, die möglich ist. Dazu muss der Motor im
Chopperbetrieb gefahren werden. Also mit konstantem Strom und nicht mit
konstanter Spannung. Und dazu ist z.B. ein L297 da.
MfG Spess
spess53 schrieb:> Und dazu ist z.B. ein L297 da.
Nur treibt dieser keine Motore direkt an. Man müßte schon mindestens
einen L293D dahinterschalten :-)
Zum Lernen ist die Kombination ATmega+L283 doch gut geeignet und reicht
für niedrige Drehzahlen und Kräfte auch aus. Außerdem weiß man später
ganz genau, warum man es nicht mehr machen wird/will/sollte.
Hi
>Nur treibt dieser keine Motore direkt an.
Ist mir schon längere Zeit bekannt.
>Man müßte schon mindestens einen L293D dahinterschalten :-)
Wenn schon, dann einen L293E. Der hat als einziger L293
Sense-Anschlüsse.
Für halbwegs ernsthafte Schrittmotoransteuerung ist der L293 die denkbar
ungünstigste Wahl.
Für kleinere Schrittmotoren (bis 750mA) würde ich den L6219 empfehlen.
Der hat die Choppersteuerung schon on Board und ist auch für Halbschritt
geeignet.
MfG Spess
Du weißt aber auch, dass hier Sparfüchse unterwegs sind und sich dann
ggf. für solch einen Motor entscheiden:
http://www.pollin.de/shop/dt/NjQ1OTg2OTk-/Motoren/Schrittmotoren/Schrittmotor_PSM42BYGHW603_1_8_.html
Da nutzt kein so so ausgefeilter Mikroschritt-Treiber, um ihn auf Trab
zu bringen.
spess53 schrieb:> Für kleinere Schrittmotoren (bis 750mA) würde ich den L6219 empfehlen.
Da stimme ich zu, wenn der Motor einen kleinen Wicklungswiderstand hat
und mit Konstantstrom betrieben wird!
Hallo leute
@Karl Heinz
Super danke dir für die Hilfe. Hab deinen Code mal getestet. Der Motor
dreht sich und wenn ich PD1 an meinem Frequenzgenerator anschließe läuft
der Motor, aber noch niht ganz sauber. Under der Eingang ist extrem
empfindlich. Das heißt wenn der eingang z.b. offen ist und ich komme mit
den fingern nur in die nähe des Einganges, spielt der Motor verrückt.
:-)
Werde noch ein bissel rum probieren...
@ spess53
Ja das weiß ich. Ich benutze ja auch nur mini Schrittmotoren aus DVD
Laufwerken. Daher reicht die Leistung vollkommen aus.
Danke an alle.
LG