I denna handledning ska vi diskutera och utforma en krets för mätning av avstånd. Denna krets är utvecklad genom att man kopplar ihop ultraljudssensorn “HC-SR04” med AVR-mikrokontrollern. Denna sensor använder en teknik som kallas "ECHO", vilket är något du får när ljudet reflekteras tillbaka efter att ha slagit med en yta.
Vi vet att ljudvibrationer inte kan tränga igenom fasta ämnen. Så vad som händer är att när en ljudkälla genererar vibrationer reser de genom luften med en hastighet av 220 meter per sekund. Dessa vibrationer när de möter vårt öra beskriver vi dem som ljud. Som sagt tidigare kan dessa vibrationer inte gå igenom fasta, så när de slår till med en yta som en vägg reflekteras de tillbaka i samma hastighet till källan, som kallas eko.
Ultraljudsensorn “HC-SR04” ger en utsignal som är proportionell mot avståndet baserat på ekot. Sensorn genererar här en ljudvibration i ultraljudsområde när den ger en utlösare, efter det väntar den på att ljudvibrationen återkommer. Baserat på parametrarna, ljudhastigheten (220m / s) och den tid det tar för ekot att nå källan, ger den utgångspulsen proportionell mot avståndet.
Som visas i figuren måste vi först initiera sensorn för att mäta avstånd, det vill säga en HÖG logisk signal vid avtryckarstiftet på sensorn i mer än 10uS, efter det att en ljudvibration skickas av sensorn, efter ett ek ger sensorn en signal vid utgångsstiftet vars bredd är proportionell mot avståndet mellan källa och hinder.
Detta avstånd beräknas som, avstånd (i cm) = pulsutmatningens bredd (i us) / 58.
Här måste signalens bredd tas i multipel av us (mikrosekund eller 10 ^ -6).
Komponenter krävs
Hårdvara: ATMEGA32, Strömförsörjning (5v), AVR-ISP PROGRAMMER, JHD_162ALCD (16x2LCD), 1000uF kondensator, 10KΩ motstånd (2 delar), HC-SR04-sensor.
Programvara: Atmel studio 6.1, progisp eller flash magi.
Kretsschema och arbetsförklaring
Här använder vi PORTB för att ansluta till LCD-dataporten (D0-D7). Den som inte vill arbeta med FUSE BITS i ATMEGA32A kan inte använda PORTC, eftersom PORTC innehåller en speciell typ av kommunikation som bara kan inaktiveras genom att ändra FUSEBITS.
I kretsen observerar du att jag bara har tagit två kontrollstift, detta ger flexibiliteten för bättre förståelse. Kontrastbiten och LÄS / SKRIV inte ofta så att de kan kortslutas till marken. Detta sätter LCD i högsta kontrast och läsläge. Vi behöver bara kontrollera ENABLE- och RS-stift för att skicka tecken och data i enlighet därmed.
De anslutningar som görs för LCD ges nedan:
PIN1 eller VSS till jord
PIN2 eller VDD eller VCC till + 5v ström
PIN3 eller VEE till marken (ger maximal kontrast bäst för en nybörjare)
PIN4 eller RS (Registrera val) till PD6 i uC
PIN5 eller RW (läs / skriv) till marken (sätter LCD i läsläge underlättar kommunikationen för användaren)
PIN6 eller E (Aktivera) till PD5 för uC
PIN7 eller D0 till PB0 för uC
PIN8 eller D1 till PB1 i uC
PIN9 eller D2 till PB2 i uC
PIN10 eller D3 till PB3 i uC
PIN11 eller D4 till PB4 i uC
PIN12 eller D5 till PB5 i uC
PIN13 eller D6 till PB6 i uC
PIN14 eller D7 till PB7 i uC
I kretsen kan du se att vi har använt 8-bitars kommunikation (D0-D7) men detta är inte obligatoriskt och vi kan använda 4-bitars kommunikation (D4-D7) men med 4-bitars kommunikationsprogram blir lite komplicerat. Så som visas i ovanstående tabell ansluter vi 10 stift LCD till styrenheten där 8 stift är datapinnar och 2 stift för kontroll.
Ultraljudsgivaren är en fyrstiftsanordning, PIN1- VCC eller + 5V; PIN2-TRIGGER; PIN3- ECHO; PIN4- JORD. Trigger pin är där vi ger trigger för att berätta för sensorn att mäta avståndet. Echo är utgångsstift där vi får avståndet i form av pulsbredd. Ekostiftet är här anslutet till styrenheten som en extern avbrottskälla. För att få bredden på signalutgången är sensorns ekostift anslutet till INT0 (avbryt 0) eller PD2.
1. Utlösa sensorn genom att dra upp avtryckaren för minst 12uS.
2. När ekot blir högt får vi ett externt avbrott och vi startar en räknare (möjliggör en räknare) i ISR (Interrupt Service Routine) som körs direkt efter att ett avbrott utlösts.
3. När ekot blir lågt igen genereras ett avbrott, den här gången kommer vi att stoppa räknaren (inaktivera räknaren).
4. Så för en puls hög till låg vid eko-stift har vi startat en räknare och stoppat den. Denna räkning uppdateras till minnet för att få avståndet, eftersom vi har ekobredden nu.
5. Vi kommer att göra ytterligare beräkningar i minnet för att få avståndet i cm
6. Avståndet visas på 16x2 LCD-skärm.
För att ställa in ovanstående funktioner kommer vi att ställa in följande register:
Ovanstående tre register ska ställas in för att installationen ska fungera och vi kommer att diskutera dem kort, BLÅ (INT0): den här biten måste ställas in högt för att möjliggöra det externa avbrottet0, när denna stift är inställd får vi känna av logikändringarna vid PIND2-stiftet.
BRUN (ISC00, ISC01): dessa två bitar justeras för lämplig logisk förändring vid PD2, som ska betraktas som avbrott.
Så som sagt tidigare behöver vi ett avbrott för att starta en räkning och för att stoppa den. Så vi sätter ISC00 som en och vi får ett avbrott när det finns en logik LÅG till HÖG vid INT0; ytterligare ett avbrott när det finns en logik HÖG till LÅG.
RÖD (CS10): Denna bit är helt enkelt för att aktivera och inaktivera räknare. Även om det fungerar tillsammans med andra bitar CS10, CS12. Vi gör ingen förskalning här, så vi behöver inte oroa oss för dem.
Några viktiga saker att komma ihåg här är:
Vi använder intern klocka av ATMEGA32A som är 1MHz. Ingen förskalning här, vi gör inte rutiner för att jämföra matchningsavbrott, så inga komplexa registerinställningar.
Räknarvärdet efter räkningen lagras i 16bit TCNT1-register.
Kontrollera också detta projekt med arduino: Avståndsmätning med Arduino
Programmeringsförklaring
Arbetet med avståndsmätningssensorn förklaras steg för steg i nedanstående C-program.
#include // header för att möjliggöra dataflödeskontroll över pins #define F_CPU 1000000 // berättar styrenhetens kristallfrekvens bifogad