Hallo, Leute! Nun ist endlich die Schaltung für die Motoren fertig (siehe meine Posts in den letzten Monate). Auch die optische Encoders funktionieren und ich kann mit einem Testprogramm ihre Werte lesen. Also, ich kann beginnen, das Programm zu schreiben, mit dem ich die Getriebemotoren steuern kann. Ich habe einen L298 an den ATMega8 angeschloßen. 6 PINs sind belegt: ENABLE_A, ENABLE_B, INPUT1 bis 4. Ich weiß, daß ich die Richtung der Getriebemotoren mit den Werten bei INPUT1-4 setzen kann (ich nehme an, INPUT1-2 für den Motor [nennen wir!] links, und INPUT3-4 für den Motor rechts). Ich **GLAUBE**, wenn ich ein "1" bei ENABLE_A, bzw. ENABLE_B schicke, wird der entsprechende Motor sich bewegen, in der Richtung, die ich mit INPUT1-4 bestimmt habe. Alles richtig bisher? Nun, mir ist gesagt worden, daß ich das ganze mit PWM steuern soll. Da ich mit PWM keine richtige Erfahrung habe (und gar keine beim Steuern! Nur was bei lesen!), frage ich mich, wie ich im C das ganze machen kann. Ich habe in Google gesucht, und vieles im Bascom gefunden (ich kenne aber Bascom nicht, und deswegen ist eine Übersetzung etwas schwer), aber bisher nix in C. Hat jemand ein Beispiel? Besten Dank und schöne Woche! Luca Bertoncello
Hallo, oder schau mal hier: http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#PWM_.28Pulsweitenmodulation.29 Schöne Grüße Thomas
Thomas Drebert schrieb: > Hallo, > > oder schau mal hier: > http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#PWM_.28Pulsweitenmodulation.29 Wunderbar! Ich danke dir! Grüße Luca Bertoncello
Ich habe noch eine Frage... Der L298 hat 4 INPUTs, für jeder Motor 2. Alles klar! Nun, wenn ich ein Motor in eine Richtung drehen lassen will, gebe ich zB INPUT1 = 1, INPUT2 = 0. In die andere Richtung: INPUT1 = 0, INPUT2 = 1. Nun: was passiert wenn ich INPUT1 = INPUT2 habe (beide 1 oder beide 0)? Ich frage mich wirklich, warum zwei Bits nötig sind, um zwei Richtungen zu geben... Vielleicht kann ich mit diesen zwei PINs noch was dazu machen (zB: Motoren bremsen)? Danke Luca Bertoncello
Oli schrieb: > Hallo Luca, > > Input1=Input2 -> Motor Stop Aha! Ich habe es geahnt, habe aber niergendwo in der Doku des L298 gefunden. Ist es egal ob die beide 1 oder 0 sind? Das löst übrigens mein Problem, daß die Motoren noch ein kleines Stück fahren, nachdem ich Strom rausnehme. Und, wenn der Roboter (knapp 20Kg) fährt, wird das ganze noch schlimmer... :D Danke! Luca Bertoncello
Noch eine Frage: Ich habe jetzt die Seite angeguckt, die mir empfohlen worden ist. Nun, wenn ich richtig verstehe, kann ich die Geschwindigkeit der Motoren (über PWM) nur mit 5 Werte ansteuern (CK, CK/8, CK/64, CK/256, CK/1024). Das ist aber selbstverständlich sinnlos, also ich habe bestimmt NICHT verstanden, wie ich die Länge der PWM-Impulse steuern kann... Kann jemand mir etwas besser erklären, wie es sein soll? Montags ist für mich immer etwas schwer, aber heute (vielleicht die Hitze) ist noch schlimmer... :D Danke Luca Bertoncello
Luca Bertoncello schrieb: > Noch eine Frage: > > Ich habe jetzt die Seite angeguckt, die mir empfohlen worden ist. > Nun, wenn ich richtig verstehe, kann ich die Geschwindigkeit der Motoren > (über PWM) nur mit 5 Werte ansteuern (CK, CK/8, CK/64, CK/256, CK/1024). > Das ist aber selbstverständlich sinnlos, also ich habe bestimmt NICHT > verstanden, wie ich die Länge der PWM-Impulse steuern kann... Damit stellst du die PWM-Frequenz ein, die Länge schreibst du in das Compare-Register (bei Timer1 z.B.OCR1A) Einfach mal den Code im Tutorial simulieren! MFG Mixer
Mixer S. schrieb: > Damit stellst du die PWM-Frequenz ein, die Länge schreibst du in das > Compare-Register (bei Timer1 z.B.OCR1A) > Einfach mal den Code im Tutorial simulieren! Aha! Verstanden! Also, je höher OCR1A (bzw. OCR2A für den zweiten Motor) ist, desto länger die Impulse ist, richtig? Ich bin aber noch nicht ganz sicher, was der Wert bei ICR1 bedeutet. In dem Beispiel ist:
1 | // den Endwert (TOP) für den Zähler setzen
|
2 | // der Zähler zählt bis zu diesem Wert
|
3 | |
4 | ICR1 = 0x6FFF; |
Verstehe ich richtig, wenn ich sage, daß die Länge der Impulse von OCR1 und OCR1A abhängig ist? Also, wenn ich eine Impulse länger als "0x6FFF" machen will (bei setzen in OCR1A) muß ich auch OCR1 anpassen. Richtig? Danke Luca Bertoncello
Luca Bertoncello schrieb: > Aha! Verstanden! > Also, je höher OCR1A (bzw. OCR2A für den zweiten Motor) ist, desto > länger die Impulse ist, richtig? Ja Da Verhältnis "Pin auf 1" / "Pin auf 0" verändert sich mit diesem Wert. > Ich bin aber noch nicht ganz sicher, was der Wert bei ICR1 bedeutet. Es ist einfach nur die Obergrenze bis zu der der Timer zählt. Sie bestimmt klarerweise wieviele Abstufungen deine PWM hat. > dem Beispiel ist: > >
1 | > // den Endwert (TOP) für den Zähler setzen |
2 | > // der Zähler zählt bis zu diesem Wert |
3 | >
|
4 | > ICR1 = 0x6FFF; |
5 | >
|
> > Verstehe ich richtig, wenn ich sage, daß die Länge der Impulse von OCR1 > und OCR1A abhängig ist? Also, wenn ich eine Impulse länger als "0x6FFF" > machen will (bei setzen in OCR1A) muß ich auch OCR1 anpassen. Richtig? ICR1 Aber ansonsten richtig. Nur gibt es natürlich auch eine Kehrseite der Medaille. Der Zähler zählt ja immer gleich schnell. Er braucht daher zb doppelt so lange um bis 200 zu zählen als er brauchen würde um bis 100 zu zählen. Ergo: Bei ansonsten gleichen Einstellungen liefert eine PWM mit 200 möglichen Abstufungen nur die halbe Update-Frequenz, wie eine PWM mit 100 Abstufungen. Mich verblüfft ein wenig, dass du einen Roboter mit 20kg baust, und nichts im Vorfeld ausprobierst. Du kannst drauf wetten, dass ich wenn ich einen Motortreiber baue, als erster mal einen billigen Motor dran hänge und mit ein paar Drahtstücken die Eingänge vom Motortreiber direkt 'ansteuere' (mittels Draht nach + bzw. - verbinden) um zu sehen was passiert. Dies schon alleine deshalb, damit ich bei der Programmierung weiß, welcher Eingang wie angesteuert werden muss. Du versuchst dich an PWM, bist aber nicht soweit, einfach mal eine LED an den Ausgang anzuhängen und mit der PWM ein bischen zu spielen um zu sehen, wie sich das auf die LED auswirkt.
Hallo, nochmal! Also, ich experimentiere gerade mit dem PWM. Wie gesagt, ich habe zwei Motoren, und selbstverständlich muß ich zwei PWM-Signalen erzeugen. Die zwei ENABLE von L298 sind an PB1 (OC1A) und PB2 (OC1B) angeschloßen. Ich habe folgendes gemacht:
1 | TCCR1A = (1<<COM1A1) | (1<<WGM11); |
2 | ICR1 = 0x6FFF; |
3 | TCCR1B = (1<<WGM13) | (1<<WGM12) | (1<<CS10); \ |
4 | OCR1A = 0x3FFF; \ |
Und dann bewegt sich EIN Motor. Ich dachte, ich habe einen TCCR2A und TCCR2B, mit dem ich den PWM für den zweiten Motor steuern kann, aber diese Variabel sind leider nicht definiert. Stattdessen habe ich eine TCCR2. Kann jemand mir helfen? Wie soll ich den Timer2 einrichten? Besten Dank Luca Bertoncello
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.