Ультразвуковой датчик в AVR

Я работаю над созданием ультразвукового дальномера. В настоящее время я тестирую датчик, чтобы убедиться, что он работает правильно. Я подключил эхо-контакт и триггерный контакт к PC4 и PC5 соответственно. Когда я запускаю этот код, в идеале он должен отправить 6 на мой дисплей. Однако он отображает 0. Это наводит меня на мысль, что код неправильно взаимодействует с датчиком. Пожалуйста помоги.

#define F_CPU 16000000UL

#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>

void DisplayIt(int i);

int main(void)
{

    while(1)
    {
        DDRC = 0xFF;
        int i = 0;
        PORTC = 0b00000000;
        _delay_us(2);
        PORTC = 0b00100000;
        _delay_us(10);
        PORTC = 0x00;

        DDRC = 0x00;
        if (PINC == 0b00010000)
        {
            i = 6;
        }
        DisplayIt(i);
    }

}

person Blake Doran    schedule 16.12.2016    source источник


Ответы (2)


Я не знаю, какой ультразвуковой датчик вы использовали. Но я предположил, что это потому, что вы не дождались, пока датчик получит свой эхо-сигнал. На основе ультразвукового датчика, который я когда-либо использовал, SRF04, у него есть такая временная диаграмма:

введите здесь описание изображения

Я модифицирую ваш код, чтобы он имел возможность печатать «6», когда датчик обнаруживает объект перед ним (что мы знаем об этом по приходу эхо-сигнала).

Вот код:

while(1) {
  DDRC = 0xFF;  // Configure all Port C pins as an output
  int i = 0;

  PORTC = 0b00100000;  // Write 1 (high) to PORTC.5 (trigger pin)
  _delay_us(10);  // Keep PORTC.5 to give high signal output for 10us
  PORTC = 0x00;  // Write 0 (low) to PORTC.5

  // The code above completes Trigger Input To Module (see Timing Diagram image)

  DDRC = 0x00;  // Configure all Port C pins as an input
  while (PINC.4 == 0);  // Wait until PINC.4 (echo pin) has 1 (high) value
  if(PINC.4 == 1) i = 6;  // Once PINC.4 is high, while loop will break and this line will be executed

  DisplayIt(i);

  _delay_ms(10);  // Allow 10ms from End of Echo to Next Trigger Pulse
}
person Janice Kartika    schedule 14.01.2017

PINC и PORTC это один и тот же регистр.

PORTC = 0x00; устанавливает содержимое этого регистра в 0 непосредственно перед его чтением.

person uncleO    schedule 16.12.2016
comment
Итак, как мне это исправить, потому что мне нужно очистить это, чтобы остановить запуск? - person Blake Doran; 17.12.2016
comment
Вам нужно будет отредактировать свой вопрос, чтобы указать тип датчика. Это HC-SR04? В этом случае вы читаете эхо слишком рано. Обратитесь к временной диаграмме. Запустите импульс; дождитесь отправки импульса; Время, как долго булавка находится высоко. Вы читаете вывод до отправки импульсов. Поэтому он все еще низкий. Существует множество руководств и примеров кода для этого датчика. В Sparkfun есть простой код для Arduino, который вы можете адаптировать, а также техническое описание. - person uncleO; 18.12.2016