Forum: Mikrocontroller und Digitale Elektronik 3x PWM messen und angepasst ausgeben


von Aike T. (biertrinker)


Lesenswert?

Hallo Zusammen,

ich möchte gerne mit einen LED-Controller bauen, der lediglich das 
PWM-Signal eines anderen Controllers aufnimmt und angepasst wieder 
ausgibt. Zur Erfassung eines PWM-Signal gibt es ja von Atmel ein 
Beispiel (AVR135), leider wird dafür aber der Input-Capture-PIN 
verwendet, von dem es zumindest beim ATmega8 und 16 jeweils nur einen 
gibt.

Nun habe ich überlegt das einfach über einen durchlaufenden Timer zu 
regeln und den Zustand der drei Eingangssignale in Software zu 
speichern. Ob die Ausgangsseitigen 3 PWM-Kanäle dann als Hardware oder 
Software-PWM laufen müsste ich dann sehen.

Leider habe ich schön länger nix mehr mit Mikrocontrollern gemacht, 
daher bin ich gerade nicht so richtig fit darin nach zu rechnen ob das 
überhaupt gehen kann. Wenn ich richtig rechne, dann müsste ich den µC 
mit ca. 60MHz laufen lassen um schnell genug zu sein, was dann das aus 
für diese Idee wäre:

PWM-Frequenz des führenden Controllers: mal 80Hz, mal 830Hz, je nach 
Betriebsmodus (gemessen mittels DSO)
Angenommene Auflösung der PWM: 8 bit

830Hz * 256 Zustände = 212480 Messungen pro Sekunde nötig
8 Bit Timer ohne Prescaler, überlauf bei 256: 54.394.880 Takte pro 
Sekunde erforderlich.

Liege ich richtig? Was hätte ich für alternativen?

Hintergrund ist folgender: Ich habe eine LED-Beleuchtung mit insgesamt 7 
Metern LED-Strips. Leider sind ca 2 Meter mit anderen LEDs bestückt als 
die anderen 5 Meter, so das die Farbe nicht immer passt. Hier würde ich 
gerne mit einer Anpassungsschaltung Abhilfe schaffen.

vielen Dank im Voraus und schonmal frohe Weihnachten

Biertrinker

von Marcus (Gast)


Lesenswert?

Spricht etwas dagegen, die PWMs mit einem RC-Tiefpass zu filtern, das 
Resultat A/D zu wandeln und daraus neue, passende PWM-Muster zu 
erzeugen?

Die vorgeschlagenen Antiquitäten ATmega8 und ATmega16 haben dafür 
jedenfalls genügend Ressourcen.

von user (Gast)


Lesenswert?

Du hast einen Faktor 256 zu viel drin. Du willst die An-Zeit eines PWM 
Signals mit 800Hz bestimmen mit 8bit Auflösung. Es werden 256*800Hz = 
205kHz Abtastfrequenz.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Zwingt dich denn jemand, wirklich jeden einzelnen PWM Puls zu messen, du 
könntest da ja auch nur alle 10tel Sekunde oder so die Teile durchgehen. 
Und tu dir einen Gefallen, nimm einen MC mit Pinchange Interrupt. Als 
Zeitbasis kannst du einen Timer durchlaufen lassen und per Pinchange 
Zeitstempel erfassen.

von Aike T. (biertrinker)


Lesenswert?

Hallo,

Marcus schrieb:
> Spricht etwas dagegen, die PWMs mit einem RC-Tiefpass zu filtern, das
> Resultat A/D zu wandeln und daraus neue, passende PWM-Muster zu
> erzeugen?

eigentlich nichts, ausser das das PWM-Signal mit 80Hz kommt und mal mit 
830Hz. Wie der zu berechnen wäre ist mir auch nicht so recht klar, aber 
das ließe sich schon rausfinden ;-) Würde natürlich den Zeitfaktor aus 
der Sache nehmen, wenn der Tiefpass nicht zu viel glättet. Sonst hinkt 
der zweite Abschnitt bei schnelleren Farbwechseln hinterher.

Allerdings würde ich es auch gerne ohne AD-Wandlung lösen wenn es denn 
geht.

> Du hast einen Faktor 256 zu viel drin. Du willst die An-Zeit eines PWM
> Signals mit 800Hz bestimmen mit 8bit Auflösung. Es werden 256*800Hz =
> 205kHz Abtastfrequenz.

Der Faktor kam durch die Annahme da rein, dass ich den 
Overflow-Interrupt eines 8-Bit Timers nutze. Ok, ich könnte auch einen 
Compare Match Timer nutzen, dann brauche ich keine 256 als Faktor, aber 
ein Timer der bei jedem CPU-Takt auslöst hilft mir ja auch  nicht ;-) 
Mit einem Compare Match bei 50 und dann neu zählen komme ich auf:

830*256*50 = 10.624.000 das wäre ja immerhin machbar. Anders gerechnet, 
wenn ich einen 16MHz Quarz nehe müsste ich alle 75 CPU Takte eine 
Messung durchführen. Ist das realistisch zu schaffen?

> Und tu dir einen Gefallen, nimm einen MC mit Pinchange Interrupt. Als
> Zeitbasis kannst du einen Timer durchlaufen lassen und per Pinchange
> Zeitstempel erfassen.

Das wäre ja die Lösung, wie sie auch Atmel in der AVR135 vorschlägt, 
geht aber mit meiner Bastelkistenhardware nicht, da immer nur ein 
Pinchange Interrupt verfügbar ist.

vielen Dank und viele Grüße

Biertrinker

von Peter D. (peda)


Lesenswert?

Aike Terjung schrieb:
> leider wird dafür aber der Input-Capture-PIN
> verwendet, von dem es zumindest beim ATmega8 und 16 jeweils nur einen
> gibt.

Du kannst doch den Input-Capture auf 8 verschiedene Pins umschalten und 
dann einfach nacheinander messen.

: Bearbeitet durch User
von Aike T. (biertrinker)


Lesenswert?

Peter Dannegger schrieb:

> Du kannst doch den Input-Capture auf 8 verschiedene Pins umschalten und
> dann einfach nacheinander messen.

Kann ich? Dann habe ich das Gestern im Datenblatt übersehen! Ich schau 
es mir genauer an, wäre ja die perfekte Lösung!

vielen Dank und frohe Weihnachten!

von m.n. (Gast)


Lesenswert?

Aike Terjung schrieb:
> Ich schau
> es mir genauer an, wäre ja die perfekte Lösung!

Du mußt den Input-Capture über den analog Komparator auslösen; dieser 
kann per ADC-Multiplexer die zugehörigen Eingänge anwählen.

Aike Terjung schrieb:
> Allerdings würde ich es auch gerne ohne AD-Wandlung lösen wenn es denn
> geht.

Der ADC steht dann wegen der Verwendung des Multiplexers auch nur noch 
begrenzt zur Verfügung.

von Sean G. (atmega318)


Lesenswert?

Was ist das für ein Controller, der die Streifen ansteuert? Wenn es ein 
simpler IR RGB Dimmer ist, währe es vielleicht einfacher, wenn du ihn 
durch einen AVR mit IRMP/6 PWM Ausgängen ersetzt...

von Ralph (Gast)


Lesenswert?

Such dir einen µC mit mindestens 3 Capture/Compare Einängen und 
mindestens 3 PWM Ausgängen aus.

Es gibt mehr als genug die das können.
Vielleicht auch einer aus der AVR Familie.


Alles andere ist nur Murks.

von Aike T. (biertrinker)


Lesenswert?

@Sean: Das ist ein Fertiger LED-Controller mit Fernbedienung, den wollte 
ich eigentlich nicht komplett ersetzten, das ist mir dann doch zu viel 
Arbeit.

@Ralph: Ich möchte eigentlich schon mit den Komponenten arbeiten, die 
ich gerade da habe. Soll ja auch ein Einzelstück werden und keine Serie.

viele Grüße

Biertrinker

von Sean G. (atmega318)


Lesenswert?

Falls es eine dieser Flachen Fernbedienungen ist, währe das aber 
vielleicht sogar einfacher. Siehe hier: 
Beitrag "IR Signal einlesen. Welcher Code ist das?"
Die "Programme" sind ja trivial.

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.