Страница 1 из 1

pulseIn(pin, HIGH)

Добавлено: 05 мар 2020, 11:50
vfear
Всем привет, такой вопрос:

Пользуюсь пользовательским блоком считывания длинны сигнала RC приемника (RC_PWM) - в нем встроена функция pulseIn.
Работает все хорошо, пока провод от приемника подключен ко входу и идет передача сигнала. Но сейчас у меня появилась необходимость разрывать связь по двум из 4 каналов, программа при этом должна продолжать работать.

Но тут и наступает проблема - при использовании pulseIn если на входе ничего не подключено, контроллер начинает почему то работать с огромной задержкой. Например: отключаю 2 из 4 каналов физически(просто вытаскиваю провода из контроллера), два других вставлены, нажимаю запустить мотор - включается только секунды через 2, отпускаю - так же задержка секунды 2 - отключился. Вставляю провода обратно - задержка пропадает.

Решил посмотреть через монитор порта: при подключенном проводе показания передаются быстро, отключаю провод - в мониторе отображается 0 и обновление замедляется с периодичностью секунда или две.

Что можно придумать?

pulseIn(pin, HIGH)

Добавлено: 05 мар 2020, 12:24
andertant
Допишите максимальное время ожидания импульса pulseIn(pin, value, timeout)! Функция работает с импульсами длительностью от 10 микросекунд до 3 минут.

pulseIn(pin, HIGH)

Добавлено: 05 мар 2020, 21:37
vfear
andertant писал(а): 05 мар 2020, 12:24 Допишите максимальное время ожидания импульса pulseIn(pin, value, timeout)! Функция работает с импульсами длительностью от 10 микросекунд до 3 минут.
Получается по умолчанию, если нет сигнала, то весь цикл останавливается на 1 сек?
я прописываю в скетче задержку на цикл - delay(20), получается надо сделать pulseIn(pin, value, 20), правильно я понимаю?
Длинна импульса у меня от 1100мс до 1900мс это будет, как то отрицательно влиять на работу? Просто не очень понимаю, зачем вообще нужен этот таймаут?

Отправлено спустя 6 часов 23 минуты 21 секунду:
andertant писал(а): 05 мар 2020, 12:24 Допишите максимальное время ожидания импульса pulseIn(pin, value, timeout)! Функция работает с импульсами длительностью от 10 микросекунд до 3 минут.
что то поставил Везде 20 - вообще перестало на пульт реагировать, что может быть?

pulseIn(pin, HIGH)

Добавлено: 06 мар 2020, 00:47
Labu559
Уважаемый [ref]vfear[/ref]!
vfear писал(а): 05 мар 2020, 21:37что может быть?
Разрешите Вам предложить потратить минуту на прочтение данного материала. Если Вы внимательно прочитаете и вникнете, то все вопросы снимутся.
vfear писал(а): 05 мар 2020, 21:37 зачем вообще нужен этот таймаут?
Просто приход импульса не совпадает по времени с вызовом функции в основном цикле (не сихронизован), потому приходится его подождать. Потому вставляеете значение таймаута как максимальное предполагаемое время полного периода сигнала (для случая, если импульс прийдёт чуть раньше вызова функции),- это и будет задержка цикла при отсутствии сигнала.
[spoiler title=внутренности ПБлока должны выглядить примерно так]
PulseIn.png
[/spoiler]
Обратите внимание, что функция возвращает значение в микросекундах 1000 мкс == 1 мс и таймаут тоже в мкс. У Вас наверное всё-таки 1100...1900 мкс? Иначе Вы не могли получить стабильно правильный результат при таймауте 1 сек == 1 000 000 мкс== 1000мс. по умолчанию.
Да, ещё непонятно с pinMode(pin,INPUT_PULLUP). У Вас получается рабочий уровень сигнала- LOW (учитывая подтяжку), тогда ф-я должна выглядеть как pulseIn(Pin_1_ch, LOW), иначе Вы подсчитываете не длительность импульса, а длительность паузы?
Задержку delay(20) в каждом цикле в любом случае считаю лишней, а вот [spoiler title=отправку в UART]
PulseInUART.png
[/spoiler] нужно сделать не в каждом цикле, а только при изменении значения (при усреднении), или периодически, к примеру раз в секунду и т.п. "Бомбёжка" ком порта в каждом цикле- реально тормозит выполнение кода. К тому же Вы два раза за цикл отправляете данные в монитор порта: переменную steer, которая константа 0, и speed (см. нумерацию блоков на плате).
Note: Предполагаю, что Вы не смогли разобраться в той теме с вопросом:
vfear писал(а): 27 авг 2019, 18:53 Еще, будет ли разница в моем случае если прописать просто INPUT, а не INPUT_PULLUP ?
Так как мне не известен способ формирования активного уровня приемником (переключение выхода- подтяжка не нужна, или отключение выхода- подтяжка необходима, а PULLDOWN или PULLUP зависит от активного уровня HIGH или LOW соответственно) косвенно смею предположить по неинвертирующему буферу- 74HC244 драйвера BTS7960, что подтяжка не нужна.
Удачи!

pulseIn(pin, HIGH)

Добавлено: 06 мар 2020, 11:08
vfear
Labu559 писал(а): 06 мар 2020, 00:47 Уважаемый [ref]vfear[/ref]!
vfear писал(а): 05 мар 2020, 21:37что может быть?
Разрешите Вам предложить потратить минуту на прочтение данного материала. Если Вы внимательно прочитаете и вникнете, то все вопросы снимутся.
vfear писал(а): 05 мар 2020, 21:37 зачем вообще нужен этот таймаут?
Просто приход импульса не совпадает по времени с вызовом функции в основном цикле (не сихронизован), потому приходится его подождать. Потому вставляеете значение таймаута как максимальное предполагаемое время полного периода сигнала (для случая, если импульс прийдёт чуть раньше вызова функции),- это и будет задержка цикла при отсутствии сигнала.
[spoiler title=внутренности ПБлока должны выглядить примерно так]PulseIn.png[/spoiler]
Обратите внимание, что функция возвращает значение в микросекундах 1000 мкс == 1 мс и таймаут тоже в мкс. У Вас наверное всё-таки 1100...1900 мкс? Иначе Вы не могли получить стабильно правильный результат при таймауте 1 сек == 1 000 000 мкс== 1000мс. по умолчанию.
Да, ещё непонятно с pinMode(pin,INPUT_PULLUP). У Вас получается рабочий уровень сигнала- LOW (учитывая подтяжку), тогда ф-я должна выглядеть как pulseIn(Pin_1_ch, LOW), иначе Вы подсчитываете не длительность импульса, а длительность паузы?
Задержку delay(20) в каждом цикле в любом случае считаю лишней, а вот [spoiler title=отправку в UART]PulseInUART.png[/spoiler] нужно сделать не в каждом цикле, а только при изменении значения (при усреднении), или периодически, к примеру раз в секунду и т.п. "Бомбёжка" ком порта в каждом цикле- реально тормозит выполнение кода. К тому же Вы два раза за цикл отправляете данные в монитор порта: переменную steer, которая константа 0, и speed (см. нумерацию блоков на плате).
Note: Предполагаю, что Вы не смогли разобраться в той теме с вопросом:
vfear писал(а): 27 авг 2019, 18:53 Еще, будет ли разница в моем случае если прописать просто INPUT, а не INPUT_PULLUP ?
Так как мне не известен способ формирования активного уровня приемником (переключение выхода- подтяжка не нужна, или отключение выхода- подтяжка необходима, а PULLDOWN или PULLUP зависит от активного уровня HIGH или LOW соответственно) косвенно смею предположить по неинвертирующему буферу- 74HC244 драйвера BTS7960, что подтяжка не нужна.
Удачи!
Спасибо большое за такой развёрнутый ответ! Вечером буду пробовать, пока нашёл вот такое видео https://youtu.be/BGIB2wZ9dHk, 21000 выставляет таймаут, как раз по моей теме и пульт у человека точно такой же как у меня. Начёт pullup пробовал и так и так - одинаковые значения выдаются.

pulseIn(pin, HIGH)

Добавлено: 11 мар 2020, 15:25
vfear
Еще вопрос, возможно ли сделать в блоке RC_PWM вход разрешения работы? То есть допустим, если на входе 0 - то вообще не запускать Pulsein.