Forum: Mikrocontroller und Digitale Elektronik PWM für 3 Motoren


von Sebastian (Gast)


Lesenswert?

Hallo liebe Community...


Mitlerweile komme ich gut mit der Programmierung von ATMegas in AVR-GCC 
zurecht.

Doch da ich nun ein neues Projekt anstrebe kommen natürlich auch wieder 
viele Probleme.


Folgende Idee:
Ich möchte 3 Motoren für eine Lasershow mit PWM ansteuern. Die 
Geschwindigkeiten sollen per zufall sein für alle 3 Motoren. Natürlich 
sollen die Geschwindigkeiten der einzelnen Motoren unterschiedlich 
sein...
Diese sollen natürlich auch in einem Zeitabstand von 5 Sekunden oder so 
wechseln...


Ich hätte mir da gedacht, 3 der 4 PWM ausgänge eines ATMega 16 zu 
nehmen. Also OC0 OC1A und OC1B

Schaltung und so ist kein Problem aber dafür die Software.

Ich habe hier im Forum bereits viel über PWM gelesen und möchte jetzt 
erstmal klein Anfangen indem ich EINE Led an OC0 dimme.

Und hier komme ich schon nicht mehr weiter...

Könnte mir vielleicht mal jemand einen Code dafür schicken oder einen 
Link zu Programmbeispielen??

Komme nämlich im moment einfach nicht weiter

Grüße
Sebastian

von Stefan (Gast)


Lesenswert?

Schau mal hier,
da wird eine Motorregelung mit ATmega realisiert. Dort kann auch der 
Source Code heruntergeladen werden.

http://www.mikrokopter.com/ucwiki/

Stefan

von Sebastian (Gast)


Lesenswert?

Hm das ist aber schon mal ganz schön kompliziert für den Anfang. Gibt es 
denn nich einfachere Codes oder eben Tutorials die besser sind als das 
PWM Tutorial hier im Forum?

Wäre echt toll wenn mir da jemand weiterhelfen könnte :)


Grüße
Sebastian

von Matthias L. (Gast)


Lesenswert?

>Hm das ist aber schon mal ganz schön kompliziert für den Anfang. Gibt es
>denn nich einfachere Codes oder eben Tutorials die besser sind als das
>PWM Tutorial hier im Forum?

Vielleicht ist die Aufgabe zu kompliziert für den Anfang? Vielleicht 
solltest du mit einer blinkenden LED anfangen??



Tutorials dienen dazu, dem Einsteiger Hilfe beim Erlernen eines 
Sachverhaltes zu geben.

Zum Verständnis: Programmieren bedeutet nicht, irgendwelche 
Codeschnipsel zusammenzukopieren!

von Sebastian (Gast)


Lesenswert?

hab ja geschrieben dass ich erstmal eine LED dimmen möchte :)

LEDs Blinken lassen ist kein Problem... genauso wenig wie UART, LCDs 
ansteuern usw...


Nur mit PWM komm ich gar net zurecht... Deswegen such ich nach einem 
Verständlichen tutorial :)

Grüße
Sebastian

von Sebastian (Gast)


Lesenswert?

Software PWM hab ich mittlerweile hinbekommen aber immer noch nicht das 
mit der Hardware...

Keiner hier der weiß wo es ein gutes Tutorial gibt?


Grüße
Sebastian

von Sebastian (Gast)


Lesenswert?

Bitte Helft mir ...

Ich hab zwar das Programm schon mit Software PWM aber das ist ewig lang 
und ich würde lieber die Hardware PWMs nutzen :)

Aber ich finde einfach keine Tutorials darüber die verständlich sind...


Grüße
Sebastian

von 123 (Gast)


Lesenswert?


von Teplotaxl X. (t3plot4x1)


Lesenswert?

Aus dem Tut zusammengestellt
ggf. Anpassen
1
TCCR1A = (1<<WGM11)|(1<<WGM10)|(1<<COM1A1);
2
TCCR1B = (1<<CS10);
3
OCR1A = 32;

PS: Der betreffende Port muss natürlich noch als Ausgang konfiguriert 
werden.

von Sebastian (Gast)


Lesenswert?

Ich danke euch vielmals, dafür dass ihr euch die mühe gemacht habt :)

Hab auch was in nem anderen Forum gefunden dass auch sehr hilfreich ist.
Ich denke mithilfe des Datenblattes dürfte es nun kein Problem mehr 
sein.


Danke euch vielmals :)

Ich schreib hier nochmal den Code für eine LED dimmen sobald ich das 
fertig habe.

DAnke nochmal

Grüße
Sebastian

von Sebastian (Gast)


Lesenswert?

wenn ich das jetzt richtig verstanden habe hat der Code folgende 
eigenschaften:

(ich trenn das ganze ein wenig auf)
Korrigiert mich bitte wenn ein Fehler drin ist:


TCCR1A (welcher PWM ausgang also OC1A OC1B OC0 oder OC2)

(1<<WGM11)|(1<<WGM10) (die Auflösung... Also hier 10 Bit -> obergrenze 
ist 1023)

(1<<COM1A1) (Anschalten des Timers)

TCCR1B = (1<<CS10); (quelle des Timers... in dem Fall CPU Takt)


OCR1A = 32; (Ausgabe des Wertes 32 an dem Pin also ca. 0,15 V ??)


Wenn ich jetzt noch den OC1B aktivieren will muss ich nur noch

OCR1A = 32;

eingeben da die ja mit dem selben Timer laufen oder??


Hab ich das richtig verstanden?

Grüße
Sebastian

von Sebastian (Gast)


Lesenswert?

oh verschrieben

ich meinte

OCR1B = 32; zum ausgeben von 0,15 V an OC1B

von Sebastian (Gast)


Lesenswert?

Stimmt das Grundprinzip so?

von Sebastian (Gast)


Lesenswert?

okay also funktionieren tut der Code schonmal...


So als Frage nebenbei:

Gibt es in AVR GCC eine funktion für eine Random Zahl

(z.B Randomzahl aus 255)??


Grüße
Sebastian

von Sebastian (Gast)


Lesenswert?

k hat sich erledigt

-> anderer Beitrag


Kann geschlossen werden


Grüße
Sebastian

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.