Uživatel:Purnomir

Z MAM wiki

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

[editovat] Semestrální práce:

Team: Miroslav Purnoch, Lukáš Ločárek


Zdroj automaticky spínaný po rozednění


Zadání:

"Řídicí obvod, který vždy cca 4 hodiny po rozednění na 1 hodinu sepne log. 0 na výstupu (otevřený kolektor, max. 20 mA) vnější zařízení - např. ATX zdroj z počítače. Zařízení má pracovat co nejdéle (mnoho let) na lithiovou baterii CR2032 3V/210mAh."



Pro realizaci naší semestrální práce jsme zvolili mikropočítač AVR ATtiny2313A. Nepotřebujeme vysoký výkon ani vybavenost procesorů řady ATmega a zároveň se nám hodí nízká spotřeba ATtiny v klidových módech. Pro takovouto jednoduchou aplikaci je taká vhodnější použít ATtiny oproti ATmega i z hlediska menších rozměrů (počtu pinů) a nižší ceny. ATtiny 2313A používáme s vnitřním RC oscilátorem 168 kHz.


Základním požadavkem, který jsme museli při návrhu naší semestrální práce dodržet, byla minimální spotřeba celého zapojení. Vhodný mikropočítač již vybraný máme a dalším krokem je obvodové schema. Chtěli jsme také použít co nejmenší počet pinů a vnějších součástek, aby bylo možné případně zvolit ještě menší a levnější AVR z řady ATtiny, nebo rozšířit aplikaci o další funkce. Pro detekci rozednění je možno použít v zásadě několik senzorů:


Fototranzistor - Použitím tohoto senzoru se zabýva tato Semestrální práce - Vančura, Shuleska


Fotorezistor - v zapojení odporového děliče napětí. Zde by se využily minimálně 2 piny AVR, 2 vnější součástky a A/D převodník pro měření napětí na děliči (intenzity osvětlení). ATtiny2313A A/D převodník nemá, proto jsme tuto možnost nevyužili.


Solární článek - Touto možností se zabývá semestrální práce našich kolegů: Semestrální práce - Dlouhý, Podivínský


LED/fotodioda - Nejjednodušší varianta z pohledu počtu obsazených pinů a počtu externích součástek. Navíc má nulový odběr proudu v klidovém stavu. Využívá se měření času, za který se vybije kapacita diody, která byla předtím nabita jejím zapojením v závěrném směru. Vybíjecí proud a tedy i rychlost vybití kapacity značně závisí na množství světla dopadajícího na diodu. Při běžném osvětení v místnosti se tato doba pohybuje kolem 10ms, při sníženém osvětlení se značně prodlužuje. tak lze i bez použití A/D převodníku nebo komparátoru snadno určit úroveň osvětlení LED.

Soubor:Schema2_Purnoch_Locarek.png


Informace o ATtiny 2313A, seznam součástek, deska plošného spoje

Kód v C


//Purnoch, Locarek 2011

#include <avr/io.h> // zde je definovan napr. PORTB

#include <avr/iotn2313.h> // konstanty pro konkretni typ mikrokontroleru

#include <avr/sleep.h> // knihovna pro rezim spanku

#include <util/delay.h> // toto potrebuji pro pouziti funkce _delay_ms()

#include <avr/interrupt.h> // knihovna pro preruseni



#define F_CPU 5250UL 		//urceni taktovani AVR pro funkci _delay_ms()

	
	unsigned char noc=0; 	// pricitani poctu mereni, kde byl senzor ve tme

	unsigned char sepni=0; 	// urcuje, jestli ma procesour sepnou vystup

	int citlivost=200;	//nastveni citlivosti senzoru  

	int a=0;			//pomocna promenna


int main (void){ 	// hlavni funkce programu






CLKPR = 0b10000000;			//povoleni zmeny preddelicky systemoveho casovace

CLKPR = 0x6;				//zmena preddelicky na 1/32

SREG = 0b10000000;			//globalni povoleni preruseni

MCUCR = 0b100000;			//povoleni rezimu spanku

ACSR = 0b10000000;			//vypnuti komparatoru pro snizeni spotreby


ISR(TIMER1_COMPA_vect,ISR_BLOCK);		//obsluha preruseni

{



DDRB = 2;

PORTB = 0;
 
  /* hlavni smycka */


  while(1)
  { // nekonecna smycka

cli();		//vypnuti preruseni

if (sepni==1)

	{	

	DDRB = 2;

	PORTB = 1;	//sepnuti vystupu

	noc = 0;

	sepni = 0;

	sei();		//globalni povoleni preruseni

	TIMSK=0b100000;		//povoleni preruseni od citace

	TCCR1A = (1<<WGM11);

   	TCCR1B = (1<<WGM12) | (1<<WGM13) | (1<<CS12) | (1<<CS10); 	//nastaveni modu citace a preddelicky 1:1024
 

	OCR1A= 18457;		//nastaveni citace na 1h


	sleep_mode();	//uspani procesoru

	}



// mereni osvitu

	
	DDRB=1; //port b, pin 0 jako vystup

	PORTB=1; //nabiti kapacity led

	_delay_ms(1); // pockam na nabiti

	DDRB = 0; //port b, pin 1 jako vstup

	PORTB=0; // pull up vypnout

	while(PINB & 1){ // pockam, dokud se kapacita nevybije
		
		a ++;
		
	}
	
	if (a>citlivost)

	{		

		noc++;

	}
	
	else
	
		if (noc>20)
	
		{
	
			sepni=1;



			sei();		//globalni povoleni preruseni

			TIMSK=0b100000;		//povoleni preruseni od citace
			
			TCCR1A = (1<<WGM11);

  		 	TCCR1B = (1<<WGM12) | (1<<WGM13) | (1<<CS12) | (1<<CS10);	//nastaveni modu citace a preddelicky 1:1024


			OCR1A= 58457;		//nastaveni citace na 4h


			sleep_mode();	//uspani procesoru


		}


		sei();		//globalni povoleni preruseni
		

		TIMSK=0b100000;		//povoleni preruseni od citace

		TCCR1A = (1<<WGM11);

  		TCCR1B = (1<<WGM12) | (1<<WGM13) | (1<<CS12) | (1<<CS10);	//nastaveni modu citace a preddelicky 1:1024

		OCR1A= 2877;		//nastaveni citace na 10min

	sleep_mode();	//uspani procesoru



}

  } // konec nekonecne smycky
} // konec main



Osobní nástroje