I denne opplæringen skal vi diskutere og designe en krets for måling av avstand. Denne kretsen er utviklet ved å grensesnittet mellom ultrasonisk sensor “HC-SR04” og AVR-mikrokontroller. Denne sensoren bruker en teknikk kalt “ECHO” som er noe du får når lyd reflekteres tilbake etter å ha slått med en overflate.
Vi vet at lydvibrasjoner ikke kan trenge gjennom faste stoffer. Så hva som skjer er at når en lydkilde genererer vibrasjoner, beveger de seg gjennom luften med en hastighet på 220 meter per sekund. Disse vibrasjonene når de møter øret vårt, beskriver vi dem som lyd. Som sagt tidligere kan disse vibrasjonene ikke gå gjennom faste, så når de treffer med en overflate som en vegg, reflekteres de tilbake i samme hastighet til kilden, som kalles ekko.
Ultralydssensor “HC-SR04” gir et utgangssignal proporsjonalt med avstand basert på ekkoet. Sensoren genererer her en lydvibrasjon i ultralydområdet når den gir en utløser, etter at den venter på at lydvibrasjonen skal komme tilbake. Basert på parametrene, lydhastigheten (220m / s) og tiden det tar for ekkoet å nå kilden, gir den utgangspulsen proporsjonal med avstanden.
Som vist i figuren, må vi først starte sensoren for måling av avstand, det vil si et HØYT logisk signal ved utløserpinnen til sensoren i mer enn 10uS, etter at en lydvibrasjon sendes av sensoren, etter et ekko, gir sensoren et signal ved utgangspinnen hvis bredde er proporsjonal med avstanden mellom kilde og hindring.
Denne avstanden beregnes som, avstand (i cm) = pulsutgangens bredde (i us) / 58.
Her må bredden på signalet tas i multiplum av us (mikrosekund eller 10 ^ -6).
Komponenter kreves
Maskinvare: ATMEGA32, strømforsyning (5v), AVR-ISP PROGRAMMER, JHD_162ALCD (16x2LCD), 1000uF kondensator, 10KΩ motstand (2 deler), HC-SR04 sensor.
Programvare: Atmel studio 6.1, progisp eller flash magi.
Kretsdiagram og arbeidsforklaring
Her bruker vi PORTB for å koble til LCD-dataporten (D0-D7). Alle som ikke vil jobbe med FUSE BITS av ATMEGA32A, kan ikke bruke PORTC, da PORTC inneholder en spesiell type kommunikasjon som bare kan deaktiveres ved å endre FUSEBITS.
I kretsen observerer du at jeg bare har tatt to kontrollpinner, dette gir fleksibiliteten til bedre forståelse. Kontrastbiten og LES / SKRIV brukes ikke ofte slik at de kan kortsluttes til bakken. Dette setter LCD i høyest kontrast og lesemodus. Vi trenger bare å kontrollere ENABLE- og RS-pinner for å sende tegn og data tilsvarende.
Tilkoblingene som gjøres for LCD er gitt nedenfor:
PIN1 eller VSS til bakken
PIN2 eller VDD eller VCC til + 5v strøm
PIN3 eller VEE til jord (gir maksimal kontrast best for en nybegynner)
PIN4 eller RS (Register Selection) til PD6 i uC
PIN5 eller RW (lese / skrive) til bakken (setter LCD i lesemodus letter kommunikasjonen for brukeren)
PIN6 eller E (Aktiver) til PD5 på uC
PIN7 eller D0 til PB0 av uC
PIN8 eller D1 til PB1 av uC
PIN9 eller D2 til PB2 av uC
PIN10 eller D3 til PB3 av uC
PIN11 eller D4 til PB4 i uC
PIN12 eller D5 til PB5 av uC
PIN13 eller D6 til PB6 av uC
PIN14 eller D7 til PB7 i uC
I kretsen kan du se at vi har brukt 8bit-kommunikasjon (D0-D7), men dette er ikke obligatorisk, og vi kan bruke 4-biters kommunikasjon (D4-D7), men med 4-bits kommunikasjonsprogram blir det litt komplekst. Så som vist i tabellen ovenfor kobler vi 10 pinner på LCD til kontrolleren der 8 pinner er datapinner og 2 pinner for kontroll.
Ultralydssensoren er en firepinnet enhet, PIN1- VCC eller + 5V; PIN2-TRIGGER; PIN3- ECHO; PIN4- JORD. Trigger pin er der vi gir trigger for å fortelle sensoren å måle avstanden. Ekko er utgangsstift der vi får avstanden i form av pulsbredden. Ekkopinnen her er koblet til kontrolleren som en ekstern avbruddskilde. Så for å få bredden på signalutgangen, er ekkopinnen til sensoren koblet til INT0 (avbryt 0) eller PD2.
1. Utløs sensoren ved å trekke opp avtrekkerstiften for minst 12uS.
2. Når ekkoet går høyt, får vi et eksternt avbrudd, og vi skal starte en teller (aktivere en teller) i ISR (Interrupt Service Routine) som utføres rett etter at et avbrudd utløses.
3. Når ekkoet blir lavt igjen, genereres et avbrudd, denne gangen skal vi stoppe telleren (deaktivere telleren).
4. Så for en puls høy til lav ved ekkopinnen, har vi startet en teller og stoppet den. Denne tellingen er oppdatert til minne for å få avstanden, ettersom vi har bredden på ekko nå.
5. Vi skal gjøre ytterligere beregninger i minnet for å få avstanden i cm
6. Avstanden vises på 16x2 LCD-skjerm.
For å sette opp de ovennevnte funksjonene skal vi sette følgende registre:
Ovennevnte tre registre skal settes tilsvarende for at oppsettet skal fungere, og vi skal diskutere dem kort, BLÅ (INT0): denne biten må settes høyt for å muliggjøre den eksterne interrupt0, når denne pinnen er satt, får vi oppleve at logikken endres ved PIND2-pinnen.
BRUN (ISC00, ISC01): disse to bitene justeres for riktig logisk endring ved PD2, som skal betraktes som avbrudd.
Så som sagt tidligere trenger vi et avbrudd for å starte en telling og for å stoppe den. Så vi setter ISC00 som en, og vi får et avbrudd når det er en logikk LAV til HØY ved INT0; et annet avbrudd når det er en logikk HØY til LAV.
RØD (CS10): Denne biten er ganske enkelt for å aktivere og deaktivere teller. Selv om det fungerer sammen med andre biter CS10, CS12. Vi gjør ingen forhåndsskalering her, så vi trenger ikke bekymre oss for dem.
Noen viktige ting å huske her er:
Vi bruker intern klokke av ATMEGA32A som er 1MHz. Ingen forhåndskalkulering her, vi utfører ikke rutine for sammenligning av kampavbrudd, så ingen komplekse registerinnstillinger.
Telleverdien etter telling er lagret i 16bit TCNT1-register.
Sjekk også dette prosjektet med arduino: Avstandsmåling ved hjelp av Arduino
Programmering Forklaring
Arbeid med avstandsmålesensor forklares trinnvis i C-programmet nedenfor.
#include // header for å aktivere datastrømskontroll over pins #define F_CPU 1000000 // fortelle kontrollerens krystallfrekvens knyttet #include