Regulace ventilátoru

Z MAM wiki

(Rozdíly mezi verzemi)
Přejít na: navigace, hledání
(Zapojení IRFZ44N)
(Využití interruptů, Sleep)
Řádka 1: Řádka 1:
-
Zapojení úlohy na zapnutí a regulaci ventilátoru s třídrátovým připojením, používaného např. k chlazení PC:
+
Vyzkoušíme trochu náročnější úlohu na připojení a regulaci většího zařízení, v našem případě to bude ventilátor z chladiče procesoru používaný u procesorů Pentium 4. Jeho jmenovité napětí je 12 V, jmenovitý proud podle provedení do 0,45 A.
 +
 
 +
Elektrické zapojení úlohy na zapnutí a regulaci ventilátoru s třídrátovým připojením, používaného např. k chlazení PC:
[[Soubor:CPU-FAN.png]]
[[Soubor:CPU-FAN.png]]
Řádka 14: Řádka 16:
-
Změnou střídy ovládacího signálu lze regulovat střední hodnotu napájecího napětí ventilátoru a tedy jeho otáčky. Signál TACHO a odpory v jeho obvodu nemusíme zpočátku zapojovat, bez odporů ho ovšem v žádném případě nesmíme připojit k procesoru! První pokus může přímo vycházet z minulé úlohy pro řízení LED:
+
Změnou střídy ovládacího signálu lze regulovat střední hodnotu napájecího napětí ventilátoru a tedy jeho otáčky. Signál TACHO a odpory v jeho obvodu nemusíme zpočátku zapojovat, '''bez odporů ovšem výstup TACHO v žádném případě nesmíme připojit k procesoru!''' První pokus může přímo vycházet z minulé úlohy pro řízení LED:
<pre>
<pre>
Řádka 119: Řádka 121:
Odvážnější by měli zkusit měřit počet otáček pomocí signálu TACHO (otevřený kolektor, 2 impulsy na 1 otáčku rotoru), pro připojení použijeme odporový dělič ze 3 stejných odporů podle schématu, jinak bychom přivedli na mikroprocesor až 12 V! Výsledek měření lze ukládat do registru, příp. ho lze v dalším kroku použít pro stabilizaci otáček ventilátoru. Ventilátor má obvykle max. 3000 ot./min, na TACHO je tedy max. 100 impulsů/s, impulsy TACHO jsou při našem způsoby regulace spjaty s řídicím signálem funkcí NAND (proč?), to trochu komplikuje měření otáček (sledovat stav TACHO jen při FAN_ON? sledovat dobu trvání log. 1 na TACHO?), vyhodnocovat lze např. pomocí XOR s předchozím stavem.
Odvážnější by měli zkusit měřit počet otáček pomocí signálu TACHO (otevřený kolektor, 2 impulsy na 1 otáčku rotoru), pro připojení použijeme odporový dělič ze 3 stejných odporů podle schématu, jinak bychom přivedli na mikroprocesor až 12 V! Výsledek měření lze ukládat do registru, příp. ho lze v dalším kroku použít pro stabilizaci otáček ventilátoru. Ventilátor má obvykle max. 3000 ot./min, na TACHO je tedy max. 100 impulsů/s, impulsy TACHO jsou při našem způsoby regulace spjaty s řídicím signálem funkcí NAND (proč?), to trochu komplikuje měření otáček (sledovat stav TACHO jen při FAN_ON? sledovat dobu trvání log. 1 na TACHO?), vyhodnocovat lze např. pomocí XOR s předchozím stavem.
 +
 +
Použitelné fragmenty programu:
 +
 +
Pulsně-šířková modulace, očekává číslo 1-78 v R16:
 +
 +
<pre>
 +
 +
PWM:
 +
MOV R17, R16
 +
INC R17
 +
LDI R18, 0xF8
 +
OR R18, R16
 +
PWM_ON:
 +
DEC R17
 +
BREQ PWM_OFF
 +
SBI PORTB, FAN
 +
RCALL VERYSMALLWAIT
 +
RJMP PWM_ON
 +
PWM_OFF:
 +
INC R18
 +
BREQ PWM_RET
 +
CBI PORTB, FAN
 +
RCALL VERYSMALLWAIT
 +
RJMP PWM_OFF
 +
PWM_RET:
 +
RET
 +
 +
</pre>
 +
 +
Obsluha klávesnice zapojené jako v minulém cvičení:
 +
 +
<pre>
 +
KEYPRESS:
 +
CBI PORTD, 0 ;log. 0 to the row with 1, 2, 3, A
 +
SBI PORTD, 1 ;log. 1 on another three
 +
SBI PORTD, 2
 +
SBI PORTD, 3
 +
KEY1:
 +
SBIC PINC, 2
 +
RJMP KEY2
 +
LDI R16, 1 ;pressed key 1
 +
RJMP KEYRET
 +
KEY2:
 +
SBIC PINC, 3
 +
RJMP KEY3
 +
LDI R16, 2
 +
RJMP KEYRET
 +
KEY3:
 +
SBIC PINC, 4
 +
RJMP KEY4
 +
LDI R16, 3
 +
RJMP KEYRET
 +
 +
KEY4:
 +
SBI PORTD, 0
 +
CBI PORTD, 1 ;log. 0 to the row with 4, 5, 6, B
 +
SBI PORTD, 2
 +
SBI PORTD, 3
 +
SBIC PINC, 2
 +
;
 +
;
 +
; etc.
 +
;
 +
;
 +
 +
KEY0:
 +
SBI PORTD, 0
 +
SBI PORTD, 1
 +
SBI PORTD, 2
 +
CBI PORTD, 3 ;log. 0 to the row with *, 0, #, D
 +
SBIC PINC, 3
 +
RJMP KEYRET
 +
LDI R16, 0 ;pressed key 0
 +
 +
KEYRET:
 +
RET
 +
</pre>
 +
 +
Hlavní program po inicializaci pouze volá tyto dva podprogramy.
 +
 +
 +
== Nevýhody ==
 +
 +
Takto naprogramovaná regulace již funguje, asi by nám mělo vadit, že procesor neustále naplno pracuje, požadovaná zpoždění jsou určena počtem zpracovávaných instrukcí. To jednak vede k větší spotřebě energie, potom např. zařízení nevydrží dlouho pracovat na baterie, a dále to zesložiťuje jakékoliv úpravy programu, mění se při nich časová zpoždění apod.
 +
 +
 +
== Magická slova Interrupt, Sleep ==
 +
 +
Spánek nám pomůže snížit spotřebu, probouzet se z něj můžeme přerušením. Znamená to projít další kus dokumentace a nastavit několik dalších řídicích slov. Pulsně šířkovou modulaci potom můžeme využít buď přímo z PWM výstupu procesoru, nebo jí můžeme vytvořit pomocí časovačů - to až příště.
 +
 +
 +
<pre>
 +
;
 +
; example fan program for ATmega168 with Interrupt&Sleep
 +
;
 +
; To do: *** Rotation speed  is controlled by keyboard,
 +
; To do: *** keys 0-7 represent the speed between 0 and 100 %
 +
;
 +
; To do: *** Fan starts to rotate with the first valid key press
 +
;
 +
; Fan is switched on and off with the valid key press
 +
;
 +
;
 +
; P4 CPU fan Ucc pin is supposed to be connected
 +
; to +15 V, GND pin is supposed to be connected
 +
; to NMOS Drain,, Source on GND, Gate on
 +
; pin 15 (PB2, FAN). Fan runs when FAN is 1.
 +
 +
 +
.INCLUDE "m168def.inc"
 +
 +
 +
.EQU FAN = 2
 +
 +
.ORG 0x0000
 +
jmp Main ; Reset Handler
 +
 +
 +
.ORG 0x0008
 +
jmp isr1 ; PCINT1 Handler
 +
 +
 +
; Main program start
 +
 +
Main:
 +
ldi r16,high(RAMEND); Main program start
 +
out SPH,r16 ; Set Stack Pointer to top of RAM
 +
ldi r16,low(RAMEND)
 +
out SPL,r16
 +
 +
 +
; Hardware initialization
 +
 +
; Pin driving FAN is output:
 +
sbi DDRB, FAN
 +
 +
; Initial Fan stop:
 +
cbi PORTB, FAN
 +
 +
 +
; Keyboard init:
 +
cbi DDRC, 2 ; set the inputs for keyboard (COL1-3)
 +
cbi DDRC, 3
 +
cbi DDRC, 4
 +
 +
sbi PORTC, 2 ; set internal Pull-Ups for keyboard
 +
sbi PORTC, 3
 +
sbi PORTC, 4
 +
 +
sbi DDRD, 0 ; set driving inputs for keyboard
 +
sbi DDRD, 1 ; (ROW1-ROW4)
 +
sbi DDRD, 2
 +
sbi DDRD, 3
 +
 +
cbi PORTD, 0 ;log. 0 on all rows
 +
cbi PORTD, 1
 +
cbi PORTD, 2
 +
cbi PORTD, 3
 +
 +
 +
; Keyboard read - only KeyPress here, not decoding!:
 +
;
 +
; To do: *** Key decoding
 +
;
 +
; Activation of pin change interrupt - PROBLEM!!! PCICR and PCIMSK are
 +
; extended I/O registers (0x68 and 0x6C), and must be handled as
 +
; a memory location
 +
 +
; ldi r16,0x02 ; activate PCINT1
 +
; out PCICR,r16
 +
 +
ldi r26, PCICR ; load address of PCICR in Y low
 +
clr r27 ; load high byte with 0
 +
ldi r16,0b00000010 ; activate PCINT1
 +
st X, r16 ; store new PCMSK1
 +
 +
 +
; ldi r16,0b00011100 ; Mask active inputs
 +
; out PCMSK1,r16
 +
 +
ldi r26, PCMSK1 ; load address of PCMSK1 in Y low
 +
clr r27 ; load high byte with 0
 +
ldi r16,0b00011100 ; allow pin change interrupt on portC bits 2,3,4
 +
st X, r16 ; store new PCMSK1
 +
 +
 +
sei ; Enable interrupts
 +
 +
 +
; Set sleep mode of the CPU
 +
 +
ldi r16,0b00000001 ; Idle mode (SM2..0: Sleep Mode Select Bits = 0, Sleep enabled)
 +
out SMCR,r16 ; Idle mode set
 +
 +
 +
; Loop with the Interrupt
 +
 +
loop:
 +
sleep
 +
nop
 +
rjmp loop
 +
 +
 +
; PCINT0 Service Routine - level change on PC2-4 = Key pressed ->
 +
; switch the FAN between start or stop state
 +
;
 +
; To do: *** rpm reading, regulation, etc.
 +
 +
isr1:
 +
sbic PINB, FAN ; skip next if FAN = 0 (not rotating)
 +
rjmp isr11 ; jump if FAN = 1
 +
sbi PORTB, FAN ; FAN on
 +
reti ; return from Interrupt
 +
isr11:
 +
cbi PORTB, FAN ; FAN off
 +
reti ; return from Interrupt
 +
 +
</pre>
 +
 +
Vlastnosti vybraného procesoru zde vkládáme pomocí .INCLUDE, na začátku programu je třeba definovat vektory přerušení (využíváme pouze dva, Reset a vstupy od klávesnice), dále nastavit zásobník, nastavit vlastnosti přerušení a mód spánku.

Verze z 16. 3. 2010, 23:58

Vyzkoušíme trochu náročnější úlohu na připojení a regulaci většího zařízení, v našem případě to bude ventilátor z chladiče procesoru používaný u procesorů Pentium 4. Jeho jmenovité napětí je 12 V, jmenovitý proud podle provedení do 0,45 A.

Elektrické zapojení úlohy na zapnutí a regulaci ventilátoru s třídrátovým připojením, používaného např. k chlazení PC:

Soubor:CPU-FAN.png


Obsah

Základ ovládání

Pro první zapnutí a vyzkoušení ventilátoru stačí připojit +12 V (žlutý přívod) a GND (černý přívod) z vnějšího zdroje, proudovou ochranu zdroje nastavte na cca 300 mA, mód proudového omezení. Pomocí spínače s NMOS FET IRFZ44N (velmi předimenzovaný, to nevadí, odkaz na datasheet je na stránce Výkonové spínací prvky) můžeme zapínání ovládat logickým signálem, log. 1=zapnuto.

Zapojení tranzistoru IRFZ44N:

Soubor:IRFZ_schematics.png


Změnou střídy ovládacího signálu lze regulovat střední hodnotu napájecího napětí ventilátoru a tedy jeho otáčky. Signál TACHO a odpory v jeho obvodu nemusíme zpočátku zapojovat, bez odporů ovšem výstup TACHO v žádném případě nesmíme připojit k procesoru! První pokus může přímo vycházet z minulé úlohy pro řízení LED:


; 
; example fan program for ATmega168
;
; P4 CPU fan Ucc pin is supposed to be connected 
; to +15 V, GND pin is supposed to be connected 
; to FET Drain, Source on GND, Gate on 
; pin 15 (PB2, FAN). Fan runs when FAN is 1.


	.EQU DDRB = $04
	.EQU PORTB = $05

	.EQU FAN = 2

	.EQU DDRC = $07
	.EQU PORTC = $08
	.EQU PINC = $06

	.EQU DDRD = $0A
	.EQU PORTD = $0B
	.EQU PIND = $09


; Pin driving FAN is set as output:

	SBI	DDRB, FAN

; Basic keyboard init:
	SBI DDRD, 2
	SBI PORTC, 2

GO:
	RCALL   FAN_OFF

	SBIS	PINC, 2
	RCALL	FAN3W

	RCALL	WAIT
	RCALL	WAIT
	RCALL	WAIT
	RJMP	GO


;;;
;;;
;;; P R O C E D U R E S
;;;
;;;
	
VERYSMALLWAIT:
	LDI R17, 0xFC
	MOV R1, R17
SMALLWAIT:
	INC	R1
	BRNE	SMALLWAIT
	RET

WAIT:
	LDI	R16, 4
WAIT1:
	INC	R1
	BRNE	WAIT1
	INC	R2
	BRNE	WAIT1
	DEC	R16
	BRNE	WAIT1
	RET
	
FAN_ON:
    SBI	PORTB, FAN
	RET

FAN_OFF:
	CBI	PORTB, FAN
	RET

FAN3W:
	LDI	R16, 0x20
FAN3X:
 	RCALL	FAN_ON
	RCALL	VERYSMALLWAIT
	RCALL	FAN_OFF
	RCALL	VERYSMALLWAIT   ;pulse ratio controlled by number of waits
	RCALL	VERYSMALLWAIT   ;1:5 in this case
	RCALL	VERYSMALLWAIT
	RCALL	VERYSMALLWAIT
	RCALL	VERYSMALLWAIT

	INC	R2
	BRNE	FAN3X
	DEC	R16
	BRNE	FAN3X
	RET

Další kroky

Zkusíme ovládání otáček podle zmáčknuté číslice na klávesnici, např. zapneme pomocí prvního zmáčknutí nějaké klávesy a otáčky regulujeme v 8 krocích podle velikosti zadané číslice (plné otáčky nastavíme jako 8/8 času zapnuto a 0/8 vypnuto, snižujeme pomocí 7/8 ON a 1/8 OFF, 6/8 ON a 2/8 OFF atd., až zcela zastavíme 0/8 ON a 8/8 OFF), vytvořili jsme softwarově PWM, pulsně šířkovou modulaci. Doporučovaný kmitočet řídicího signálu je cca 20 - 30 kHz, lze zkusit počítat potřebné takty procesoru a výsledek ověřit osciloskopem, pro první pokusy ale můžete zvolit takřka jakýkoliv. Zvláště při požadovaných nízkých otáčkách ventilátoru je vhodné provést rozběh počátečním krátkým nastavením na plné otáčky, jinak by se ventilátor nemusel vůbec roztočit.

Odvážnější by měli zkusit měřit počet otáček pomocí signálu TACHO (otevřený kolektor, 2 impulsy na 1 otáčku rotoru), pro připojení použijeme odporový dělič ze 3 stejných odporů podle schématu, jinak bychom přivedli na mikroprocesor až 12 V! Výsledek měření lze ukládat do registru, příp. ho lze v dalším kroku použít pro stabilizaci otáček ventilátoru. Ventilátor má obvykle max. 3000 ot./min, na TACHO je tedy max. 100 impulsů/s, impulsy TACHO jsou při našem způsoby regulace spjaty s řídicím signálem funkcí NAND (proč?), to trochu komplikuje měření otáček (sledovat stav TACHO jen při FAN_ON? sledovat dobu trvání log. 1 na TACHO?), vyhodnocovat lze např. pomocí XOR s předchozím stavem.

Použitelné fragmenty programu:

Pulsně-šířková modulace, očekává číslo 1-78 v R16:


PWM:
	MOV 	R17, R16
	INC		R17
	LDI		R18, 0xF8
	OR		R18, R16
PWM_ON:
	DEC		R17
	BREQ	PWM_OFF
	SBI		PORTB, FAN
	RCALL 	VERYSMALLWAIT
	RJMP	PWM_ON
PWM_OFF:
	INC		R18
	BREQ	PWM_RET
	CBI		PORTB, FAN
	RCALL 	VERYSMALLWAIT
	RJMP	PWM_OFF
PWM_RET:
	RET

Obsluha klávesnice zapojené jako v minulém cvičení:

KEYPRESS:
	CBI 	PORTD, 0	;log. 0 to the row with 1, 2, 3, A
	SBI 	PORTD, 1	;log. 1 on another three
	SBI 	PORTD, 2
	SBI 	PORTD, 3	
KEY1:
	SBIC	PINC, 2
	RJMP	KEY2
	LDI	R16, 1		;pressed key 1
	RJMP	KEYRET
KEY2:
	SBIC	PINC, 3
	RJMP	KEY3
	LDI	R16, 2
	RJMP	KEYRET
KEY3:
	SBIC	PINC, 4
	RJMP	KEY4
	LDI	R16, 3
	RJMP	KEYRET

KEY4:
	SBI 	PORTD, 0
	CBI 	PORTD, 1	;log. 0 to the row with 4, 5, 6, B
	SBI 	PORTD, 2
	SBI 	PORTD, 3	
	SBIC	PINC, 2
;
;
; etc.
;
;

KEY0:
	SBI 	PORTD, 0
	SBI 	PORTD, 1
	SBI 	PORTD, 2
	CBI 	PORTD, 3	;log. 0 to the row with *, 0, #, D	
	SBIC	PINC, 3
	RJMP	KEYRET
	LDI	R16, 0		;pressed key 0

KEYRET:
	RET

Hlavní program po inicializaci pouze volá tyto dva podprogramy.


Nevýhody

Takto naprogramovaná regulace již funguje, asi by nám mělo vadit, že procesor neustále naplno pracuje, požadovaná zpoždění jsou určena počtem zpracovávaných instrukcí. To jednak vede k větší spotřebě energie, potom např. zařízení nevydrží dlouho pracovat na baterie, a dále to zesložiťuje jakékoliv úpravy programu, mění se při nich časová zpoždění apod.


Magická slova Interrupt, Sleep

Spánek nám pomůže snížit spotřebu, probouzet se z něj můžeme přerušením. Znamená to projít další kus dokumentace a nastavit několik dalších řídicích slov. Pulsně šířkovou modulaci potom můžeme využít buď přímo z PWM výstupu procesoru, nebo jí můžeme vytvořit pomocí časovačů - to až příště.


; 
; example fan program for ATmega168 with Interrupt&Sleep
;
; To do: *** Rotation speed  is controlled by keyboard, 
; To do: *** keys 0-7 represent the speed between 0 and 100 %
;
; To do: *** Fan starts to rotate with the first valid key press
;
; Fan is switched on and off with the valid key press
;
;
; P4 CPU fan Ucc pin is supposed to be connected 
; to +15 V, GND pin is supposed to be connected 
; to NMOS Drain,, Source on GND, Gate on 
; pin 15 (PB2, FAN). Fan runs when FAN is 1.


.INCLUDE "m168def.inc"


.EQU FAN = 2

.ORG 0x0000 
	jmp Main ; Reset Handler


.ORG 0x0008 
	jmp isr1 ; PCINT1 Handler


; Main program start

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


; Hardware initialization

; Pin driving FAN is output:
	sbi		DDRB, FAN

; Initial Fan stop:
	cbi		PORTB, FAN
	

; Keyboard init:
	cbi		DDRC, 2 ; set the inputs for keyboard (COL1-3)
	cbi		DDRC, 3
	cbi		DDRC, 4

	sbi 	PORTC, 2 ; set internal Pull-Ups for keyboard
	sbi 	PORTC, 3
	sbi 	PORTC, 4

	sbi 	DDRD, 0 ; set driving inputs for keyboard
	sbi 	DDRD, 1 ; (ROW1-ROW4)
	sbi 	DDRD, 2
	sbi 	DDRD, 3

	cbi 	PORTD, 0	;log. 0 on all rows
	cbi 	PORTD, 1
	cbi 	PORTD, 2
	cbi 	PORTD, 3


; Keyboard read - only KeyPress here, not decoding!:
;
; To do: *** Key decoding
;
; Activation of pin change interrupt - PROBLEM!!! PCICR and PCIMSK are 
; extended I/O registers (0x68 and 0x6C), and must be handled as 
; a memory location

;	ldi r16,0x02 ; activate PCINT1
;	out PCICR,r16

	ldi r26, PCICR ; load address of PCICR in Y low
	clr r27 ; load high byte with 0
	ldi r16,0b00000010 ; activate PCINT1
	st X, r16 ; store new PCMSK1


;	ldi r16,0b00011100 ; Mask active inputs
;	out PCMSK1,r16

	ldi r26, PCMSK1 ; load address of PCMSK1 in Y low
	clr r27 ; load high byte with 0
	ldi r16,0b00011100 ; allow pin change interrupt on portC bits 2,3,4
	st X, r16 ; store new PCMSK1


	sei ; Enable interrupts


; Set sleep mode of the CPU

	ldi r16,0b00000001 ; Idle mode (SM2..0: Sleep Mode Select Bits = 0, Sleep enabled)
	out SMCR,r16 ; Idle mode set


; Loop with the Interrupt

loop:
	sleep 
	nop 
	rjmp loop 


; PCINT0 Service Routine - level change on PC2-4 = Key pressed -> 
; switch the FAN between start or stop state
;
; To do: *** rpm reading, regulation, etc.

isr1:
	sbic PINB, FAN ; skip next if FAN = 0 (not rotating)
	rjmp isr11 ; jump if FAN = 1
	sbi PORTB, FAN ; FAN on
	reti ; return from Interrupt
isr11:
	cbi PORTB, FAN ; FAN off
	reti ; return from Interrupt

Vlastnosti vybraného procesoru zde vkládáme pomocí .INCLUDE, na začátku programu je třeba definovat vektory přerušení (využíváme pouze dva, Reset a vstupy od klávesnice), dále nastavit zásobník, nastavit vlastnosti přerušení a mód spánku.

Osobní nástroje