I²C nach PWM

Gast #16860
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
Gast #16866
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
Gast #16867
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
Gast #16870
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
#16871
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
#16872
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
Gast #16873
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren