Forum: Projekte & Code Schnelle 10Bit PWM mit CPLD [VHDL, CPLD, Bascom]


von Erwin E. (erwinendres)


Angehängte Dateien:

Lesenswert?

Für ein Akkuladegerät, das mit einem AVR geregelt wird, brauche ich eine 
schnelle PWM mit hoher Auflösung.
Zuerst wollte ich das PWM-Signal für die Ansteuerung des Schaltreglers 
mit dem AVR erzeugen, aber die erzielbare Frequenz und vor allem die 
mögliche Auflösung genügt mir nicht.

Deshalb habe ich die PWM-Erzeugung mit einem CPLD gelöst.
Vor allem natürlich, weil ich sehen wollte ob ich es kann. :)

Ich habe den VHDL Code hier eingestellt, weil ich mir vorstellen kann, 
dass er auch für andere nützlich ist.
Wer mit VHDL nichts zu tun haben will, kann den CPLD als Black Box 
sehen, und einfach das beiliegende JED-File flashen. Das ist nicht 
problematisch, das dazu nötige Programmierkabel ist simpel.

Der Code passt in einen Xilinx XC-9536, ich verwende derzeit einen Chip 
mit 15ns.
Der Takt für den CPLD kommt bei mir von einem Quarzoszillator mit 80MHz, 
das ergibt eine PWM Frequenz von 80kHz. Bei 10Bit Auflösung.

Durch die Verwendung eines schnelleren CPLDs (5 oder 7ns) sollten 100MHz 
als Takt für den CPLD / 100kHz PWM-Frequenz problemlos überschritten 
werden können.
Das würde ich gerne testen, aber ich habe gerade keinen schnelleren 
Ozillator.

Die Anbindung des "PWM-Chips" an den AVR erfolgt seriell über 3 
Leitungen:
SerData : Serielle PWM-Daten, Wortlänge 10 Bit, MSB zuerst
ShiftClk: Takt für die seriellen Daten, das Datenbit wir mit steigender
          Flanke übernommen
Load    : bei einer fallenden Flanke auf dieser Leitung wird das
          eingeschobebe Datenwort gültig

Dann gibt es noch PWMClk, hier liegt der Takt für die PWM an, bei mir 
derzeit die erwähnten 80MHz

Ausgang für das PWM-Signal ist PWMOut

Ich programmiere mit Bascom, deshalb hier beispielhaft die Ansteuerung 
des PWM-Chips in dieser Sprache:
1
Pwmload Alias Portb.1
2
Serdata Alias Portb.2
3
Shiftclk Alias Portb.0
4
5
Config Portb.0 = Output                                     'Load
6
Config Portb.1 = Output                                     'SerData
7
Config Portb.2 = Output                                     'ShiftClk
8
9
Sub Set_pwm(dutycycle)
10
   Shift Dutycycle , Left , 6
11
   Shiftout Serdata , Shiftclk , Dutycycle , 1 , 10
12
   Pwmload = 1
13
   Pwmload = 0
14
End Sub

Ins ZIP-File habe ich noch einen Ausschnitt meiner Ladegeräteschaltung 
gepackt als Beispiel für die praktische Anwendung des PWM-CPLDs.

Fragen, Anregungen, Verbesserungsvorschläge?
Immer her damit!

Grüße
erwin

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Erweitere doch den CPLD Code derart (weiß nicht obs geht) das er 
defaultmäßig nen Takt von 1 Mhz ausgibt, und dieser per 
Software/DipSchalter einstellbar ist. (Weiß nicht wieviel Pins am CPLD 
noch frei sind...)
So braucht man dann nur einen Takt auf dem Baord, ggf wäre auch ein 
"Baudratengeeigneter" Takt ganz nett :)

von Gast (Gast)


Lesenswert?

Entschuldige bitte, falls ich jetzt eine dumme Frage stelle, aber:
Warum braucht ein simpler Akkulader eine PWM-Frequenz von 80KHz?
Wird da nicht mit Kanonen auf Spatzen geschossen?

von Piffafreffer (Gast)


Lesenswert?

Ja, die 900/1800MHz beim Handy finde ich auch übertrieben.

von Erwin E. (erwinendres)


Lesenswert?

@Läubi
In meinem kleinen CPLD belegt der PWM Code bereits 34 (von 36) 
Macrozellen, da ist also kein Raum mehr für Erweiterungen.
Mit einem XC9572 wäre das natürlich machbar, aber für mein Projekt 
brauche ich eigentlich keinen besonders genauen Takt, da reicht der 
interne Oszillator des Mega8.

@gast
Weil dann die Drossel kleiner sein kann.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Erwin Endres wrote:
> @Läubi
> In meinem kleinen CPLD belegt der PWM Code bereits 34 (von 36)
> Macrozellen, da ist also kein Raum mehr für Erweiterungen.
> Mit einem XC9572 wäre das natürlich machbar, aber für mein Projekt
> brauche ich eigentlich keinen besonders genauen Takt, da reicht der
> interne Oszillator des Mega8.

Alles klar dann geht es nicht, war nur so eine Idee, finde das immer 
recht schick wenn man nen Extra Chip einsezt der einem gleich nen Takt 
liefert :)
Hast du dir mal die Tiny45 angeschaut? Die haben mein ich nen FastPWM 
Mode mit bis zu 25Mhz.

von Erwin E. (erwinendres)


Lesenswert?

Der Tiny45 kann nur 8 Bit PWM mit bis zu 250kHz, so habe ich es 
tatsächlich zuerst gemacht.
Dann wollte ich aber zum einen eine höhere Auflösung, zum anderen hat 
mir der Tiny etwas zu wenig Portpins.
Eine interessante Alternative wäre der Tiny 2/4/861, der hat einen 10Bit 
Counter und auch eine schnelle 10Bit PWM (wenn ich richtig gelesen 
habe), aber eben auch wenig Portpins. Und keinen HW Multiplikator. 
Außerdem hat Reichelt den nicht.

von Benedikt K. (benedikt)


Lesenswert?

Dann halt den AT90PWM3B, den gibts bei CSD.

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.