Forum: Mikrocontroller und Digitale Elektronik I²C nach PWM


von Deimos (Gast)


Lesenswert?

Hallo,

ich bin auf der Suche nach einem Bauteil was es mir ermöglicht per I²C 
ein PWM mit mindestens 8 bit Auflösung zu generieren. Da ich ingesamt 24 
Kanäle benötige, wäre es  wünschenswert wenn 8 oder zumindest 4 Kanäle 
auf einem Chip vereint sind. Die einzelen PWM müssen sich getennt von 
einander in ihrer Duty-Cycle regeln lassen. Habe schon überlegt evtl. 
mehrere MEGA128 einzusetzen, ist aber nicht meine erste Wahl, da die 
doch ein wenig überdimensioniert sind.

Von Philips Semiconductor gibt es ein ein I²C LED Blinker. Da kann man 
zwar 8 LEDs ein und ausschalten und in zwei Gruppen mit
verschienen PWM versorgen aber nicht jeden Kanal einzeln " dimmen". Das 
I²C Interface ist zwar wünschenswert aber nicht unbedingt nötig.

Kennt jemand so etwas oder zumindest ähnliches?

Gruss Deimos

von mikki merten (Gast)


Lesenswert?

Kommt ganz darauf an welche Frequenz die PWM maximal können muss. Es 
bietet sich ja sonst auch eine Lösung mittels Software PWM an. Beim MEGA 
128 hast du natürlich den Vorteil von 6 * 16 Bit PWM in Hardware.

von Siegfried (Gast)


Lesenswert?

Bei 24 PWM-Kanälen kommt es vielleicht auch auf die Verteilung der 
PWM-Impulse untereinander an. Wenn jeweils alle 24-Kanäle gleichzeitig 
an der Stromversorgung "saugen", gibts u.U. Engpässe.

Siegfried

von Uwe (Gast)


Lesenswert?

Hi!
Wie wäre es wenn du einen AT8515 nur PWM machen lässt und ihm über SPI 
die Steuerwerte deines Masters sendest.
Ist nur so ein Gedanke aber: Pins hast du genügend,SPI kann er ganz 
locker, schnell ist er auch. So aus dem Bauch heraus würde ich denken: 
ein 10KHz PWM pro Kanal sollte machbar sein.
Gruss Uwe

von Dieter (Gast)


Lesenswert?

Hallo Deimos,

schau doch mal unter folgenden Link bei Maxim nach:
http://para.maxim-ic.com/compare.asp?Fam=PWM&Tree=Timers&HP=Timers.cfm

Ciao Dieter

von Peter D. (peda)


Lesenswert?

Hallo Deimos,

sag doch endlich mal, wie schnell es sein muß.

Für ne Lampensteuerung sollten 100Hz ... 200Hz Wandlerrate dicke 
reichen.

Und das schafft bequem z.B. ein AT89C52 in Software.

Ein I2C-Slave mit max 10kBit in Software ist auch möglich.


Peter

von Michael (Gast)


Lesenswert?

Hallo Deimos,

sieh Dir vielleicht das Programm 'pwm_avr.s90' unter der Rubrik 
'PWM_Software' auf www.mino-elektronik.de nebst der Erläuterungen dazu 
an. Dort werden 8 PWM-Signale mit einem speziellen Verfahren per 
Software erzeugt und auf einem Port ausgegeben. Das Programm läßt sich 
erweitern, daß insgesamt 24 Kanäle (3 Ports) mit einem 40 pol. 
AVR-Controller machbar sind.

Die PWM-Signale werden per Interrupt von Timer0 erzeugt. Bei 8 Kanälen 
werden ca. 100 Taktzyklen, bei 24 Kanälen ca. 230 benötigt. Wenn Dir ca. 
10% Prozessorleistung für das Auffrischen der Daten reichen, könnte alle 
256 Takte ein Interrupt ausgelöst werden: Timer0 ohne Vorteiler.

Jenseits vom Tellerrand: unter der obigen Adresse findest Du auch ein 
Prozessormodul CHIP_2352 mit der H8S/2352 CPU. Hiermit lassen sich 15 
PWM-Signale mit 50ns Auflösung realisieren: z.B. 10bit Auflösung bei 
20kHz. Wenn man viele Kanäle mit hoher Geschwindigkeit und Auflösung 
braucht kann dies durchaus eine sinnvolle Alternative - auch kostenmäßig 
- zu vielen AVRs sein.

Gruß Michael

von Michael (Gast)


Lesenswert?

Hallo Deimos,

habe Dein Problem 'mal mit dem ATmega16 durchgespielt. Hiermit könntest 
Du 24 PWM-Kanäle mit den Ports A, B und D realisieren, wie oben 
angedeutet. Da der IIC-Bus hardwaremäßig integriert ist und minimale 
Bedienung erfordert, reicht ein bißchen CPU-Zeit zur Parameterübergabe 
völlig aus. Da der IIC-Bus wartet, bis die Daten vom Empfänger 
abgenommen werden, ist auch kein zeitkritischer Interrupt notwendig. Als 
Krönung kann man die vier Hardware-PWM-Kanäle als hochfrequente Ausgänge 
mit einbinden (betreffendes PortBit überschreiben).
Da der ATmega16 einen internen Oszillator hat, der mit fast 16MHz 
schwingt (0xff->OSCAL), braucht man für die komplette Schaltung nur noch 
einen Abblockkondensator und ggf. zwei Pullups.
Bedauerlicherweise kann man die weiteren 'schönen Innereien' wie RAM, 
EEPROM, +++ nicht separat verwenden.
Ich könnte mir vorstellen, daß eine derartige Schaltung für die perfekte 
Illumination eines Weihnachtsbaumes sorgen könnte.

Gruß Michael

von Peter D. (peda)


Angehängte Dateien:

Lesenswert?

Hallo Michael,

es geht aber auch schneller.

Meine Routine braucht 33 (bzw. 67) Zyklen für 8 (bzw. 24) Ausgänge.

Entweder man nimmt einen 90S8515 oder 3 * 90S1200.


Peter

von Uwe (Gast)


Lesenswert?

Saustarke Lösung, kannst aber ruhig mal was von Carry dazuschreiben.
Gruss uwe

von Michael (Gast)


Lesenswert?

Hallo Peter,

Deine Routine ist natürlich optimal, wenn man die verwendeten internen 
Register frei hat und die Ausgangsfrequenz nicht sehr hoch sein muß.
Ich wollte kein internes Register fest belegen, da der C-Compiler 
prinzipiell alles ausradieren kann. Ferner sollte die Ausgangsfrequenz 
möglichst hoch sein: bei meiner Routine liegen bei 128 Ausgangswert 
(50%) ca. 15,6kHz am Ausgang, bei Dir sind es etwa 123Hz 
(Timer0-overflow, 8MHz Takt). Wenn man einen DC-Motor anschließt, kann 
man den Unterschied deutlich hören.
Aber letzlich kommt es darauf an, wofür man was braucht. Schönen Abend!
Michael

von Peter D. (peda)


Lesenswert?

Hallo Michael,

also ich komme aber auf 8MHz  66  256 = 470Hz.

Wenn ich Dich richtig verstehe, wandelt Deine Routine bei jedem Wert mit 
einer anderen Frequenz. Welche ist es dann z.B. bei dem Wert 1 oder 129 
?
Man muß doch immer vom ungünstigsten Fall ausgehen.

Ja bei Assembler kann man eben die Interrupts so richtig optimieren. Und 
die restlichen 5 Register sollten doch dicke ausreichen für eine 
I2C-Empfangsroutine.


Peter

von Peter D. (peda)


Lesenswert?

Hallo Michael,

so ich hab mir Deine Routinen gründlicher angesehen.

Wenn ich das richtig verstehe, ist es das klassische 1Bit-DAC Prinzip 
ausm CD-Player.
Da hast Du natürlich recht, daß es sich besser filtern läßt.

Für eine Lampensteuerung sollte alles über 200Hz ausreichen.

Für eine DC-Motorsteuerung wird manchmal eine so niedrige Frequenz 
genommen, daß er leicht ruckelt. Dadurch erreicht man noch langsamere 
untere Drehzahlen, da durch das Ruckeln die Haftreibung aufgehoben wird.


Peter

von Michael (Gast)


Lesenswert?

Hallo Peter,

bei meinen Frequenzberechnungen bin ich von 8MHz/256/256 ausgegangen. 
Man kann aber auch T0 im Interrupt nachladen, damit sein nächster 
Interrupt schneller kommt.
Mir ging es darum, die 'klassische' Funktion eines Rate-Multipliers 
(CD4089) nachzubilden, der es vor vielen, vielen Jahren ermöglichte, 
16bit DA-Wandler zu geringen Kosten aufzubauen. Wir können nur 
spekulieren, welche Aufgabe obige Anfrage lösen sollte. Ich denke, wer 
viele PWM-Kanäle braucht, hat genug Anregungen bekommen, um sich das 
gewünschte auszusuchen.

Gruß Michael

von Deimos (Gast)


Lesenswert?

Hallo,

vielen Dank für die vielen verschiedenen und kontruktiven Vorschläge und 
Denkanstösse.

Gruß Deimos

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.