Jelínek Martin, Zdeněk Kouba: Ovládání ventilátoru teplovzdušného rozvodu

Z MAM wiki

Přejít na: navigace, hledání

Obsah

[editovat] 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á.

[editovat] Popis funkce a zapojení

Hlavní smyčka programu
Přerušení vyvolané čítačem
Přerušení vyvalané tlačítky

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.

[editovat] 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. Soubor:Schema_Jel_Kou.png

[editovat] 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.

Soubor:Simulace_Jel_Kou.png

[editovat] 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
Osobní nástroje