Forum: Compiler & IDEs ADC zu PWM, LED dimmen, Neuling!


von Sebastian J. (broty)


Angehängte Dateien:

Lesenswert?

Hallo zusammen.
Ich möchte am Atmega8 mit drei Schiebepotis die Farbe von RGB LEDs 
mischen.
Ich weiß es gibt da schon dutzende Einträge zu aber ich werde da leider 
nicht schlau draus.
Also ich habe das Potential der drei Potis je in eine 8 Bit Zahl 
umgewandelt und möchte damit nun per PWM die LEDs mischen. Per "Software 
PWM" habe ich eine Farbe schon faden können. Mehr leider nicht.

Da ich mich mit den Verschiedenen Timern und ihren Modi noch schwer tue 
zunächst die Frage: Kann der Atmega8 das überhaupt?

Das Prinzip ist mir bewusst. Der soll von 0 bis 255 Zählen, wenn der 
Wert den ich vom ADC habe überschritten ist den jeweiligen Pin 
ausschalten.
Aber Wie?
Welchen Timer?
Welchen Modus? Was bedeuten die Register für die jeweiligen Timer?

Ich bitte um verständliche und gedulgige Erklärung, da ich wirklich 
absoluter Neuling bin und mit vorhandenen Beispielen leider nicht weiter 
komme.

Danke im Voraus

Gruß
Sebastian

von Zypern-rettender Steuerzahler (Gast)


Lesenswert?

8-bit Timer/Counter2 with PWM and Asynchronous Operation

Du brauchst also Timer2.
Dann brauchst du noch das Counter-Register zum Timer2, namentlich TCNT2 
und das Vergleichs-Register OCR2. Immer wenn sie gleich sind schaltet 
der entsprechende Pin um. Vorteiler, etc. mußte halt auch setzen. Ach 
ja, und probier mal den Fast-PWM mode, der sollte gehen.


Im Datenblatt steht gleich zu Beginn das er drei PWM-Kanäle hat. Ich bin 
aber nicht sicher ob ein Timer drei Kanäle sop ohne weiteres bedient. 
Meiner Meinung nach sind drei Kanäle für einen Anfänger schon sehr 
sportlich. Einer ist aber kein Problem. Bei den anderen beiden wäre im 
Zweifelsfall halt der Sw-Aufwand erheblich größer. Technisch geht das 
aber problemlos.

von Karl H. (kbuchegg)


Lesenswert?

Sebastian Joe schrieb:


> umgewandelt und möchte damit nun per PWM die LEDs mischen. Per "Software
> PWM" habe ich eine Farbe schon faden können. Mehr leider nicht.

Wieso 'leider'. Ist doch gut!
(Es sei denn natürlich, du hast das Programm einfach abgeschrieben, und 
hast nicht verstanden, wie es funktioniert)

> Da ich mich mit den Verschiedenen Timern und ihren Modi noch schwer tue
> zunächst die Frage: Kann der Atmega8 das überhaupt?

Natürlich.

> Das Prinzip ist mir bewusst. Der soll von 0 bis 255 Zählen, wenn der
> Wert den ich vom ADC

vergiss an dieser Stelle den ADC. Sag einfach PWM-Wert. Denn: wo dieser 
Wert herkommt, ist ja völlig wurscht.
Der Trick in der Programmierung besteht darin, die Dinge voneinander zu 
trennen!

Auf der einen Seite brauchst du 3 PWM Stufen, weil du für jede LED 
deiner RGB-LED eine Möglichkeit brauchst, sie in der Helligkeit 
einzustellen.

Und auf der anderen Seite brauchst du 3 ADC Abfragen um Werte zu 
erhalten.

Diese beiden Dinge haben erst mal nichts miteinander zu tun.

Für deine Aufgabenstellung stellt sich dann heraus, dass du die Werte 
von deinem einen Teilmodul dem anderen als PWM-Werte vorgibst. Das ist 
aber ein reiner Datentransfer von dem einen Modul zum anderen. Die PWM 
weiß nichts vom ADC und der ADC weiß nichts von der PWM.

> Aber Wie?
> Welchen Timer?

Timer1 kann 2 PWM Kanäle erzeugen, Timer 2 kann 1.
In Summe hast du da deine 3 benötigten PWM Kanäle.
Vergiss fürs erste den ADC und bring diese 3 PWM Kanäle zum laufen. 
Wenns nicht anders geht, einzeln - einen nach dem anderen,

> Welchen Modus? Was bedeuten die Register für die jeweiligen Timer?

FAQ: Timer

von Sebastian J. (broty)


Angehängte Dateien:

Lesenswert?

Vielen Dank schon mal.
Kann leider im Moment nix testen.
Aber könnte das funktionieren?

Gruß

Sebastian

von troll (Gast)


Lesenswert?

>atmega8b.c
>ADCSRA=0b11000101;

Kleiner Tipp nebenbei, die Bitschreibweise
ADCSRA=(1<<BITa)|(1<<BITb)|(1<<Bitxyz);
liest sich deutlich einfacher.

von Sebastian J. (broty)


Angehängte Dateien:

Lesenswert?

So hab mich jetzt mal mit dem Datenblatt vertraut gemacht und auch schon 
das gröbste geschafft. Leider gehen die beiden LEDs an Timer1 nicht ganz 
aus, obwohl ich die OCRs schon manuell auf 0 gesetzt hab. Bei Timer 2 
ist alles Super.
Hat jemand ne Idee?

Vielen Dank

Sebastian

von Falk B. (falk)


Lesenswert?

@  Sebastian Joe (broty)

>    * atmega8b.c (1,6 KB, 2 Downloads) | Codeansicht

Hällst du es für sinnvoll, immer wieder eine Initialisierung 
durchzuführen? Ich nicht. Die macht man EINMAL beim Programmstart. 
Danach beschreib man nur noch die Register, die wirklich benötigt 
werden.

>das gröbste geschafft. Leider gehen die beiden LEDs an Timer1 nicht ganz
>aus, obwohl ich die OCRs schon manuell auf 0 gesetzt hab.

Ist ein bekannter Effekt bei Fast PWM, musst du Phase correct PWM 
machen.

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.