Читать с Ультразвуковой HC-SR04
Я хочу запустить два HC-SR04 на одном PIC16F877A и отправить значение, измеренное двумя ультразвуковыми устройствами, на последовательный порт.
это мой код с использованием 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;
}
но компьютер получил случайные значения! в чем проблема?
2 ответа
Во время взаимодействия убедитесь, что следующие шаги
- Микроконтроллер PIC должен передавать по крайней мере 10-ти импульсный импульс триггера HC-SR04.
- После получения триггерного импульса, HC-SR04 автоматически отправляет восемь звуковых волн 40 кГц и ожидает выхода с передним фронтом на выводе Echo.
- Когда захват переднего фронта происходит на выводе Echo, который подключен к входу PIC, запустите таймер PIC18F4550 и снова дождитесь падения фронта на выводе Echo.
- Как только задний фронт фиксируется на выводе Echo, микроконтроллер считывает счетчик таймера. Этот счетчик времени используется для расчета расстояния до объекта.
Глядя на вашу программу, не уверен, что счетчик будет работать таким образом. для большей точности используйте таймер с режимом захвата. Узнайте больше об этом здесь: Режим захвата таймера контроллера PIC.
Используя таймер для расчета расстояния с ультразвуковым модулем, обратитесь к этому контроллеру сопряжения PIC с ультразвуковым модулем датчика HC-SR04
Согласно документации на устройство,
"Вам нужно только подать короткий импульс 10 мкс на вход триггера, чтобы начать измерение, а затем d модуль отправит 8-тактный импульс ультразвука при 40 кГц и увеличит его эхо. Эхо - это дистанционный объект, который является импульсным ширина и диапазон пропорционально. Вы можете рассчитать диапазон через интервал времени между отправкой триггерного сигнала и получением эхо-сигнала. Формула: uS / 58 = сантиметры или uS / 148 = дюйм; или: диапазон = время высокого уровня * скорость (340 м / с) / 2; мы предлагаем использовать цикл измерения более 60 мс , чтобы предотвратить появление сигнала триггера аль-эхо-сигнала "
измерение не в том, как долго уровень сигнала остается высоким, а в период между окончанием импульса "пуск" и началом высокого уровня входного сигнала.
Поэтому код измеряет неправильный интервал.
Он должен измерять "низкий" интервал, а не "высокий" интервал.
Документация доступна по адресу: http://www.micropik.com/PDF/HCSR04.pdf
Следует отметить, что с момента запуска двух устройств время между измерениями (любого устройства), согласно документации, должно быть более 60 мсек.
Я не вижу необходимого интервала времени между запуском различных устройств.
Я бы предложил использовать функцию delay_us() для измерения временного интервала, а не свободный цикл while