mikrocontroller.net

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


Autor: Erwin Endres (erwinendres)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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:
Pwmload Alias Portb.1
Serdata Alias Portb.2
Shiftclk Alias Portb.0

Config Portb.0 = Output                                     'Load
Config Portb.1 = Output                                     'SerData
Config Portb.2 = Output                                     'ShiftClk

Sub Set_pwm(dutycycle)
   Shift Dutycycle , Left , 6
   Shiftout Serdata , Shiftclk , Dutycycle , 1 , 10
   Pwmload = 1
   Pwmload = 0
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

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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 :)

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Piffafreffer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, die 900/1800MHz beim Handy finde ich auch übertrieben.

Autor: Erwin Endres (erwinendres)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Erwin Endres (erwinendres)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dann halt den AT90PWM3B, den gibts bei CSD.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.