PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PWM auf Treiberstufe



vladoo
29.07.2008, 00:44
Hallo ich habe folgendes Problem und hoffe ihr könnt helfen.

Ich habe die Aufgabe eine Treiberstufe über zwei PWM Kanäle anzusteuern.

Die Treiberstufe wird so angesteuert, dass bei PWM_High der obere FET
angesteuert wird
und bei PWM_Low der untere FET.

Siehe Bild Treiber im Anhang

Mein Problem ist, dass ich die PWMs abwechselnd schalten muss.
Wenn PWMH = 1 dann muss PWML = 0.

Besse gesagt ist, dass mein PWM Puls variabel eingestellt wird, d.h.
während des Betriebs sich ständig ändert.
Und der PWML immer für die Zeit, die PWMH auf 1 steht, auf 0 stehen
muss. Wie ist so etwas zu realisieren?

Mein Problem ist das PWM Signal selbst. Es muss so aussehen:

Siehe Bild PWM Signal im Anhang

Wie man sehen kann ist das PWMH auf High währenddessen ist PWML auf
Low.
Wenn ich sie beide gleichzeitig auf High setze dann schalte ich Vss auf
Masse durch. Der PWML zieht den OUT schneller auf Low sobald er auf High
steht. Deshalb die Zeitversetzten PWM signale. Mein Problem ist, dass
ich nicht weis wie ich den PWML negieren kann oder so. Ich programmiere
den µC in C.

sternst
29.07.2008, 07:44
Ich sehe nicht, wie das mit der Hardware-PWM zu realisieren sein sollte.
Du wirst die PWM per Software erzeugen müssen. Dann ist es relativ leicht, die Anforderungen zu erfüllen.

Felix G
29.07.2008, 08:22
Ich würde da auch zu einer Software-PWM raten, wenn es denn wirklich rein softwaremäßig gelöst werden muss (gäbe ja eigentlich auch noch Inverter die man einbauen könnte, um einen Kurzschluss schon hardwaremäßig auszuschließen).

fhs
29.07.2008, 08:54
Hallo,

Crossposting: http://www.mikrocontroller.net/topic/106794#new

Gruß

Fred

vladoo
29.07.2008, 08:58
Ich nutze die PWM Funktion des Kontrollers. Also Hardwarelösungsansatz.

Durch den Prescaler kann die Zeit eines Ticks ermittelt werden. Dann
gibt man nach der Initialisierung der PWM Routine die Anzahl der Ticks
vor, die das Signal auf High steht. Den rest der Ticks steht das Signal
auf Low.

Die Treiberstufe ist ein SA305EX von Apexx.

Ich würde ungern noch zusätzliche Bauteile, wie NANDS (Inverter), einbauen. Ich dachte eigentlich, dass der Kontroller etwas an Bord hat, um sowas zu realisieren.

Das Problem ist, dass ich damit eine Regelung aufgebaut habe. Mein
Stellsignal ändert sich und dementsprechend natürlich auch die Anzahl
der Ticks, die ich der Routine mitgebe. Mit einem PWM funktioniert das
wunderbar, doch für die Halbbrücke brauche ich eben zwei PWM Signale wie oben dargestellt. Also ändert sich praktisch stets das Puls Pausen Verhältnis.

Bei der Software Lösung müsste ich dem Timer immer die Überlaufgrenze neu mitgeben oder? D.h. abhängig von meinem Stellsignal, oder?

Gruß vladoo

sternst
29.07.2008, 11:46
Ich nutze die PWM Funktion des Kontrollers. Also Hardwarelösungsansatz.
Mit der Hardware-PWM geht es aber nun mal nicht.
Und zusätzliche externe Hardware würde auch deutlich aufwendiger werden, als der eine von Felix G vorgeschlagene Inverter.


Bei der Software Lösung müsste ich dem Timer immer die Überlaufgrenze neu mitgeben oder? D.h. abhängig von meinem Stellsignal, oder?
Nein, den Timer würde man einfach durchlaufen lassen. Was du dem Stellsignal jeweils anpassen müsstest, wäre der Compare-Wert. Dann bräuchtest du noch den Compare-Interrupt und den Overflow-Interrupt, beide wären aber sehr einfach.

Overflow-Interrupt:
PWML auf Low
(*)
PWMH auf High

Compare-Interrupt:
PWMH auf Low
(*)
PWML auf High

Bei (*) könntest du dann noch nach Bedarf NOPs einfügen, um es an die Schaltzeiten der FETs anzupassen.

vladoo
30.07.2008, 00:34
Hi Stefan, danke für deine Antwort.

Wie funktioniert das ganze? Irgendwie verstehe ich das nicht so ganz.
Der Timer wird initialisiert und läuft einfach durch.

Den overflow Interrupt verstehe ich schon irgendwie. Bei einem vorgegebenen Grenzwert bzw. bei überschreitung wird der Interrupt ausgelöst.

Doch den compare Interrupt verstehe ich irgendwie nicht ganz. Wann wird der ausgelöst? Der Timer1 hat 2 compares A und B. Ist es egal welchen man da nimmt.

hast du mir vieleicht ein Codeschnipsel dazu, das wäre echt nett.

Gruß vladoo

sternst
30.07.2008, 08:01
Den overflow Interrupt verstehe ich schon irgendwie. Bei einem vorgegebenen Grenzwert bzw. bei überschreitung wird der Interrupt ausgelöst.
Jein. Der Grenzwert wird nicht von dir vorgegeben, sondern ist durch die Hardware gegeben (Overflow=Überlauf). Dieser Interrupt wird aufgerufen, wenn der Zähler den maximalen Wert erreicht hat und wieder bei Null anfängt, bei einem 8-Bit-Zähler also bei 255->0 und bei einem 16-Bit-Zähler bei 65535->0.


Doch den compare Interrupt verstehe ich irgendwie nicht ganz. Wann wird der ausgelöst?
Wenn der Zähler einen von dir vorgegeben Wert erreicht hat. Er geht dann aber nicht auf 0 zurück (einen solchen Modus gibt es aber auch, nennt sich CTC, Clear Timer on Compare), sondern zählt einfach weiter.

Der Overflow-Interrupt erzeugt also die Periode der PWM (mit einer festen Länge), und der Compare-Interrupt erzeugt den Pegelwechsel an einer von dir vorgegebenen Stelle innerhalb der Periode.


Der Timer1 hat 2 compares A und B. Ist es egal welchen man da nimmt.
Ja.


hast du mir vieleicht ein Codeschnipsel dazu, das wäre echt nett.
Den Interrupt-Code habe ich schon aufgeschrieben, das Ändern des Duty-Cycles ist ein einfaches "OCRxx = NeuerWert;", und für die Initialisierung des Timers möchte ich dich doch bitten, selber mal ins Datenblatt zu schauen (ich habe nicht jedes einzelne Konfigurations-Bit im Kopf, außerdem weiß ich gar nicht, um welchen AVR es geht).

vladoo
31.07.2008, 09:00
Hallo Stefan.

Ich nutze den ATMega128. Auf dem Evaluierungsboard C-Control-Pro.
Programmiert wird in Compat C.

Ich glaube soweit verstanden. Zwei Fragen hab ich noch.

1 .Wenn der 16 Bit zähler bis 65535 läuft, wie kann ich dann eine Periode festlegen? Ich will z.B. ne Periode von 100 µs. Wie kann man das einstellen? Wahrscheinlich zwei mal Compare Interrupt oder?

2. Wie lange braucht der Zähler die 65535 hochzuzählen?

sternst
31.07.2008, 09:58
Wenn der 16 Bit zähler bis 65535 läuft, wie kann ich dann eine Periode festlegen? Ich will z.B. ne Periode von 100 µs. Wie kann man das einstellen? Wahrscheinlich zwei mal Compare Interrupt oder?
Ja, oder indem du im Overflow-Interrupt den Timer-Wert "vorlädst".


2. Wie lange braucht der Zähler die 65535 hochzuzählen?
Diese Frage ist jetzt nicht wirklich dein Ernst, oder?
Das ist essentielles Basis-Grundlagen-Wissen. Du nimmst dir jetzt das Datenblatt und liest dir den Abschnitt zum Timer einmal komplett durch. Das ist ja wohl das Mindeste, was du mal machen könntest, bevor du Fragen dazu stellst. Und wenn du dir dann diese Frage nicht selber beantworten kannst, kann ich dir auch nicht helfen.
Die Formulierung "Ich habe die Aufgabe" legt nahe, dass es um eine Hausaufgabe oder was Berufliches geht. Alles werde ich dir daher nicht vorkauen.

vladoo
31.07.2008, 10:12
Hast ja Recht. Ich bin nur zur Zeit etwas unter Zeitdruck und muss schnell zu einer Lösung kommen. Natürlich hängt die Dauer des Hochzählen von der Grundfrequenz und dem Vorteiler ab. War auch ne doofe Frage von mir.

Du hast mal geschrieben, dass es mit der Hardware PWM nicht gehen würde.
Ich habe in der Atmel Doku zum Mega128 gelesen, dass man das PWM Signal invertieren kann. Es steht im Abschnitt Fast PWM in der Doku. Es wird dort "inverted PWM" genannt.

Es gibt dort jedoch keine Beispiele dazu. Du weißt nicht zufällig etwas darüber? So eine Lösung wäre doch etwas einfacher als die mit den Timern oder?

sternst
31.07.2008, 11:10
Ok, mit der "inverted PWM" sollte es auch in Hardware gehen, aber einfacher ist das in meinen Augen nicht. Für die nötige Totzeit bei den Pegelwechseln brauchst du einen definierten Versatz. Die normale PWM (also PWMH) muss um diesen Versatz später gestartet werden, dafür bekommt dann die invertierte PWM (also PWML) immer einen um den doppelten Versatz größeren PWM-Wert. Und beim Ändern der beiden PWM-Werte musst du dir dann noch Gedanken über die jeweilige Reihenfolge machen, damit kein Kurzschluss entstehen kann.

Ich finde die Software-Lösung einfacher und deutlich übersichtlicher. Und sie hat nur einen kleinen Nachteil: da die Zeit zwischen Interrupt-Ereignis und Ausführen des Interrupt-Codes um ein paar Takte variieren kann, hat man ein wenig Jitter auf dem Signal. Bei (angenommenen) 16 MHz und 100 µs Periodendauer, hat eine Periode 1600 Takte. Ein Jitter von 4 Takten (sagen wir mal, den genauen Wert habe ich nicht im Kopf) würde dann bedeuten, dass man die PWM "nur" auf 0,25 % genau einstellen kann. Das sollte ja wohl kein Problem darstellen.

sternst
31.07.2008, 11:29
Oh sorry, die Software-Lösung hat natürlich noch einen kleinen Nachteil. Du kommst nicht in die Randbereiche. Eine PWM von 0,5 oder 99,5 % sind nicht möglich, braucht man aber ja normalerweise auch nicht. Bei 1600 Takten Periodendauer und Interrupt-Routinen in Assembler (sind ja nur ein paar Befehle), liegt der Einstellbereich bei ca 2 - 98 %.

PS: Die Einstellungen 0 und 100 % sind natürlich auch bei der Software-Lösung problemlos möglich.

PPS: Mir fällt gerade auf, dass wegen der Totzeiten auch die Hardware-Lösung nicht in die Randbereiche käme. ;-)

Besserwessi
01.08.2008, 23:19
Für die Hardwarelösung gibt es 2 Möglichkeiten. Es ist für genau diese Anwendung ein invertiertes PWM Signal vorgesehen. Man braucht dazu nur den entsprechende Ausgang mit freischalten. Allerdings ist dabei die Zeit in der beide signale Low sind fest (in grenzen über vorteiler variabel) vorgegeben. Kleinere Anpassungen müßte man dann per analoger Verögerung machen.

Die 2 te, deutlich schlechtere Wahl ist es einen 2 te PWM Kanal zu benutzen und da den invertierten PWM Modus zu wählen. Wenn man dann beide PWM Register jeweils gleich beschreibt, sollte man gerade ein invertiertes Signal haben. Dabei muß man aber aufpassen, das nicht versehentlich die beiden Register verschieden sind, sonst gibt es Rauchzeichen.

Einfacher sollte die hardware Lösung sein. Die Softwarelösung ist flexibler, vor allem bei relativ niedrigen Frequenzen.