В този урок ще обсъдим и проектираме схема за измерване на разстоянието. Тази схема е разработена чрез свързване на ултразвуков сензор “HC-SR04” с AVR микроконтролер. Този сензор използва техника, наречена „ECHO“, която получавате, когато звукът се отразява обратно след удара с повърхност.
Знаем, че звуковите вибрации не могат да проникнат през твърди частици. И така, това, което се случва е, когато източник на звук генерира вибрации, те се движат по въздух със скорост 220 метра в секунда. Тези вибрации, когато срещнат ухото ни, ги описваме като звук. Както беше казано по-рано, тези вибрации не могат да преминат през твърдо вещество, така че когато удрят с повърхност като стена, те се отразяват обратно със същата скорост към източника, който се нарича ехо.
Ултразвуков сензор “HC-SR04” осигурява изходен сигнал, пропорционален на разстоянието въз основа на ехото. Тук сензорът генерира звукови вибрации в ултразвуков диапазон при подаване на спусък, след което изчаква да се върнат звуковите вибрации. Сега въз основа на параметрите, скоростта на звука (220m / s) и времето, необходимо на ехото да достигне източника, той осигурява изходен импулс, пропорционален на разстоянието.
Както е показано на фигурата, първо трябва да инициираме сензора за измерване на разстоянието, което е ВИСОКИ логически сигнал на спусъка на сензора за повече от 10uS, след това от сензора се изпраща звукова вибрация, след ехо сензорът осигурява сигнал на изходния щифт, чиято ширина е пропорционална на разстоянието между източника и препятствието.
Това разстояние се изчислява като, разстояние (в cm) = ширина на импулсния изход (в uS) / 58.
Тук широчината на сигнала трябва да се приема в кратно на uS (микросекунда или 10 ^ -6).
Необходими компоненти
Хардуер: ATMEGA32, Захранване (5v), AVR-ISP ПРОГРАММЕР, JHD_162ALCD (16x2LCD), кондензатор 1000uF, резистор 10KΩ (2 броя), сензор HC-SR04.
Софтуер: Atmel studio 6.1, progisp или flash magic.
Електрическа схема и работно обяснение
Тук използваме PORTB за свързване към LCD порт за данни (D0-D7). Всеки, който не иска да работи с FUSE BITS на ATMEGA32A, не може да използва PORTC, тъй като PORTC съдържа специален тип комуникация, която може да бъде деактивирана само чрез промяна на FUSEBITS.
Във веригата забелязвате, че съм взел само два контролни щифта, това дава гъвкавост на по-добро разбиране. Контрастният бит и READ / WRITE не се използват често, така че могат да бъдат късо заземени. Това поставя LCD в най-висок контраст и режим на четене. Просто трябва да контролираме ENABLE и RS щифтовете, за да изпращаме символи и данни по съответния начин.
Връзките, които се правят за LCD са дадени по-долу:
PIN1 или VSS към земята
PIN2 или VDD или VCC до + 5v мощност
PIN3 или VEE към земята (дава максимален контраст най-добър за начинаещи)
PIN4 или RS (Регистрация за избор) към PD6 на uC
PIN5 или RW (четене / запис) към земята (поставя LCD в режим на четене, улеснява комуникацията за потребителя)
PIN6 или E (Активиране) до PD5 на uC
PIN7 или D0 до PB0 на uC
PIN8 или D1 до PB1 на uC
PIN9 или D2 до PB2 на uC
PIN10 или D3 до PB3 на uC
PIN11 или D4 до PB4 на uC
PIN12 или D5 до PB5 на uC
PIN13 или D6 до PB6 на uC
PIN14 или D7 до PB7 на uC
Във веригата можете да видите, че сме използвали 8-битова комуникация (D0-D7), но това не е задължително и можем да използваме 4-битова комуникация (D4-D7), но с 4-битова програма за комуникация става малко сложна. Така както е показано в горната таблица, ние свързваме 10 щифта LCD към контролер, в който 8 щифта са щифтове за данни и 2 щифта за управление.
Ултразвуковият сензор е четирипинов уред, PIN1- VCC или + 5V; PIN2-TRIGGER; ПИН3- ECHO; ПИН4- ЗЕМЯ. Задействащият щифт е мястото, където даваме спусък, за да кажем на сензора да измери разстоянието. Echo е изходен щифт, където получаваме разстоянието под формата на широчина на импулса. Ехо пинът тук е свързан към контролера като външен източник на прекъсване. Така че, за да се получи ширината на изходния сигнал, ехо-щифтът на сензора е свързан към INT0 (прекъсване 0) или PD2.
1. Задействане на сензора чрез издърпване на спусъка за минимум 12uS.
2. След като ехото се повиши, получаваме външно прекъсване и ще стартираме брояч (активиращ брояч) в ISR (Interrupt Service Rutine), който се изпълнява веднага след задействане на прекъсване.
3. След като ехото отново се понижи, се генерира прекъсване, този път ще спрем брояча (деактивиране на брояча).
4. И така, за импулс от високо до ниско на ехо-пина, ние стартирахме брояч и го спряхме. Този брой се актуализира в паметта за получаване на разстоянието, тъй като сега имаме ширината на ехото в броя.
5. Ще направим допълнителни изчисления в паметта, за да получим разстоянието в cm
6. Разстоянието се показва на 16x2 LCD дисплей.
За настройка на горните функции ще зададем следните регистри:
Горните три регистъра трябва да бъдат настроени съответно, за да работи настройката и ще ги обсъдим накратко, СИН (INT0): този бит трябва да бъде настроен високо, за да активира външното прекъсване0, след като този пин е настроен, ние можем да усетим логическите промени на PIND2 пина.
BROWN (ISC00, ISC01): тези два бита се коригират за съответната логическа промяна в PD2, която да се счита за прекъсване.
Така че, както беше казано по-рано, ние се нуждаем от прекъсване, за да започнем броенето и да го спрем. Така че ние задаваме ISC00 като едно и получаваме прекъсване, когато има логика LOW до HIGH при INT0; друго прекъсване, когато има логика HIGH to LOW.
ЧЕРВЕНО (CS10): Този бит е просто за активиране и деактивиране на брояча. Въпреки че работи заедно с други битове CS10, CS12. Тук не правим никакво предскалиране, така че не е нужно да се тревожим за тях.
Ето някои важни неща, които трябва да запомните тук:
Използваме вътрешен часовник на ATMEGA32A, който е 1MHz. Тук няма прекалиране, не правим рутиране на генериране на прекъсване на съвпадение, така че няма сложни настройки на регистъра.
Стойността на броенето след броенето се съхранява в 16-битов регистър TCNT1.
Проверете и този проект с arduino: Измерване на разстоянието с помощта на Arduino
Обяснение на програмирането
Работата на сензора за измерване на разстояние е обяснена стъпка по стъпка в долната програма C.
#include // заглавка, за да се даде възможност за контрол на потока от данни над щифтовете #define F_CPU 1000000 // разказваща прикачена честота на кристала на контролера