Forum: Mikrocontroller und Digitale Elektronik L298 steuern in C


von Luca B. (lucabert)


Lesenswert?

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

von Floh (Gast)


Lesenswert?

Schau mal nach Software-PWM, dann findest du was.

von Thomas D. (thomasd)


Lesenswert?


von Luca B. (lucabert)


Lesenswert?

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

von Luca B. (lucabert)


Lesenswert?

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

von Oli (Gast)


Lesenswert?

Hallo Luca,

Input1=Input2 -> Motor Stop

Bye Oli

von Luca B. (lucabert)


Lesenswert?

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

von Oli (Gast)


Lesenswert?

Ja ist egal, desshalb schrieb ich Input1=Input2, ob Low oder High ist 
egal.

von Luca B. (lucabert)


Lesenswert?

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

von Christoph S. (mixer) Benutzerseite


Lesenswert?

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

von Luca B. (lucabert)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Luca B. (lucabert)


Lesenswert?

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
Noch kein Account? Hier anmelden.