Forum: Mikrocontroller und Digitale Elektronik PWM kurze, dumme Frage


von Marco M. (marco1987)


Lesenswert?

Hi,

als Kontroller benutze ich einen Atmega16.

Dieser hat ja 3 Timer, diese kann man ja unteranderem im PWM Modus 
betreiben.

Habe jetzt den timer1 am laufen und kann an Port PD5 (OCRA1) meine PWM 
ausgeben.

1.Frage kann ich dieses Signal auch auf einen anderen Pin legen,

Wieivel PWM ignale kann ich maximal nur erzeugen?  3 Timer --> nur 3 
PWMs?

Danke

von Andreas K. (a-k)


Lesenswert?

1.Jein. Zu OCR1A gehört OC1A. Aber es gibt ja auch OCR1B/OC1B und ...

2.Zähl die Anzahl OCx Pins.

von Uwe .. (uwegw)


Lesenswert?

1. nein, das ist intern fest verdrahtet
2. pro Output-Compare-Einheit eine PWM. Beim M16 also insgesamt vier, da 
Timer1 zwei solche Ausgänge hat (OC1A und B)

von Jochen M. (taschenbuch)


Lesenswert?

>>Wieivel PWM ignale kann ich maximal nur erzeugen?
>>3 Timer --> nur 3 PWMs?
>>
2.Zähl die Anzahl OCx Pins.
Völliger Quatsch!

Du kannst soviele PWM-Kanäle aufmachen, wie Du Portpins hast.
Mit einem Timer-Interupt und einer Hand voll Befehlen ist das ÜBERHAUPT 
KEIN Problem. Mit einem Portexpander (z.B. Schieberegister) könntest Du 
an einem kleinen Tiny auch 100 PWM Kanäle basteln. Ist halt nur etwas 
Handarbeit beim programmieren, aber eigentlich eine winzige 
Anfängeraufgabe. Nix schlimmes.

Jochen Müller

von Marco M. (marco1987)


Lesenswert?

> Mit einem Portexpander (z.B. Schieberegister) könntest Du
> an einem kleinen Tiny auch 100 PWM Kanäle basteln.

Schieberegister--> flops meinste damit ganz dumm gefragt :-)


Mein Ziel ist es halt rgb leds anzusteuern, dafür benötige ich halt 3 
pwms

von Falk B. (falk)


Lesenswert?

@ Jochen Müller (taschenbuch)

>Mit einem Timer-Interupt und einer Hand voll Befehlen ist das ÜBERHAUPT
>KEIN Problem. Mit einem Portexpander (z.B. Schieberegister) könntest Du
>an einem kleinen Tiny auch 100 PWM Kanäle basteln. Ist halt nur etwas

Du bist wohl Mathematiker, was? Alles lösbar. Der Beweis bleibt aber 
aus.

100 PWM Kanäle, dazu noch über seriell angebundenes Schieberegister, 
hmmm.
1 Hz bei 4 Bit Auflösung, was?

>Handarbeit beim programmieren, aber eigentlich eine winzige
>Anfängeraufgabe. Nix schlimmes.

Na dann zeig mal die Lösung. Ist doch nix schlimmes.

MFG
Falk

von Jochen M. (taschenbuch)


Lesenswert?

Falk,

Ich betreibe hier in etlichen Projekten 64 LEDs an 3 Portleitungen, 
(Clock, DATA, STROBE), die....

-einzeln in jeweils 64/128 PWM-Stufen steuerbar sind
-50x/Sec upgedatet werden

Das Ganze kostet 3 Portpins und 8 Schieberegister (4094)
Und kann mit weiteren Portpins (DATA) auch noch skaliert werden, Clock
und Strobe sind gemeinsam an allen Schieberegistern.

In einer Extrem-Anwendung habe ich IN DER TAT über 200 PWM-Kanäle, und 
wenn Du rechnen würdest, siehst Du sehr schnell das da viel mehr als 1 
HZ bei 4Bit Auflösung möglich ist.

Wie Du schon sagtest: es IST Mathematik.
Bei 64 LEDS, 64 Stufen und 50x/Sec sind das gerade mal grob 200KHZ 
Datenrate.
Das schafft ein ATiny und langweilt sich dabei noch.

Was bitte muss für Dich da extra bewiesen werden, die Grundrechenarten 
wirst Du wohl können. Oder eher nicht?

Jochen Müller

von Micha (Gast)


Lesenswert?

@ Jochen :-) klasse Antwort :-)
grüße Micha

von rechenknecht (Gast)


Lesenswert?

Na, was Falk da sagen wollte ist mir auch schleierhaft.
So wie ich das sehe hat Jochen da völlig recht und ich selbst habe 
ähnliche Sachen mit bis zu 50 Leds per PWM (einzeln steuerbar) an einem 
Mega8 schon gemacht. Das ist überhaupt kein problem, allerdings hatte 
ich ein anderes Schiebereg. verwendet, 74164, prinzipiell aber das 
Gleiche.

Zur Ergänzung:
Bei 64 PWM-Stufen aus dem Beispiel und 50 Frames/Sekunde ist das gerade 
mal eine Interuptfrequenz von 3200Hz, also völlig lächerlich für jeden 
avr.
Wenn 50HZ Framerate nicht reichen, könnte man die problemlos sogar noch 
deutlich steigern, bei mir hatten für die LEd aber auch so um die 50 
gereicht.

Keine Ahnung, warum Falk da solche Rechenprobleme hat, aber bedenklich 
ist das schon.

Thomas

von dirk (Gast)


Lesenswert?

@marco m:

taschenbuch und rechenknecht haben zwar völlig recht mit dem was sie 
schrieben, aber das hilft dir wahrscheinlich jetzt auch nicht direkt. 
ich versuche also dir mal kurz zu erklären wie selbstgemachtes pwm geht:

1) du machst einen timer-interupt auf, berechnung des timing kommt 
später.

2) du brauchst noch eine zählvariable, die über das ganze programm für 
den interupt reserviert bleibt, also global ist. wir nennen die 
pwm-zähler.

3) für jede led hast du nun einen datenwert, der die helligkeit 
festlegt. dieser wert liegt dann zwischen 0 und einem maximalwert, den 
du selbst festlegen kannst, zum beispiel 100.

---INNERHALB DES TIMER-INTERUPT:
Du erhöhst den pwm-zähler um 1. Wenn der wert die maximale pwm-auflösung 
erreicht hat, setzt du den pwm-zähler wieder auf 0. in diesem beispiel 
also bei 101, weil die helligkeit der leds ja von 0..100 laufen soll.

nun musst du nur jeden der led-werte mit dem pwm-zähler vergleichen.
ist der pwm-zähler kleiner als der led-wert -> led einschalten
bei größer oder gleich -> led abschalten.
---ENDE DES TIMER-INT

Das war schon alles!
Wie Jochen schon sagte, ist das wirklich keine Kunst!
Jochen hatte nur zusätzlich die EIN/AUS Daten für alle LEDs in ein 
Schieberegister geschoben, das kannst Du dir aber sparen, wenn du 
genügend Portpins hast, um deine led(s) direkt anzuschliessen.

Nun musst Du nur noch festlegen, wie oft der Timer-Int kommen muss.
Das ist ebenfalls völlig simpel.
(Anzahl Updates je sekunde) x (pwm-zähler-maximalwert)
Bei 50 Frames/Sekunde und Wertebereich 0..100 ist das 50x100=5000,
also muss der Timer-Int in diesem Beispiel 5000x/Sekunde kommen.

lg
Dirk

von juppi (Gast)


Lesenswert?

@ Jochen Müller (taschenbuch)

Ich glaube das @Falk Brunner (falk) nur Andeuten wollte, das nicht nur 
diskutiert wird.
Es kann doch so ein bisschen COD gleich von dir zur Verfügung gestellt 
werden.

Man tut sich hier sehr schwer ,kleine lauffähige Codeschnipsel zu 
veröffentlichen.

von Marco M. (marco1987)


Lesenswert?

Hey Dirk vielen, vielen Dank für deine Ausführliche Antwort.

Also wenn ich das richtig verstanden habe, dann kann ich max. an 4 Ports 
meine LEDs anschließen und diese einzeln steuern, wenn ich für jede LED 
einen pwm bin benutze (OC0,OC1B,OC1A,OC2)

oder


ich benutze Schieberegister, dem ich einen Takt gebe. An dieses schließe 
ich zb 10 Leds an und weise jeder led eine Variable zu dann Dimme ich 
die Leds in einer ISR. Da das menschliche Auge das umschalten zwischen 
den einzelnen LEDs nicht sieht kann man man sie auch an einen PWM kanal 
hängen.

ich glaube wenn diese möglichkeit ginge wäre das am einfachsten-->

-nur eine ISR für Timer
-Takt für Schieberegister erzeugen
-1 variable pro led

und los gehts....

oder habe ich mich irgendwo vertan.

von Kachel-Heinz (Gast)


Lesenswert?

Da Code angemahnt wurde...

Habe gaaaaannnnz einfachen Code für Software-PWM gefunden, der zumindest 
etwas zum Verständnis beitragen könnte.

Beitrag "MENÜ-STEUERUNG"

KH

von Marco M. (marco1987)


Lesenswert?

Kachel-Heinz wrote:
> Da Code angemahnt wurde...
>
> Habe gaaaaannnnz einfachen Code für Software-PWM gefunden, der zumindest
> etwas zum Verständnis beitragen könnte.
>
> Beitrag "MENÜ-STEUERUNG"
>
> KH

das ist ja asm code :-( gar nicht mein Ding^^

von Falk B. (falk)


Lesenswert?

@rechenknecht (Gast)

>Bei 64 PWM-Stufen aus dem Beispiel und 50 Frames/Sekunde ist das gerade
>mal eine Interuptfrequenz von 3200Hz, also völlig lächerlich für jeden
>avr.

>Keine Ahnung, warum Falk da solche Rechenprobleme hat, aber bedenklich
>ist das schon.

Ich hab keine Rechenproblem. Aber man bedenke, dass viele Leute immer 
schneller weiter höher wollen.
Lies mal die Dutzenden LED Threads. Alle wollen 100..200 HZ PWM Frequenz 
und 8..10 Bit. Wie sinnvoll das ist sei mal dahingestellt.
Und wenn man sowas über Schieberegister mache will wirds eng. Sehr eng.
50Hz/6 Bit gehen schon, das hat keiner bezweifelt.

MFG
Falk

von Falk B. (falk)


Lesenswert?

In C

Soft-PWM

von Marco M. (marco1987)


Lesenswert?

Marco M. wrote:
> Hey Dirk vielen, vielen Dank für deine Ausführliche Antwort.
>
> Also wenn ich das richtig verstanden habe, dann kann ich max. an 4 Ports
> meine LEDs anschließen und diese einzeln steuern, wenn ich für jede LED
> einen pwm pin benutze (OC0,OC1B,OC1A,OC2)
>
> oder
>
>
> ich benutze Schieberegister, dem ich einen Takt gebe. An dieses schließe
> ich zb 10 Leds an und weise jeder led eine Variable zu dann Dimme ich
> die Leds in einer ISR. Da das menschliche Auge das umschalten zwischen
> den einzelnen LEDs nicht sieht kann man man sie auch an einen PWM kanal
> hängen.
>
> ich glaube wenn diese möglichkeit ginge wäre das am einfachsten-->
>
> -nur eine ISR für Timer
> -Takt für Schieberegister erzeugen
> -1 variable pro led
>
> und los gehts....
>
> oder habe ich mich irgendwo vertan.

kann jemand meine Aussage nochmal kommentieren, leider hatte sich keiner 
dazu geäußert.


Inzwischen habe ich 3 Leds mit PWM über die 3 PWM Kanäle angesteuert, 
möchte dies nun aber doch lieber nur mit einem Kanal machen. Dazu wurde 
mir das Stichwort "schieberegister" genannt.
Kann ich den von mir im Zitat gewählten Ansatz zur Schiebergisterlösung 
wählen, oder gibt es da einne grundsätzlichen Gedankenfehler?

MFG Marco

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.