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