Anzeige:

um 180° phasenverschobene PWM

Hier finden sie die archivierten Beiträge des alten PHPBB Forums von www.loetstelle.net

um 180° phasenverschobene PWM

Von Wolfgang am 03.08.2010 15:16

Hallo,
für einen kleinen gegentakt Wandler benötige ich eine PWM mit zwei Ausgängen welche zueinander um 180° phasenverschoben ist.Hierfür möchte ich den Mega8 benutzen,genauer die beiden OCR (Compare) Register des Timer 1.Beide Ausgänge (OCR1a/OCR1b) dürfen niemals gleichzeitig HI Pegel führen sollen aber in ihrer Pulsbreite gemeinsam regelbar sein und da setzt mein Problem an.Ich bekomme es nur hin,daß beide OCR Ausgänge immer zeitgleich HI oder Lo Pegel haben.Meine Frage:gibt es da eine spezielle Timerconfiguration die das ermöglicht oder muß man das per "Hand" machen? Wer kann helfen?

Gruß
Wolfgang

Von Elektron am 03.08.2010 15:47

Ganz langsam^^

Also du hast ein PWM Signal mit einer bestimmten Frequenz an 2 Ausgängen liegen, richtig? Und Du willst, dass der zweite Ausgang immer low ist, wenn der erste high und andersherum?

Was genau hast Du damit vor?

Von Wolfgang am 03.08.2010 16:21

Elektron hat folgendes geschrieben:

Also du hast ein PWM Signal mit einer bestimmten Frequenz an 2 Ausgängen liegen, richtig? Und Du willst, dass der zweite Ausgang immer low ist, wenn der erste high und andersherum?

Was genau hast Du damit vor?


Exakt,so sollte es sein Very Happy .Hast du eine Idee wie ich die beiden OCR Register dazu bekomme damit sie das machen? Damit möchte ich einen Vollbrückenwandler samt Treiber ansteuern.

Gruß
Wolfgang

Von pcprofi am 03.08.2010 18:48

Vollbrückenwandler?

Müsstest du dann nicht sicherheitshalber sogar noch eine winzige Pause zwischendrin haben? Du hast ja auch bei Elektronik noch eine minimale Schaltverzögerung - da können ja theoretisch sogar noch Leiterbahnkapazitäten sich auswirken?

Gruß Rainer

Von BellaD am 03.08.2010 20:05

moin

Vollbrücke ? wieviel Kilowatt willste denn da drüber schaufeln Wink oder soll es eine Motoransteuerung werden?
Für Motorsteuerung verweise ich auf www.roboternetz.de und auf die entsprechenden Motorsteuerungen.

Da das Thema nicht gerade trivial ist ,schau dir mal die Seite :

http://schmidt-walter.eit.h-da.de/smps/vgw_hilfe.html

an und rück mal mit ein paar Infos raus wie zBsp.
was will ich erreichen,wie groß ist...
Schaltfrequenz
Ein/Ausgangsspannung
Strom/Leistung
vorhandene Komponenten
usw.

Infos findet man auch in den Datenblättern der Treiber IC und auf den Herstellerseiten . zBsp. IR2110 kostet 1,20 und hat alles drinn (auch Totzeit) was du brauchst.


mfg

Von Wolfgang am 03.08.2010 21:26

Hallo Rainer,

pcprofi hat folgendes geschrieben:
Vollbrückenwandler?

Müsstest du dann nicht sicherheitshalber sogar noch eine winzige Pause zwischendrin haben? Du hast ja auch bei Elektronik noch eine minimale Schaltverzögerung - da können ja theoretisch sogar noch Leiterbahnkapazitäten sich auswirken?

Gruß Rainer


ich weiß das du auch schon mal in diese Richtung geforscht hast,man kann das hier diesem Forum entnehmen Very Happy .Eine Pause brauche ich vom Controller her nicht fordern da ich die einfach den Halbbrückentreibern (IR2184) überlasse.Diese kreieren die automatisch.Somit reicht es mir wenn der Controller ein einfaches gegentakt Signal liefert.Mit clear up / clear down ist es allerdings nicht getan...

@Bella,welch Melodie.............. Wink ,nun,der letzte Wandler hat etwas mehr als 4kw "rübergeschaufelt" und macht das noch (sonst hätte ich keinen Strom und könnte hier nicht schreiben Very Happy ),allerdings ohne Mikrocontroller sondern mit einfachen Schaltregler IC´s (zumindest für die Gleichspannungserzeugung @325V) .Die Schaltfrequenz würde ich mit knapp 32kHz belegen wollen,was so ein Mega8 im 8Bit PWM Betrieb so halt schafft.Eingangsspannung ist bei mir 24V,Ausgangsspannung eben besagte 325V DC.Leistung soll er erstmal so um die 100W haben,damit ich das Programm perfektionieren kann.Vorhandene Komponenten,welche meinst du da jetzt genau? Also Messmittel und etwa 20 Jahre Erfahrung im Wandlerbau sind vorhanden.Mit Mikrokontrollern allerdings beschäftige ich mich erst seit kurzem.

Ich vermute aber,eine gegentakt PWM Ausgabe geht mit Controller wohl nicht so einfach.Es sollte so sein wie es ein TL494 oder SG3525 macht nur eine Totzeit braucht nicht vorhanden sein.Das übernehmen die Halbbrückentreiber.


Gruß
Wolfgang

Von Elektron am 03.08.2010 22:31

Ich kenne mich auf deinem Gebiet nicht aus, deswegen nicht schlagen wenn ich dich falsch verstanden habe. Wenn du ein etwa 32 kHz Signal auf zwei Pins erzeugen willst, wobei beide Pins zu einer gewissen Zeit im entgegengerichtet ihrem Wert sind, dann kannst du ruhig händisch die Pins mit Verzögerungen in einer Schleife ein- und ausschalten. Das ist natürlich nicht elegant oder sowas (falls mir jetzt jemand kommt, dass mache man ja so nicht), aber es ist schnell gemacht und funktioniert. Ärgerlich ist nur, dass du die Umschaltzeit eines Pins von der Periodendauer abziehen musst, die Grenze ist also erreicht wenn die doppelte Umschaltzeit (du musst ja zwei Pins schalten) gleich der Periodendauer ist, die du maximal haben willst.

Was ich sicher sagen kann, ist, dass man damit locker den Audiobereich abdecken kann. Weil ich die Umschaltzeiten ignoriert hatte klang es etwas schief, aber wie groß der Fehler wirklich war kann ich nicht sagen. Ausmessen würde ich sagen. Wenn der AtMega bei der geforderten Frequenz aus dem letzten Loch pfeifft könnte man das ja besser angehen, aber vermutlich schmiert der sich bei 32kHz nebenbei noch ein Brötchen Very Happy

Von BellaD am 04.08.2010 00:06

moin

der schmiert sie nicht nur,er belegt sie auch gleich Wink

;Timer1 Hardware PWM ****

sollte es evtl. machen - hab jetzt nix zum testen da
aber ruhig mal das Datenblatt konsultieren und nicht vergessen die Portbits für OCR!A+OCR!B vorher auf Ausgang zu schalten .

Die Bedeutung der reg. kannst du dem Datenblatt entnehmen.

****EDIT:
Da es so nicht ging hab ich das jetzt gelöscht und kann nun mal eine
funktionfähige 8bit Hardware PWM mit 180° Phase vorstellen ,allerdings nur in assembler aber das dürfte für die BASCOM Freaks ja kein Problem sein die paar Werte in die entsprechenden Register zu bekommen.

Code:



.include "m8def.inc"

; hier geht das Programm los
.cseg
.org 0



RESET:    ldi r16, high(RAMEND); Main program start
      out SPH,r16 ; Set Stack Pointer to top of RAM
       ldi r16, low(RAMEND)
       out SPL,r16
       sei ; Enable interrupts

      ldi r16,0b00000110   ;Port b1 + b2  auf ausg.
      out DDRB,r16


   ldi r16,0x00
   out TCCR1B ,r16  ;= 0x00; //stop
    ldi r16,0xFF
   ldi r17,0x60
   out TCNT1H ,r16  ;= 0xFF
   out TCNT1L ,r17  ;= 0x60     // Timerstartwert
   ldi r16,0x00
   ldi r17,0xA0
   out OCR1AH ,r16 ;= 0x00;
   out OCR1AL ,r17 ;= 0xA0;     // PWM-Wert A
    ldi r16,0x00
   ldi r17,0xA0
   out OCR1BH ,r16 ;= 0x00;
    out OCR1BL,r17  ;= 0xA0;     // PWM-Wert B
    ldi r16,0xB1
   out TCCR1A,r16  ;= 0xB1; (0b10110001)   (1<<COM1A1 | 1<<COM1B1 | 1<<COM1B0 | 1<<WGM10)
    ldi r16,0x01
   out TCCR1B,r16  ;= 0x01; //start Timer (1<<CS10)


loop: rjmp loop



zum testen in AVRStudio unter Debug option den Takt auf 16Mhz stellen
dann muss man bei Autostep nicht solange warten bis man was sieht .
Viel Spass damit

Von Wolfgang am 06.08.2010 13:48

Hallo Bella,
erstmal vielen lieben Dank für deine Tipps Very Happy .
Ok,ASM ist nun so gar nicht mein Ding und selbst in Bascom bin ich noch Anfänger (sonst würde ich ja wissen wie man`s macht Wink ) daher frage ich mal in die Runde ob es hier im Forum jemanden gibt und der dazu noch so freundlich wäre mir das ins Bascom zu übersetzen?

viele Grüße
Wolfgang

Von BellaD am 06.08.2010 23:45

moin

zum experimentieren :
http://www.rn-wissen.de/index.php/Bascom_und_PWM

Ansonsten kann Bascom auch assembler ,nur ist die Schreibweise etwas anders (siehe Bascom Hilfe).


Code:

'--------------------------------------------------------------
'            mega8.bas
'    mega8 sample file
'--------------------------------------------------------------
$regfile = "m8def.dat"
$crystal = 8000000
'the internal oscillator of 8 Mhz was choosen in the fusebits

Config Portb = Output

$asm

        ldi r16,$6                                          'Port b1 + b2  auf ausg.
      !out DDRB,r16


   ldi r16,$00
   !Out Tccr1b , R16                                        ';= 0x00; //stop
    ldi r16,$00
   ldi r17,$60
   !Out Tcnt1h , R16                                        ' ;= 0xFF
   !Out Tcnt1l , R17                                        ';= 0x60     // Timerstartwert
   ldi r16,$00
   ldi r17,$80
   !Out Ocr1ah , R16                                        ';= 0x00;
   !Out Ocr1al , R17                                        ';= 0x80;     // PWM-Wert A    50/50
   ldi r16,$00
   ldi r17,$80
   !Out Ocr1bh , R16                                        ';= 0x00;
    !Out Ocr1bl , R17                                       ';= 0x80;     // PWM-Wert B    50/50
    ldi r16,$B1
   !Out Tccr1a , R16                                        ';= 0xB1; (0b10110001)   (1<<COM1A1 | 1<<COM1B1 | 1<<COM1B0 | 1<<WGM10)
    ldi r16,$01
   !Out Tccr1b , R16                                        ';= 0x01; //start Timer (1<<CS10)

$end Asm

Do

Loop

End

Anzeige: