I dette projekt skal vi lave et brandalarmsystem ved hjælp af ATMEGA8 mikrokontroller og brandsensor. Brandsensor kan være af enhver type, men vi bruger IR (infrarød) baseret brandsensor. Selvom IR-baserede brandsensorer hovedsagelig har nogle ulemper ved unøjagtighed, er det den billigste og nemmeste måde at opdage brand på.
IR-baserede brandsensorer har mindre synssyn, så vi monterer brandsensoren på en servomotor. Servoen foretager pendulrotationer på 180 grader. Med brandsensoren monteret på den får vi en brandfølesynssyn på over 270 grader. Servoen roterer kontinuerligt og giver således et komplet brandalarmsystem. For mere nøjagtighed kan vi tilføje en røgsensor til systemet. Med det kunne vi få højere nøjagtighed.
Kredsløbskomponenter
Hardware: + 5v strømforsyning, Servomotor (sg90), ATMEGA8, BUZZER, knap, 10KΩ modstand, 1KΩ modstand, 220Ω modstand, 100nF kondensator, AVR-ISP PROGRAMMER.
Software: Atmel studio 6.1, progisp eller flash-magi.
Kredsløbsdiagram og arbejde
For at servoakslen skal bevæge sig venstre væk, er vi nødt til at give 1/18 turn on ration, og for at akslen skal rotere helt til venstre, skal vi give PWM med en duty ration på 2/18. Vi skal programmere ATMEGA8 for at give et PWM-signal, som vil dreje servoakslen til 180 og derefter til 0 efter en vis forsinkelse.
I løbet af hele tiden vil brandsensoren være tændt, og controlleren vil være i fuld alarm. Hvis der er brand, giver sensoren en høj puls, denne puls, når den registreres af controlleren, indstiller den en alarm. Alarmen slukkes ved at trykke på en nulstillingsknap, der er forbundet til den.
I atmega8 til tre PWM-kanaler har vi udpeget tre ben. Vi kan kun tage PWM-output på disse ben. Da vi bruger PWM1 bør vi tage PWM signal på OC1A pin (PORTB 1 st PIN-kode). Som vist i kredsløbsdiagrammet forbinder vi servosignalet til OC1A-stiften. Her er en anden ting over tre PWM-kanaler, to er 8-bit PWM-kanaler og en 16-bit PWM-kanal. Vi skal bruge en 16-bit PWM-kanal her.
I ATMEGA er der et par måder at generere PWM på
1. Fasekorrekt PWM.
2. Hurtig PWM.
Her skal vi holde alt simpelt, så vi bruger FAST PWM-metoden til at generere PWM-signalet.
Først til at vælge frekvensen af PWM, Dette afhænger normalt af applikationen, for en LED vil enhver frekvens større end 50Hz gøre. Af den grund vælger vi tælleruret 1MHZ, så vi vælger ingen prescalar. En prescalar er et tal, der er valgt således at få et mindre mod ur. For eksempel, hvis oscillatoruret er 8MHz, kan vi vælge en prescalar på '8' for at få et 1MHz ur til tæller. Prescalar vælges ud fra frekvens. Hvis vi ønsker flere tidsperiodeimpulser, skal vi vælge højere prescalar.
Nu for at få FAST PWM på 50Hz ur ud af ATMEGA, er vi nødt til at aktivere de relevante bits i " TCCR1B " -registret.
Her, CS10, CS11, CS12 (GUL) - vælg prescalar for at vælge tællerur. Tabellen for passende prescalar er vist i nedenstående tabel. Så til forudskalning af en (oscillatorur = mod ur).
så CS10 = 1, andre to bits er nul.
RØD (WGM10-WGM13): ændres for at vælge bølgeformgenereringstilstande, baseret på nedenstående tabel, for hurtig PWM. Vi har WGM11, WGM12 og WGM12 er indstillet til 1.
Nu ved vi, at PWM er et signal med forskellige driftsforhold eller forskellige tænd / sluk-tider. Indtil nu har vi valgt frekvens og type PWM. Hovedtemaet i dette kapitel ligger i dette afsnit. For at få en anden toldration skal vi vælge en værdi mellem 0 og 255 (2 ^ 8 på grund af 8 bit). Sig, at vi vælger en værdi 180, da tælleren begynder at tælle fra 0 og når værdien 180, kan udgangssvaret muligvis udløses. Denne trigger kan være inverterende eller ikke inverterende. Det vil sige, at produktionen kan blive fortalt at trækkes op, når den når tællingen, eller den kan blive fortalt at trækkes ned, når den når tællingen.
GRØN (COM1A1, COM1A0): Dette valg af at trække op eller ned vælges af CM1A0 og CM1A1 bits.
Som vist i tabel, for at output skal gå højt ved sammenligning, og output forbliver højt indtil maksimumsværdi. Vi er nødt til at vælge inverterende tilstand for at gøre det, så COM1A0 = 1; COM1A1 = 1.
Som vist i nedenstående figur er OCR1A (Output Compare Register 1A) den byte, der gemmer den brugervalgte værdi. Så hvis vi ændrer OCR1A = 180, udløser controlleren ændringen (høj), når tælleren når 180 fra 0.
OCR1A skal være 19999-600 i 180 grader og 19999-2400 i 0 grader.