2015-04-26 6 views
0

Я хочу запустить два HC-SR04 на одном PIC16F877A и отправить значение, измеренное двумя ультразвуковыми последовательными портами.прочитайте из Ultrasonic HC-SR04

это мой код, используя PIC C Compiler:

#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8) 
 
#define e1 PIN_B6 
 
#define t1 pin_B7 
 
#define e2 pin_B4 
 
#define t2 pin_B5 
 
int a; 
 
int distanse(int,int); 
 

 
void main() 
 
{ 
 

 
while(1){ 
 
int u1,u2; 
 
u1=distanse(e1,t1);u2=distanse(e2,t2); 
 
printf("%3u", u1); 
 
printf("%3u", u2); 
 
delay_ms(1000); 
 

 
} 
 
} 
 

 
int distanse(int e,int t){ 
 
long long counter=0; 
 
output_bit(t,1);delay_us(10);output_bit(t,0); 
 
a=input(e); 
 
while(a==0){a=input(e);} 
 
while(a==1){counter=counter+1;a=input(e);} 
 
return counter/3.333333; 
 
}

но компьютер получил случайные значения! в чем проблема ?

+0

RS-232 имеет три провода, XMIT, Recv и GND. Я не вижу положения для наземной линии. – user3629249

+0

По моему опыту, неправильные символы указывают на ошибку заземления. – Joshpbarron

+0

последовательный отступ кодовых блоков делает код намного проще для людей читать/понимать. Предложите отступы 4 пробела после каждой открытой скобки '{' и un-indent перед каждой закрывающей скобкой '}' – user3629249

ответ

0

в документации на устройство,

«Вам нужно только поставить короткий 10uS импульс на вход триггера для запуска ранжирования, d, то модуль будет посылать пачку импульсов 8 цикла ультразвука при частоте 40 кГц и поднять его эхо. Эхо является расстояние до объекта, который является ширина импульса и диапазон я п пропорция. Вы можете вычислить диапазон через интервал времени betwe ен посылая сигнал запуска и прием сигнала эха. Формула: uS/58 = centimete rs или uS/148 = дюйм; или: диапазон = время высокого уровня * скорость (340M/S)/2; мы предлагаем использовать в течение 60мс цикла измерения, для того, чтобы предотвратить Trigger Подписать аль эхо-сигнала "

Измерение не как долго сигнал остается высоким, а время между концом в «Start» импульса и начало входного сигнала является высоким.

Следовательно, код измерение неправильного интервала.

следует измерять «низкий» интервал, а не «высокий» интервала .

документация доступна по адресу: http://www.micropik.com/PDF/HCSR04.pdf

примечания, так как ваш работает два устройства, время между измерениями (любого устройства), согласно документации, должна быть более 60msec.

Я не вижу необходимый промежуток времени между запуском различных устройств.

Я хотел бы предложить, используя функцию delay_us() для временного интервала измерения, а не свободного хода во время цикла

+0

или вы можете использовать прерывания, которые фактически запускаются при приеме сигнала ECHO от HCSR04 –

0

В то время как Сопряжение, обеспечить следующие шаги

  1. ПИК микроконтроллер должен передавать, по меньшей мере 10 мкс триггер импульс к контакту Trig Pin HC-SR04.
  2. После получения триггерного импульса HC-SR04 автоматически отправляет восемь звуковых волн с частотой 40 кГц и ожидает выход фронтального фронта на эхо-сигнале.
  3. Когда захват восходящего фронта происходит на выводе эхо-сигнала, который подключен к входу PIC, запустите Таймер PIC18F4550 и снова дождитесь падения фронта на эхо-сигнале.
  4. Как только падающий фронт захвачен на выводе Echo, микроконтроллер считывает счетчик таймера. Этот счетчик времени используется для вычисления расстояния до объекта.

Глядя на вашу программу, не уверен, что счетчик будет работать таким образом. для лучшей точности используйте таймер с режимом захвата. Узнайте больше об этом здесь: PIC controller Timer Capture mode.

Использование таймера для вычисления расстояния с модулем ультразвуковой см это Interfacing PIC controller with Ultrasonic sensor module HC-SR04