Доброго дня всем! Хочу синхронизировать две дуины с точностью до микросекунд для выполнения следующей задачи: одновременно сделать замер двумя УЗ-дальномерами на двух ардуинах, т.е. по одному дальномеру на каждой. Если быть точнее, одна ардуина будет только вещать, а другая - только принимать. Но суть в том, что импульс они должны подать одновременно, иначе будет отклонение результата. На одной ардуинке с двумя дальномерами(у одного изолентой замотан излучатель, у другого - приемник) это делается элементарно. А вот как быть с двумя ардуинками, связанными через I2C или UART? У меня только одна догадка: нужно как-то синхронизовать внутренние часы двух ардуин и делать замеры по расписанию(т.е. "мастер" говорит "слейву", что в 100500 микросекунд по внутренним часам мы начинаем подачу импульса). А вот способов синхронизации я пока не придумал. Разве что использовать данные времени, полученные с GPS(но это дороговато, да и не очень ясно, как оттуда именно микросекунды вытащить) или синхронизация по NTP с помощью ethernet шилда. Может у кого-нибудь есть хорошие идеи?
В реальных протоколах устройства синхронизируются во время общения сотни и даже тысячи раз в секунду. В вашем случае скорее стоит говорить ни о синхронизации а об управляющих сигналах. Зачем вам мучатся с поддержкой синхронности двух мк когда один мк может просто говорить второму мк когда ему выполнять свою работу. К примеру по вешали функцию снятия показаний с дальномера на прерывание, головной мк подал импульс на подчиненный и подчиненный снял показания в то время как головной делает то же самое сразу после подачи сигнала. Либо если вам крайне важно по каким то причинам держать все же мк постоянно синхронными, раз в какое то время просто передавайте сигнал синхронизации, по его поступлении подчиненный мк сбрасывает или устанавливает в некое значение некий счетчик чего-либо и принимает свои решения о деятельности от значения данного счетчика, таким образом головной мк будет постоянно поддерживать все подчиненные мк в синхронном состоянии.
Я примерно так и делаю. Для начала я записал время micros() в момент отправки данных, а затем, это же время на этой же ардуинке после получения ответа("полезный" код ни на одной рдуинке в это время не выполнялся). Получал примерно 176-184 мкс. Из этого сделал вывод, что время на поход информации в одну сторону занимает ~90 мкс. Далее, я записал в ардуинки полезный код и поступил следующим образом: Ардуино-мастер подает команду о пуске ардуино-слейву и выполняет задержку в 90 мкс, после чего включает УЗ-излучатель на 10 микросекунд. Ардуино-слейв получает команду и сразу же включает УЗ-приемник на 10 микросекунд, затем замеряет длину импульса и конвертирует во время. Проблема: расстояние выводит неправильное, из чего я делаю вывод о наличии какой-то ошибки. На одной дуине этот же код дает значения с точностью до 0.5 см. Код (Text): digitalWrite(client_T, HIGH); digitalWrite(sputnic_T_1, HIGH); delayMicroseconds(10); digitalWrite(client_T, LOW); digitalWrite(sputnic_T_1, LOW); tim1=pulseIn(sputnic_E_1, HIGH);
Есть у меня такое мнение что тут дело не в коде. Если взять скорость звука в 330 м/с то за 1 микросекунду звук улетает на 33 см .. таким образом ошибись вы с "синхронизацией" всего на 1 микросекунду то при домашних условиях вы вообще вряд ли получите хоть какие либо дельные результаты Так что замеры типа примерно 90 микросекунд в таких играх не годятся это уже другой уровень Мили секунда по меркам МК это вечность, за которую можно родится, повзрослеть, состариться и умереть P.s. Знаете почему Ethernet не работает если непрерывная длинна кабеля больше 250 метров (по крайней мере витая пара 3 категории), время прохождения сигнала на такое расстояние больше периода ожидания очередного сигнала по протоколу
Не совсем так) Микросекунда это 0.000001 секунд. А 0.000001*343м/с это 0.000343 метров. Так что погрешность даже в десятки микросекунд допустима На тему миллисекунд полностью согласен)