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
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.
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
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
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
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
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
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
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
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
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
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