Jelínek Martin, Zdeněk Kouba: Ovládání ventilátoru teplovzdušného rozvodu
Z MAM wiki
Obsah |
Zadání
Ventilátor 220 V/100 W má být spínán při nárůstu teploty nad nastavenou mez, čidlem je libovolný termistor nebo PN přechod, vypnut při poklesu pod vypínací teplotu určenou požadovanou hysterezí cca 10 K pod zapínací teplotou. Ke spínání použijte optotriak, nejlépe spínaný v nule. Snažte se o minimalizaci spotřeby alespoň v době, kdy triak nespíná.
Popis funkce a zapojení
Hlavní větev programu je celkem prostá. Po inicializaci systému (AD převodník, I/O piny, tabulka přerušení, čítač...) je procesor uveden do sleep modu, ve kterém, s výjimkou obsluh přerušení, již setrvá.
Přerušení vyvolané čítačem:
Nejprve jsou zakázána přerušení vyvolaná změnami na vstupních pinech, kam jsou připojena tlačítka. Následně je zkontrolováno, zda měřená teplota nepřekročila prahovou hodnotu.
Pokud ano a výstup dosud není aktivován, vyčká se první průchod nulou následující kladnou půlvlnu (sledováno na PB3) a následně je výstup aktivován. Současně je prahová hodnota snížena o hysterezi. Pokud však výstup již aktivní byl, jsou opět povolena přerušení tlačítek a obsluha přerušení je opuštěna.
Pokud je teplota nižší než prahová hodnota a výstup je stále ještě aktivní, je deaktivován a prahová hodnota je zvýšena o hysterezi.
Přerušení vyvalané tlačítky:
Uživatel má možnost volit ze 2 přednastavených prahových hodnot. Volbu provádí stiskem jednoho ze dvou připojených tlačítek. V obsluze příslušného přerušení se vyhodnotí, o které tlačítko se jedná a daná prahová hodnota je nastavena do registru, který figuruje při porovnávání se změřenou teplotou.
Schéma zapojení
Dioda D1 slouží k ochraně vstupu ATmega88, jelikož minimální hodnota napětí na vstupu dle datasheetu je -0,5 V, napěťové průběhy s D1 a bez jsou k vidění v části SIMULACE.
Stabilizátor je třísvorkový 78L05. Pracovní napětí může být i nižší, dosáhneme nižší spotřeby, avšak je třeba dodržet podmínku maximálního napětí na vstupním pinu uC VCC+0,5 V změnou zenerovy diody ZD.
Teplota je odvozována z napětí na odporovém děliči na pinu č. 23 uC. O převod do číselné podoby se stará 10 bitový AD převodník, jehož 2 nejspodnější bity jsou ignorovány, napěťová reference je interní 1,1 V.
Simulace obvodu
Na obrázku je simulace průběhů napětí (vztaženo vůči zemi):
na primárním vinutí transformátoru - černá, čárkovaná křivka (zmenšeno kvůli přehlednosti na hodnotu 9 V) na sekundárním vinutí transformátoru zpožděném o 30 stupnů - zelená křivka) na vstupním pinu pro detekci nuly - červená křivka (při zkratované diodě D1) na vstupním pinu pro detekci nuly - modrá křivka
Dále je vyznačen ideální bod sepnutí. Vstupní odpor I/O pinu byl simulován reálným odporem 10M Ohm. Simulace byla provedena programem Micro-Cap 9 Evaluation.
Zdrojový kód
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
;%%%%%SEM. PRACE - JELINEK Martin, KOUBA Zdenek%%%%% ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ; ;po startu dojde k inicializaci HW ;==nastaveni vstupu a vystupu ;==vystupy vynulovany ;==nastaveni COUNTERU1 a AD prevodniku ;==nastaveni a nasledne pouziti SLEEP MODu .INCLUDE "m88def.inc" ; info pro prekladac ;VSTUPY: .EQU LOW_START = 1 ; prirazeni pinu pro tlacitko 1 (PB1 pin cislo 15) .EQU HIGH_STOP = 2 ; prirazeni pinu pro tlacitko 2 (PB2 pin cislo 16) .EQU ZERO_CR = 3 ; prirazeni pinu pro detekci nuly (PB3 pin cislo 17) .EQU AD_IN = 0 ; prirazeni pinu pro termistor (PC0 pin cislo 23) ;VYSTUPY: .EQU OUT = 5 ; prirazeni pinu pro optotriak (PD5 pin cislo 11) .EQU LED_IND = 6 ; prirazeni pinu pro kontrolní LED (PD6 pin cislo 12) ;NASTAVENI TEPLOTY .EQU TEMP_LOW = 128 ; nastavení komparacni hodnoty (0-255) .EQU TEMP_HIGH = 192 ; nastavení komparacni hodnoty (0-255) ;REGISTR PRO UCHOVANI A POROVNAVANI NASTAVENE TEPLOTY .EQU TEMP_TRASH = R17 ;HODNOTA NASTAVUJICI HYSTEREZI TEPLOTY .EQU HYST = 10 .ORG 0x0000 rjmp START ; Resetovaci vektor/skok na hl. program .ORG 0x0005 rjmp TLACITKO ; vektor preruseni/skok na obsluhu tlacitek .ORG 0x000D rjmp COUNTER1 ; Timer/Counter1 overflow - vektor preruseni/skok na obsluhu preteceni counteru1 ;Main program start START: ;nastaveni IN/OUT ; PORTC ADC in!!! CBI DDRB, LOW_START ; nastaveni vstupniho pinu tlacitko 1 (PB1 pin cislo 15) CBI DDRB, HIGH_STOP ; nastaveni vstupniho pinu pro pro tlacitko 2 (PB2 pin cislo 16) SBI PORTB, LOW_START ; pull-up pro tlacitko 1 SBI PORTB, HIGH_STOP ; pull-up pro tlacitko 2 CBI DDRC, AD_IN ; nastaveni vstupniho pinu pro termistor (PC0 pin cislo 23) SBI DDRD, OUT ; nastaveni vystupniho pinu pro optotriak (PD5 pin cislo 11) SBI DDRD, LED_IND ; nastaveni vystupniho pinu pro kontrolní LED (PD6 pin cislo 12) SBI DDRB, ZERO_CR ; nastaveni docasne-vystupniho pinu pro detekci nuly (PB3 pin cislo 17)-aby nedelal preruseni ;nastaveni SLEEP modu ;SMCR: 0,0,0,0,SM2,SM1,SM0,SE SM2..0: Sleep Mode Select Bits, SE: Sleep enabled) ldi r16,0b00000001 ; Idle mode out SMCR,r16 ; Sleep mode set ;nastaveni A/D converteru ldi R16,0b10000111 ; ADC enable (7.bit), permit (enable interrupt (3.bit)), prescaler 128 out ADCSRA,R16 ldi R16,0b11100000 ; Internal 1.1V voltage reference with external capacitor at AREF pin (7.,6.bit), ADLAR (5.bit), input PORTC 0 (low 4 bit) out ADMUX,R16 ; vystup: pro ADLAR=1 ; 7. a 6. bit ADCL (ADC1 - ADC0) ; 7. - 0. bit ADCH (ADC9 - ADC2) ;nastaveni counteru1 ; 16bit, prescaler 256 - preruseni kazdych 17,8 sec ;TCCR1A: COM1A1 COM1A0 COM1B1 COM1B0 0 0 WGM11 WGM10 ; 0 0 0 0 0 0 0 0 ... normal mode ldi R16, 0x00 out TCCR1A, R16 ;TCCR1B: ICNC1 ICES1 0 WGM13 WGM12 CS12 CS11 CS10 ; 0 0 0 0 0 1 0 0 ... Clock select - clk_IO/256 ldi R16, 0b00000100 out TCCR1B, R16 ;TIMSK1: 0 0 ICIE1 0 0 OCIE1B OCIE1A TOIE1 ; 0 0 1 0 0 0 0 1 ... interrupt on overflow ldi R16, 0b00100001 out TIMSK1, R16 ;inicializace registru temperature-treshhold ldi TEMP_TRASH, TEMP_LOW ;----------------------------------------------------------------------------- ;----------------------------------------------------------------------------- ;%%%%PROCEDURY%%%% ;Sleep loop, wake up by the Interrupt, return with RETI back to sleep loop LOOP: SLEEP ; prechod do sleep modu nop ; return from Interrupt to this instruction RJMP LOOP ; skok na LOOP ;----------------------------------------------------------------------------- ;----------------------------------------------------------------------------- ;%%%%OBSLUHA_PRERUSENI%%%% TLACITKO: ; do registru se ulozi hodnota low nebo high podle stisku tlacitka sbic PINB, LOW_START ldi TEMP_TRASH, TEMP_LOW sbic PINB, HIGH_START ldi TEMP_TRASH, TEMP_HIGH reti ; return from Interrupt COUNTER1: ;zakaze se preruseni od tlacitek ldi R16, 0x00 out PCICR, R16 ; porovna se hodnota z AD prevodniku (ADCH) cp TEMP_TRASH, ADCH brge TEMP_LESS_TRASH ; je mene - odchod, vypnuti vystupu brlt TEMP_MORE_TRaSH ; je vice - detekce nuly, pak zapnuti vystupu TEMP_LESS_TRASH: sbis PIND, OUT ; detekce prechodu ON/OFF RJMP EXIT ; pokud jiz vystup byl vypnuty, rovnou odchod LDI R16, HYST ADD TEMP_TRASH, R16 cbi PORTD, OUT CBI PORTD, LED_IND ; LED_OFF rjmp EXIT TEMP_MORE_TRASH: SBIC DDRD, OUT ; detekce prechodu OFF/ON RJMP EXIT ; pokud jiz vystup byl zapnuty, rovnou na odchod SUBI TEMP_TRASH, HYST CBI DDRB, ZERO_CR ; nastaví pin (PB3 cislo 17) jako vstup SBI PORTD, LED_IND ; LED_ON ZERO: SBIS DDRB, ZERO_CR ; detekce kladne pulvlny rjmp ZERO NO_ZERO: SBIC DDRB, ZERO_CR ; detekce nuly rjmp NO_ZERO SBI PORTD, OUT SBI DDRB, ZERO_CR ; nastaví jako vystup - nedela preruseni rjmp EXIT EXIT: ; odchod: povoleni preruseni ldi R16, 0x01 out PCICR, R16 reti ; return from Interrupt