Reklama

Zapojení ultrazvukového modulu HC-SR04 s mikrokontrolérem ATmega32

Úvod

V tomto příspěvku se zaměříme na praktickou ukázku zapojení ultrazvukového modulu HC-SR04 pro mikrokontrolér ATmega32. Vytvořeným zdrojovým kódem lze zobrazit vzdálenost od 2 cm do 70 cm pomocí osmi LED diod. Základní popis použitého modulu lze nalézt zde: Ultrazvukový modul HC-SR04

Schéma zapojení ukazuje Obr. 1.

nazev

Obr. 1: Schéma zapojení

 

Zdrojový kód je jednoduchý. Pro buzení ultrazvukového modulu je připojen pin Trig na pin PD7. Změna stavu pinu Echo je identifikována pomocí externího přerušení, kde je vybrána volba spouštění při změně stavu. Pro počítání časového intervalu využijeme osmibitový čítač/časovač 0. Pro inkrementování registru TCNT0 čítače/časovače je použita předdělička – fcpu / 256, tzn. že inkrementace registru TCNT0 probíhá každých 16 µs do té doby, než je registr nastaven na hodnotu 255. Poté je vyvoláno přerušení po přetečení registru a pokud probíhá měření, tak je nastavena identifikace o tomto stavu pro zobrazení pomocí LED diod. Dále se časovač vynuluje a opět se inkrementuje od nuly pořád dokola. Proto musíme s každým novým měřením vynulovat registr TCNT0 a nastavit identifikaci o přetečení na nulu, abychom začínali pokaždé se stejnými počátečními podmínkami. Podle článku Ultrazvukový modul HC-SR04 je patrné, že měřená vzdálenost pro 1µs je 0,00017315 m a z toho plyne, že nejmenší měřená vzdálenost pro 16 µs je 2,7mm a největší možná měřená vzdálenost je 70,6 cm (16 µs x 255). Větší vzdálenosti jsou identifikované pomocí přetečení a jsou zobrazeny maximální možnou zobrazenou vzdáleností. Zvýšit vzdálenost měření lze buď přepnutím předděličky pro čítač/časovač 0 na fcpu / 1024, ale tím zase dostaneme hrubý krok. Další možností je využití čítače/časovače 1, který je šestnáctibitový a může nabývat hodnota až do 65535. Okomentovaný zdrojový kód lze vidět níže.

 

Okomentovaný zdrojový kód
 

001: #include <avr/io.h>
002: #define F_CPU 16000000UL// definice frekvence hodinoveho taktu pro zpozdeni
003: #include <util/delay.h>// hlavickovy soubor pro zpozdeni
004: #include <avr/interrupt.h>// hlavickovy soubor pro preruseni
005:
006: void Send_Puls(void);// prototypy funkcí
007: void Show_LED_Identification(uint8_t count_samples);
008:
009: volatile int measuring;// oznaceni probihajiciho mereni
010: volatile uint8_t state_TCNT0;// pro ulozeni stavu registru TCNTO
011: // identifikace preteceni registru TCNT0
012: volatile uint8_t timer_overflow;
013:
014: ISR(INT0_vect)
015: {
016: if (measuring == 0)// spustit mereni
017: {
018: measuring = 1;// probiha mereni
019: timer_overflow = 0;// smazat identifikaci o preteceni
020: TCNT0 = 0x00;// vynulovani registru casovace
021: }
022: else// ukoncit mereni
023: {
024: measuring = 0;// konec mereni
025: state_TCNT0 = TCNT0;// preulozeni stavu registru
026: }
027: }
028:
029: ISR(TIMER0_OVF_vect)
030: {
031: if (measuring == 1)// probiha mereni tak nastav stav identifikator preteceni
032: {
033: timer_overflow = 1;
034: }
035: }
036:
037: int main(void)
038: {
039: TCCR0 = 0b00000100;// preddelicka 256 = 62,5 kHz = 16us a normalni rezim
040: TIMSK = 0b00000001;// povoleni preruseni po preteceni casovace 0
041:
042: GICR = 0b01000000;// povoleni externiho preruseni 0
043: MCUCR = 0b00000001;// preruseni v reakci na zmenu stavu
044:
045: DDRA = 0xFF;// nastaveni PORTA jako vystupni pro LED diody
046: PORTA = 0x00;// vsechny LED diody zhasnout
047:
048: DDRD = 0b10000000;// nastaveni PD7 jako vystupni pin
049: PORTD &= 0b01111111;// nastaveni stav log 0 na PD7
050:
051: measuring = 0;
052:
053: sei();// povoleni preruseni
054:
055: while(1)
056: {
057: Send_Puls();// vyslat 10 us puls
058: _delay_ms(125);// zpozdeni pro 4 mereni za 1s
059: // zobrazeni vzdalenosti pomoci LED diod
060: Show_LED_Identification(state_TCNT0);
061: _delay_ms(125);// zpozdeni pro 4 mereni za 1s
062: }
063: return 0;
064: }
065:
066: void Send_Puls(void)
067: {
068: PORTD |= 0b10000000;
069: _delay_us(10);
070: PORTD &= 0b01111111;
071: }
075:
073: void Show_LED_Identification(uint8_t count_samples)
074: {
075: if (timer_overflow == 1)//casovac pretekl, tzn. objekt je dale nez 70 cm
076: {
077: PORTA = 0b11111111;
078: }
079: else// vzdalenost je mensi nez 70 cm
080: {
081: if (count_samples < 31)
082: {
083: PORTA = 0b00000001;
084: }
085: else if ((count_samples < 64) && (count_samples >= 31))
086: {
087: PORTA = 0b00000011;
088: }
089: else if ((count_samples < 95) && (count_samples >= 64))
090: {
091: PORTA = 0b00000111;
092: }
093: else if ((count_samples < 127) && (count_samples >= 95))
094: {
095: PORTA = 0b00001111;
096: }
097: else if ((count_samples < 158) && (count_samples >= 127))
098: {
099: PORTA = 0b00011111;
100: }
101: else if((count_samples < 189) && (count_samples >= 158))
102: {
103: PORTA = 0b00111111;
104: }
105: else if ((count_samples < 220) && (count_samples >= 189))
106: {
107: PORTA = 0b01111111;
108: }
109: else if ((count_samples <= 255) && (count_samples >= 220))
110: {
111: PORTA = 0b11111111;
112: }
113: }
114: }

Vzorové zdrojové kódy slouží pouze k jednoduché demonstraci funkce, proto často obsahují globální proměnné, neobsahují většinou ukazatele, dále také neobsahují kontroly proměnných, definování nevyužitých pinů mikrokontroléru a podobné správné programátorské návyky. Proto je nutné tyto kódy brát s patřičnou rezervou.
 
Ukázka zapojení na kontaktním poli

nazev

Ukázka zapojení na kontaktním poli

 
Aktualizace: 23.4.2015
 

Následující a předchozí příspěvek v kategorii:

 
Následující: Zjištění zdroje resetu pro mikrokontrolér ATmega32
Předchozí: Řízení RGB LED pásku pomocí mikrokontroléru ATmeg16
 
 
Tajned facebook
 

Za případné chyby v textu, ve zdrojovém kódě, nebo ve schématickém zapojení se omlouváme.
AUTOŘI NEBEROU ŽÁDNOU ODPOVĚDNOST ZA PŘÍPADNÉ ÚJMY NA ZDRAVÍ ČI MAJETKU.