In dit project gaan we een brandalarmsysteem maken met een ATMEGA8-microcontroller en een brandsensor. Een brandsensor kan van elk type zijn, maar we gebruiken een op IR (infrarood) gebaseerde brandsensor. Hoewel IR-gebaseerde brandsensoren enkele nadelen hebben, meestal van onnauwkeurigheid, is dit de goedkoopste en gemakkelijkste manier om brand te detecteren.
IR-gebaseerde brandsensoren hebben een minder waarnemend zicht, dus we gaan de brandsensor op een servomotor monteren. De Servo zal 180 graden slingerrotaties maken. Met de brandsensor erop gemonteerd, krijgen we een zicht van meer dan 270 graden bij brand. De servo draait continu en geeft zo een compleet brandalarmsysteem in de kamer. Voor meer nauwkeurigheid kunnen we een rooksensor aan het systeem toevoegen. Daarmee kunnen we een hogere nauwkeurigheid krijgen.
Circuit componenten
Hardware: + 5v voeding, Servomotor (sg90), ATMEGA8, ZOEMER, Knop, 10KΩ weerstand, 1KΩ weerstand, 220Ω weerstand, 100nF condensator, AVR-ISP PROGRAMMER.
Software: Atmel studio 6.1, progisp of flash magie.
Schakelschema en werking
Om de servo-as helemaal naar links te laten bewegen, moeten we 1/18 draai aan het rantsoen geven, en om de as helemaal naar links te laten draaien, moeten we PWM geven met een duty-rantsoen van 2/18. We gaan ATMEGA8 programmeren om een PWM-signaal af te geven dat de servo-as naar 180 draait en vervolgens naar 0 na een bepaalde vertraging.
Gedurende de volledige tijd zal de brandsensor aan zijn en zal de controller volledig alert zijn. Als er brand is, geeft de sensor een hoge puls, deze puls wordt gedetecteerd door de controller en stelt een alarm in. Het alarm wordt uitgeschakeld door op een resetknop te drukken die erop is aangesloten.
In atmega8 voor drie PWM-kanalen hebben we drie pinnen aangewezen. We kunnen alleen op deze pinnen PWM-uitvoer opnemen. Aangezien we PWM1 gebruiken, moeten we het PWM-signaal nemen op OC1A-pin (PORTB 1 ste PIN). Zoals getoond in het schakelschema, verbinden we het servosignaal met de OC1A-pin. Hier is een ander ding meer dan drie PWM-kanalen, twee zijn 8-bit PWM-kanalen en één 16-bit PWM-kanaal. We gaan hier een 16-bits PWM-kanaal gebruiken.
In ATMEGA zijn er een aantal manieren om PWM te genereren, dat zijn ze
1. Fase-correcte PWM.
2. Snelle PWM.
Hier gaan we alles simpel houden, dus we gaan de FAST PWM-methode gebruiken om het PWM-signaal te genereren.
Kies eerst de frequentie van PWM, dit is meestal afhankelijk van de toepassing, voor een LED zou elke frequentie groter dan 50Hz voldoende zijn. Daarom kiezen we voor de tellerklok 1MHZ, dus geen prescalar. Een prescalar is een getal dat zo is geselecteerd om een kleinere tellerklok te krijgen. Als de oscillatorklok bijvoorbeeld 8Mhz is, kunnen we een prescalar van '8' kiezen om een 1MHz-klok als teller te krijgen. De prescalar wordt geselecteerd op basis van frequentie. Als we meer tijdsperiode-pulsen willen, moeten we een hogere prescalar kiezen.
Om nu de SNELLE PWM van 50Hz-klok uit de ATMEGA te halen, moeten we de juiste bits in het " TCCR1B " -register inschakelen.
Hier, CS10, CS11, CS12 (GEEL) - selecteer de prescalar voor het kiezen van de tellerklok. De tabel voor de juiste prescalar wordt weergegeven in de onderstaande tabel. Dus voor het voorschrijven van één (oscillatorklok = tellerklok).
dus CS10 = 1, andere twee bits zijn nul.
ROOD (WGM10-WGM13): worden gewijzigd om modi voor het genereren van golfvormen te kiezen, op basis van de onderstaande tabel, voor snelle PWM. We hebben WGM11, WGM12 en WGM12 zijn ingesteld op 1.
Nu weten we dat PWM een signaal is met een ander dienstrantsoen of verschillende AAN / UIT-tijden. Tot nu toe hebben we gekozen voor frequentie en type PWM. Het hoofdthema van dit hoofdstuk ligt in deze paragraaf. Om een ander dienstrantsoen te krijgen, gaan we een waarde kiezen tussen 0 en 255 (2 ^ 8 vanwege 8 bit). Stel dat we een waarde 180 kiezen, aangezien de teller begint te tellen vanaf 0 en de waarde 180 bereikt, kan de uitvoerreactie worden geactiveerd. Deze trigger kan omkeren of niet. Dat wil zeggen dat de output kan worden verteld dat deze moet worden opgetrokken bij het bereiken van de telling, of dat kan worden verteld dat deze moet worden afgebroken bij het bereiken van de telling.
GROEN (COM1A1, COM1A0): Deze selectie van omhoog of omlaag trekken wordt gekozen door CM1A0 en CM1A1 bits.
Zoals weergegeven in de tabel, wil de output hoog worden bij het vergelijken en blijft de output hoog tot de maximale waarde. We moeten de inverterende modus kiezen om dat te doen, dus COM1A0 = 1; COM1A1 = 1.
Zoals weergegeven in de onderstaande afbeelding, is OCR1A (Output Compare Register 1A) de byte die de door de gebruiker gekozen waarde opslaat. Dus als we OCR1A = 180 veranderen, triggert de controller de verandering (hoog) wanneer de teller 180 van 0 bereikt.
OCR1A moet 19999-600 zijn voor 180 graden en 19999-2400 voor 0 graden.