Как только появляется высокий уровень на входе TRIG , модуль ultrasoni c устанавливает низкий уровень на выходе ECHO и издает импульс звуковых импульсов. Если есть препятствие, звуковой сигнал отражается как эхо. Как только модуль обнаруживает эхо-сигнал, он устанавливает высокий уровень на выходе ECHO .
Следовательно, расстояние равно времени между излучением звука и получением эхо-сигнала, умноженным на скорость звука в воздухе и делится на два (потому что звук перемещается на расстояние вперед и назад)
К вашему сведению в dry воздух при +20 ° C, скорость звука составляет 343 метра в секунда.
Формула - ваш код верен
Но в коде есть несколько проблем.
1)
PORTC = 0x0F;
_delay_ms(5.2); //creating a 10 us output square wave and sending it out through port c
PORTC = 0x00;
Не путайте мс (миллисекунды) и мкс (микросекоды).
в течение 5,2 мс звук перемещается на 178 см, поэтому вы можете получить неправильные результаты, когда начнете считать эхо.
По причине, почему вы устанавливаете высокий уровень на 4 выхода? Вам нужно установить только тот вывод, к которому подключен TRIG
. (Я не знаю, что это, скажем, это PC2)
PORT C = 0x0F;
PORTC |= (1 << 2); // set high level at PC2
_delay_us(10); //creating a 10 us output square wave and sending it out through port c
PORTC &= ~(1 << 2); // set low level at PC2
2) Вы инициализируете echo
как
echo = (PINC & 0x10); //declares the input echo from the 2nd nybble
Это неправильно. Во-первых, потому что сигнал ECHO
не имеет смысла до того, как сработает TRIG
, а во-вторых, потому что ECHO
остается высоким со времени предыдущего измерения. Поэтому переменная echo
будет инициализирована ненулевым значением, и while(echo==0)
l oop никогда не будет введено.
3) Если модуль не смог обнаружить отраженное эхо, он никогда не установит высокий уровень на выходе ECHO
. Поэтому вам нужно как-то ограничить время ожидания l oop, иначе оно никогда не закончится.
4) Я не знаю, что такое hextodec
и как оно работает при плавающей точке номер передается на него. Вы уверены, что он будет правильно отображать числа с плавающей точкой меньше 1,0? Я уверен, что он не будет пытаться увеличить число и преобразовать его в целое число:
hextodec(lround(distance * 1000));