pulseIn(pin, HIGH)

pulseIn без провода

Ответить
vfear
Рядовой
Сообщения: 93
Зарегистрирован: 30.01.2019{, 14:56}
Репутация: 1
Имя: Владимир

pulseIn(pin, HIGH)

#1

Сообщение vfear » 05.03.2020{, 11:50}

Всем привет, такой вопрос:

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

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

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

Что можно придумать?
Вложения
esp ok.flp
(512.92 КБ) 41 скачивание

andertant
Рядовой
Сообщения: 25
Зарегистрирован: 18.01.2017{, 09:21}
Репутация: 2
Откуда: Днепропетровск

pulseIn(pin, HIGH)

#2

Сообщение andertant » 05.03.2020{, 12:24}

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

vfear
Рядовой
Сообщения: 93
Зарегистрирован: 30.01.2019{, 14:56}
Репутация: 1
Имя: Владимир

pulseIn(pin, HIGH)

#3

Сообщение vfear » 05.03.2020{, 15:13}

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

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

Labu559
Лейтенант
Сообщения: 359
Зарегистрирован: 25.01.2018{, 22:23}
Репутация: 95
Откуда: Bukovyna
Имя: Василий

pulseIn(pin, HIGH)

#4

Сообщение Labu559 » 06.03.2020{, 00:47}

Уважаемый vfear!
vfear писал(а):
05.03.2020{, 21:37}
что может быть?
Разрешите Вам предложить потратить минуту на прочтение данного материала. Если Вы внимательно прочитаете и вникнете, то все вопросы снимутся.
vfear писал(а):
05.03.2020{, 21:37}
зачем вообще нужен этот таймаут?
Просто приход импульса не совпадает по времени с вызовом функции в основном цикле (не сихронизован), потому приходится его подождать. Потому вставляеете значение таймаута как максимальное предполагаемое время полного периода сигнала (для случая, если импульс прийдёт чуть раньше вызова функции),- это и будет задержка цикла при отсутствии сигнала.
внутренности ПБлока должны выглядить примерно такПоказать
PulseIn.png
Замените значение timeOut своим
Обратите внимание, что функция возвращает значение в микросекундах 1000 мкс == 1 мс и таймаут тоже в мкс. У Вас наверное всё-таки 1100...1900 мкс? Иначе Вы не могли получить стабильно правильный результат при таймауте 1 сек == 1 000 000 мкс== 1000мс. по умолчанию.
Да, ещё непонятно с pinMode(pin,INPUT_PULLUP). У Вас получается рабочий уровень сигнала- LOW (учитывая подтяжку), тогда ф-я должна выглядеть как pulseIn(Pin_1_ch, LOW), иначе Вы подсчитываете не длительность импульса, а длительность паузы?
Задержку delay(20) в каждом цикле в любом случае считаю лишней, а вот
отправку в UARTПоказать
PulseInUART.png
Смотреть в обоих блоках UART
нужно сделать не в каждом цикле, а только при изменении значения (при усреднении), или периодически, к примеру раз в секунду и т.п. "Бомбёжка" ком порта в каждом цикле- реально тормозит выполнение кода. К тому же Вы два раза за цикл отправляете данные в монитор порта: переменную steer, которая константа 0, и speed (см. нумерацию блоков на плате).
Note: Предполагаю, что Вы не смогли разобраться в той теме с вопросом:
vfear писал(а):
27.08.2019{, 18:53}
Еще, будет ли разница в моем случае если прописать просто INPUT, а не INPUT_PULLUP ?
Так как мне не известен способ формирования активного уровня приемником (переключение выхода- подтяжка не нужна, или отключение выхода- подтяжка необходима, а PULLDOWN или PULLUP зависит от активного уровня HIGH или LOW соответственно) косвенно смею предположить по неинвертирующему буферу- 74HC244 драйвера BTS7960, что подтяжка не нужна.
Удачи!
Вложения
RC_PWM_v2_1(CODE).ubi
(18.85 КБ) 38 скачиваний

vfear
Рядовой
Сообщения: 93
Зарегистрирован: 30.01.2019{, 14:56}
Репутация: 1
Имя: Владимир

pulseIn(pin, HIGH)

#5

Сообщение vfear » 06.03.2020{, 11:08}

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

vfear
Рядовой
Сообщения: 93
Зарегистрирован: 30.01.2019{, 14:56}
Репутация: 1
Имя: Владимир

pulseIn(pin, HIGH)

#6

Сообщение vfear » 11.03.2020{, 15:25}

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

Ответить

Вернуться в «Помогите, а то я "нимагу"»