středa 29. srpna 2018

Měnič 48/230V THT diagonální SPWM

Varování: Příspěvek není návodem ale inspirací pro možný návrh podobného zařízení kvalifikovanou osobou případně pod dozorem jako školní projekt. Obsahuje části pod napětím životu nebezpečným. Autor nenese odpovědnost za újmy na zdraví nebo majetku vzniklé v souvislosti s následujícím příspěvkem. Autor si vyhrazuje právo příspěvek kdykoli změnit.

Měnič není dokonalý z hlediska kontrukce ani vlastností, ale je navržen za účelem splnit několik netypických vlastností:
Cíle mechanických vlastností:
1) Jednodesková THT konstrukce na jednostranné DPS
2) Co nejméně rozdílných součástek
3) Trafo a tlumivka, které jdou navinout v ruce. 

Cíle elektrických vlastností:
1) Minimální možný příkon naprázdno za každou cenu
2) Zkratuvzdornost
3) Sinusová modulace

Nevýhody:
1) Nízká hustota výkonu
2) Nevhodné umístění výkonových prvků uprostřed desky
3) Zkreslení výstupního napětí závislé na zátěži

Modulace střídačů
Je několik možností sinusové modulace H-mostu střídače, zde uvádím některé z nich.
1) Nejběžnější je bipolární modulace. Vyžaduje dvě tlumivky, které mohou být na společném jádru. Nutností je dále vkládání deadtime, který z závislosti na spínací frekvenci snižuje možný index modulace.
2) V případě unipolární modulace jedné fáze, kde se druhá fáze pouze přepíná 50Hz stačí jedna tlumivka, ale meziobvod střídače je zatížen velkým du/dt, proud se pak uzavírá přes kapacitou trafa DC/DC měniče. Nicméně spínací ztráty jsou poloviční oproti bipolární modulaci, tranzistory ve fázi B mohou být pomalé.
3) Zlepšit filtraci unipolární modulace je možno pomocí dvou tlumivek a spínáním obou polomostů tak, že je vždy jeden dolní tranzistor po dobu půlperiody sepnutý trvale a druhý polomost spíná, pak se vymnění. Tlumivky však nemůžou být na stejném jádru, protože polomosty neběží synchronně.
4)V případě diagonálního propojení tranzistorů a spínání střídavě obou diagonál s nízkým deadtime dostaneme opět bipolární modulaci. Pokud ale deadtime zvýšíme až na 1/2 periody spínací frekvence, dojde k tomu, že po celou dobu jedné půlvlny se spíná pouze jedna diagonála. Abychom kompenzovali snížení výstupního napětí vynásobíme referenční průběh dvěma. Protože spínáme stále vždy jen jednu diagonálu, deadtime není potřeba, nedochází ke komutaci tranzistor-tranzistor.



Výhodou diagonální modulace je zanedbatelný příkon naprázdno srovnatelný s obdélníkovým řízením. Nevýhodou je neschopnost měniče uzavírat přes meziobvod cestu jalovému proudu a tedy udržet nezkreslenou sinusovku do kapacitní nebo induktivní zátěže. Výsledkem je, že efektivní hodnota napětí neodpovídá té na vstupu modulátoru, je tedy potřeba zpětná vazba a regulátor. Ten sice nedodrží tvar, ale aspoň velikost efektivní hodnoty napětí ano.
Tím, že dochází ke komutaci dioda-tranzistor, když jsou tranzistory zavřené, chová se můstek jako usměrňovač proti napětí meziobvodu, nikoli proti nule, musíme upravit tvar referenčního sinu.
 

Díky tomu na rozdíl od TDS2285 v zátěži nepadá napětí.
Zapojení je přímo odvozeno z předchozí verze 12/230V. Zachoval jsem push-pull na primáru DC/DC měniče s cílem snížit počet součástek. Nevýhodou je nutnost použití 200V MOSFETů např. IRFP90N20D. DC/DC je řízen pomocí SG3525 posíleného drivery s desaturační ochranou IR2125. Pomalé nabíjení kapacity meziobvodu při startu zajištěno velkým kondenzátorem na pinu CSOFT.
Střídač je z IGBT tranistorů SGH80N60 buzených opět IR2125.
Řízení střídače, podpěťovou ochranu baterky a vypnutí při nadproudu obstarává zde místo TDS2285 MCU, který je naprogramován tak, aby pinově fungoval identicky. Důvod je ten, že TDS2285 ač funguje pěkně, tak vnitřní regulátor nedovoluje ovládat amplitudu střídače v dostatečném rozsahu při diagonálním propojení tranzistů H-mostu. MCU do daného rozložení nohou vyjde mnoho, já jsem zvolil moderní (2008) ATTINY44-20PU, což nebylo úplně šťastné, protože ta šílenost nemá ani násobičku. Ale aspoň se člověk naučí, jak se to dělalo, žejo.

Schema:


Průběhy napětí z první verze SW
 Naprázdno, Uef = 230V

Elkový zes, žhavení 20W

Odporová zátěž 500W

Deska, rozměry 228x156mm

Osazovací plán
SW
V assembleru. Mezi diagonálním a bipolárním řízením střídače lze přejít snadno zmenšením deadtimu z 0x80 na 0x04, odmazáním násobení (lsl r16) a výměnou tabulky za sinovou. Zkreslení sinusovky zmizí, příkon naprázdno vzroste z asi 2W na 12W.

Závěr
Další snižování příkonu naprázdno možné snížením sycení trafa DC/DC měniče. Při 7z. zbytečně hřeje jádro, ovšem více závitů znamená menší výkon.

 __________________________________________________________________________________
.nolist
.include "tn44def.inc"
.list

.org 0x0000
rjmp nastaveni ;reset
.org 0x0008
rjmp timer     ;timer1 overflow
.org 0x0100    ;zarovnani tabulky sinu kvuli DDS
sine:
.db 0x7F, 0x93, 0x9B, 0xA2, 0xA7, 0xAC, 0xB0, 0xB4, 0xB7, 0xBB, 0xBE, 0xC1, 0xC4, 0xC7, 0xC9, 0xCC,
.db 0xCE, 0xD0, 0xD3, 0xD5, 0xD7, 0xD9, 0xDB, 0xDC, 0xDE, 0xE0, 0xE2, 0xE3, 0xE5, 0xE6, 0xE8, 0xE9,
.db 0xEA, 0xEC, 0xED, 0xEE, 0xEF, 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF8, 0xF9,
.db 0xFA, 0xFA, 0xFB, 0xFB, 0xFC, 0xFC, 0xFD, 0xFD, 0xFD, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE,
.db 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFD, 0xFD, 0xFD, 0xFC, 0xFC, 0xFC, 0xFB, 0xFB, 0xFA,
.db 0xF9, 0xF9, 0xF8, 0xF7, 0xF6, 0xF6, 0xF5, 0xF4, 0xF3, 0xF2, 0xF1, 0xF0, 0xEF, 0xEE, 0xEC, 0xEB,
.db 0xEA, 0xE8, 0xE7, 0xE5, 0xE4, 0xE2, 0xE1, 0xDF, 0xDD, 0xDC, 0xDA, 0xD8, 0xD6, 0xD4, 0xD1, 0xCF,
.db 0xCD, 0xCA, 0xC8, 0xC5, 0xC2, 0xBF, 0xBC, 0xB9, 0xB6, 0xB2, 0xAE, 0xA9, 0xA4, 0x9F, 0x98, 0x8D,
.db 0x71, 0x66, 0x5F, 0x5A, 0x55, 0x50, 0x4C, 0x48, 0x45, 0x42, 0x3F, 0x3C, 0x39, 0x36, 0x34, 0x31,
.db 0x2F, 0x2D, 0x2A, 0x28, 0x26, 0x24, 0x22, 0x21, 0x1F, 0x1D, 0x1C, 0x1A, 0x19, 0x17, 0x16, 0x14,
.db 0x13, 0x12, 0x10, 0x0F, 0x0E, 0x0D, 0x0C, 0x0B, 0x0A, 0x09, 0x08, 0x08, 0x07, 0x06, 0x05, 0x05,
.db 0x04, 0x03, 0x03, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, 0x03, 0x03, 0x04, 0x04,
.db 0x05, 0x06, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x14,
.db 0x15, 0x16, 0x18, 0x19, 0x1B, 0x1C, 0x1E, 0x20, 0x22, 0x23, 0x25, 0x27, 0x29, 0x2B, 0x2E, 0x30,   
.db 0x32, 0x35, 0x37, 0x3A, 0x3D, 0x40, 0x43, 0x47, 0x4A, 0x4E, 0x52, 0x57, 0x5C, 0x63, 0x6B, 0x7F

nastaveni:  ;po resetu
wdr
cli
ldi r16, 0b10000000 ;povoleni zmeny hodin
out CLKPR,r16
ldi r16, 0b00000001 ;clock division 2
out CLKPR,r16
ldi r16, 0b00100000 ;Clear WDRF in MCUSR
out MCUSR, r16
in r16, WDTCSR ;Keep old prescaler setting to prevent unintentional Watchdog Reset
ori r16, 0b00011000 ;Write logical one to WDCE and WDE
out WDTCSR, r16
ldi r16, 0x00 ;Turn off WDT
out WDTCSR, r16
sbi DDRB,PB2 ;PB2, LED
sbi DDRA,PA5 ;PA5 jako vystup
sbi DDRA,PA6 ;PA6 jako vystup
sbi DDRA,PA7 ;PA7 jako vystup
ldi r16,0b00100001 ; OC0B out positive PWM
out TCCR0A,r16
ldi r16,0b00110001 ; OC1B out negative PWM
out TCCR1A,r16
ldi r16,0b00000001 ; timer start no prescale
out TCCR0B,r16
out TCCR1B,r16     ;spustim oba timery
ldi r16,0x7F ;127  ;strida 50%
out OCR0B,r16
ldi r16,0x7F ;127
out OCR1BL,r16
ldi r16,0b00000001 ;int enable compare A, overflow
out TIMSK1,r16
ldi r16,0b00000110 ;ADC prescaler 64 -> 156kHz
out ADCSRA,r16
ldi r16,0b00010000 ;hornich 8bit v hornim registru vystupu
out ADCSRB,r16
ldi r31,high(sine<<1 br="">ldi r30,low(sine<<1 23:16="" akumulator="" br="">ldi r29,0x00 ;akumulator 15:8
ldi r28,0x00 ;akumulator 7:0
ldi r27,0x00 ;DDS add 23:16
ldi r26,0xA7 ;add 15:8
ldi r25,0x1E ;add 7:0
ldi r19,0xFF ;amplituda sinu
ldi r18,0x00 ;suma PS regulatoru
ldi r20,0xFF ;casovani ADC
sei
sleep

timer:     ;spousteni 20kHz
cli
sbic PINA,PA2  ;vypinaci vstup
rjmp mereni    ;vystup povolen
clr r16
out TCCR0A,r16 ;odpoj piny
out TCCR1A,r16
out TCCR0B,r16 ;timer stop
out TCCR1B,r16   
sei
sleep

mereni:
brtc dds         ;T flag kdyz byl spusten AD prevodnik
sbic ADCSRA,ADSC ;ADC dokoncil prevod
rjmp dds
clt              ;smazu T flag
sbic ADMUX,MUX0  ;je kanal nastaven na ADC0 ?
rjmp regulator
in r16,ADCL
in r16,ADCH      ;napeti baterie
cbi ADCSRA,ADEN  ;vypnu AD prevodnik
cpi r16,0x43 ;1.3V
brpl stop    ;kdyz je vetsi
cpi r16,0x24 ;0.9V
brmi stop    ;kdyz je  mensi
cpi r16,0x30 ;1.1V
brmi dds     ;kdyz je mensi
sbi DDRA,PA1   ;DCC start
sbi PORTB,PB2  ;rozsvitim LED
rjmp dds
stop:
cbi DDRA,PA1   ;DCC stop
cbi PORTB,PB2  ;zhasnu LED
rjmp dds

regulator:  ;spousteni 40Hz
in r16,ADCL
in r16,ADCH     ;napeti vystupu
cbi ADCSRA,ADEN ;vypnu AD prevodnik
mov r19,r18     ;Vystup = Suma
subi r16,0x80   ;Err = vystupni napeti - 2.5V
brmi mensi
lsr r16       ;Err/2
sub r19,r16   ;Vystup = Suma + Err
brcc suma     ;vetsi
ldi r19,0x00  ;dolni doraz amplitudy
suma:
lsr r16       ;Err/4
lsr r16       ;Err/8
sub r18,r16
brcc dds
ldi r18,0x00  ;dolni doraz sumy
rjmp dds
mensi:        ;Err < 0
neg r16
lsr r16
add r19,r16   ;Vystup=Suma+Err
brcc suma_n
ldi r19,0xFF  ;horni doraz amplitudy
suma_n:
lsr r16
lsr r16
add r18,r16   ;Suma=Suma+Err
brcc dds
ldi r18,0xFF  ;horni doraz sumy

dds:
add r28,r25   ;akumulator + add
adc r29,r26
adc r30,r27
lpm r22,Z     ;vezmu hodnotu z tabulky
subi r22,0x80 ;odectu stredni hodnotu
brmi zaporne
ldi r21,0x00  ;vycisteni registru
ldi r16,0x00
ldi r17,0x00
mov r23,r19   ;ulozeni amplitudy
clc
ror r23       ;prvni posuv
brcc posuv
scitani:
add r17,r22   ;dolni bajt vysledku
adc r16,r21   ;horni bajt vysledku
posuv:
rol r22
rol r21
clc
ror r23       ;posuv
brcs scitani  ;byla tam jednicka
brne posuv    ;dokud jsou tam jeste jednicky
rjmp kladne   ;kdyz nejsou
zaporne:      ;nasobeni zapornych
neg r22
ldi r21,0x00  ;vycisteni
ldi r16,0x00
ldi r17,0x00
mov r23,r19   ;ulozeni amplitudy
clc
ror r23
brcc posuv_n
scitani_n:
add r17,r22 ;dolni bajt vysledku
adc r16,r21 ;horni bajt vysledku
posuv_n: 
rol r22
rol r21
clc
ror r23
brcs scitani_n
brne posuv_n
neg r16
kladne:      ;PWM modulator
ldi r17,0x80 ;stredni hodnota
add r16,r17  ;prictu stredni hodnotu  
mov r17,r16  ;nasobeni hotovo rozmnozim horni bajt
ldi r23,0x80 ;DEADTIME     
add r16,r23  ;prictu deadtime
brcc faze_A
ldi r16,0xFF
faze_A:
lsl r16       ;NASOBENI DVEMA
out OCR1BL,r16
subi r17,0x80 ;DEADTIME
brcc faze_B
ldi r17,0x00
faze_B:
lsl r17       ;NASOBENI DVEMA
out OCR0B,r17
inc r20         ;casovani adc
brvc spat
set             ;nastavim T flag cekani na ADC
ldi r24, 0xD8
sbi ADCSRA,ADEN ;zapnuti AD prevodniku
sbic ADMUX,MUX0 ;je kanal nastaven na ADC0 ?
rjmp kanal
ldi r16,0b00000011 ;nastaveni ADC na Vcc ref, ADC3 in
out ADMUX,r16
sbi ADCSRA,ADSC ;start ADC
rjmp spat
kanal:
clr r16 ;nastaveni ADC na Vcc ref, ADC0 in
out ADMUX,r16
sbi ADCSRA,ADSC ;start ADC
spat:
sei
sleep
_________________________________________________________________________________
sinová tabulka:
.db 0x80,0x83,0x86,0x89,0x8c,0x8f,0x92,0x95,0x98,0x9c,0x9f,0xa2,0xa5,0xa8,0xab,0xae
.db 0xb0,0xb3,0xb6,0xb9,0xbc,0xbf,0xc1,0xc4,0xc7,0xc9,0xcc,0xce,0xd1,0xd3,0xd5,0xd8
.db 0xda,0xdc,0xde,0xe0,0xe2,0xe4,0xe6,0xe8,0xea,0xec,0xed,0xef,0xf0,0xf2,0xf3,0xf5
.db 0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfc,0xfd,0xfe,0xfe,0xff,0xff,0xff,0xff,0xff
.db 0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfe,0xfd,0xfc,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7
.db 0xf6,0xf5,0xf3,0xf2,0xf0,0xef,0xed,0xec,0xea,0xe8,0xe6,0xe4,0xe2,0xe0,0xde,0xdc
.db 0xda,0xd8,0xd5,0xd3,0xd1,0xce,0xcc,0xc9,0xc7,0xc4,0xc1,0xbf,0xbc,0xb9,0xb6,0xb3
.db 0xb0,0xae,0xab,0xa8,0xa5,0xa2,0x9f,0x9c,0x98,0x95,0x92,0x8f,0x8c,0x89,0x86,0x83
.db 0x80,0x7c,0x79,0x76,0x73,0x70,0x6d,0x6a,0x67,0x63,0x60,0x5d,0x5a,0x57,0x54,0x51
.db 0x4f,0x4c,0x49,0x46,0x43,0x40,0x3e,0x3b,0x38,0x36,0x33,0x31,0x2e,0x2c,0x2a,0x27
.db 0x25,0x23,0x21,0x1f,0x1d,0x1b,0x19,0x17,0x15,0x13,0x12,0x10,0x0f,0x0d,0x0c,0x0a
.db 0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x03,0x02,0x01,0x01,0x00,0x00,0x00,0x00,0x00
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x05,0x06,0x07,0x08
.db 0x09,0x0a,0x0c,0x0d,0x0f,0x10,0x12,0x13,0x15,0x17,0x19,0x1b,0x1d,0x1f,0x21,0x23
.db 0x25,0x27,0x2a,0x2c,0x2e,0x31,0x33,0x36,0x38,0x3b,0x3e,0x40,0x43,0x46,0x49,0x4c
.db 0x4f,0x51,0x54,0x57,0x5a,0x5d,0x60,0x63,0x67,0x6a,0x6d,0x70,0x73,0x76,0x79,0x7c