Какой единице измерения метри c соответствует расстояние при использовании ультразвукового датчика c? - PullRequest
0 голосов
/ 04 февраля 2020

В настоящее время я использую ультразвуковой датчик приближения c для измерения количества воды в резервуаре. Я начинаю с того, что просто пытаюсь получить измерение расстояния между датчиком и объектом, на котором отражается волна. Я пытался создать свой собственный код (на C языке), однако я не совсем уверен, где моя проблема. У меня есть код, написанный для отображения на ЖК-дисплее. Числа, в которых я получаю: 669, A45, h45. Ниже прокомментирована функция, которую я написал для выполнения этой задачи.

void distance_sensor(void)
{
    DDRC= 0x0F;    //enables only one nybble to be an output

    double timecnt;
    double distance;
    int echo;

    char distb [16] = {"Container up to:"};
    lcd_write(distb, 16, line_1);  //displays banner on LCD

    echo = (PINC & 0x10);  //declares the input echo from the 2nd nybble

    distance= 0;           //initialization
    timecnt = 0;

    PORTC = 0x00;
    _delay_ms(1.0);

    PORTC = 0x0F;
    _delay_ms(5.2);        //creating a 10 us output square wave and sending it out through port c
    PORTC = 0x00;

    while(echo==0) 
    {
        echo = (PINC & 0x10);   //rechecking the input
        timecnt = timecnt + 1;  //time taken for the wave to reflect back to the sensor             
        _delay_us(100.0);
    }

    timecnt= timecnt*100;
    distance = (timecnt*0.000343)/2;  
    hextodec(distance);         //function made to split the value into msd, nsd, lsd and displays on LCD

    return; 
}

1 Ответ

0 голосов
/ 04 февраля 2020

Как только появляется высокий уровень на входе 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)); 
...