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.
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.
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.
MfG
Stefan
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).
So viele Treppen und so wenig Zeit!
Hallo,
Crossposting: http://www.mikrocontroller.net/topic/106794#new
Gruß
Fred
Only entropy comes easy. - Anton Checkhov
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
Mit der Hardware-PWM geht es aber nun mal nicht.Ich nutze die PWM Funktion des Kontrollers. Also Hardwarelösungsansatz.
Und zusätzliche externe Hardware würde auch deutlich aufwendiger werden, als der eine von Felix G vorgeschlagene Inverter.
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.Bei der Software Lösung müsste ich dem Timer immer die Überlaufgrenze neu mitgeben oder? D.h. abhängig von meinem Stellsignal, oder?
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.
MfG
Stefan
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
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.Den overflow Interrupt verstehe ich schon irgendwie. Bei einem vorgegebenen Grenzwert bzw. bei überschreitung wird der Interrupt 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.Doch den compare Interrupt verstehe ich irgendwie nicht ganz. Wann wird der ausgelöst?
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.
Ja.Der Timer1 hat 2 compares A und B. Ist es egal welchen man da nimmt.
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).hast du mir vieleicht ein Codeschnipsel dazu, das wäre echt nett.
MfG
Stefan
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?
Ja, oder indem du im Overflow-Interrupt den Timer-Wert "vorlädst".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?
Diese Frage ist jetzt nicht wirklich dein Ernst, oder?2. Wie lange braucht der Zähler die 65535 hochzuzählen?
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.
MfG
Stefan
Lesezeichen