Управление муфтой 4вд по скорости и газу

Тема в разделе "Схемотехника, компоненты, модули", создана пользователем mihaj109, 4 окт 2020.

  1. mihaj109

    mihaj109 Нерд

    Всем привет! Ардуино нано. Написал скетч по управлению муфтой полного привода по педали газа со своим алгоритмом, там меняется напряжение 0-5в и все относительно несложно. теперь надо сделать отключение\включение по скорости. Но мне не понятны прерывания, точнее их параллельная работа скетчу и паузы.
    Скорость идет импульсами 5В с компа. чтоб получить скорость, мне достаточно посчитать время одного импульса или нужно нескольких для точности? и как с этим значением работать? это будет пременная или что? И везде пишут, что они позволяют не пропустить событие. А мне не надо параллельно. Мне наоборот - опросил положение педали газа, теперь надо опросить скорость и решить подключать муфту или нет.
    ааа. пока писал, пришло понимание. мне наверное нужен таймер, который типо начал и закончил подсчет импульсов, ну и там уже математика. Но вот с этими таймерами пока лес. этот таймер - это прерывание или нет? или просто часть лупа?
    получается я несколько строк опроса вставляю в нужное место или скорость все время опрашивается, а я в нужном месте вызываю переменную? и сколько отнимает времени этот подсчет? ну т.е. по педали газа мгновенно реагирует. А если опрос скорости, к примеру, займет секунду, и я жму газ в пол, то пройдет секунда, когда включится муфта?? Поясните пожалуйста нубу.
     
    Последнее редактирование: 4 окт 2020
  2. Nekto_nikto

    Nekto_nikto Гик

    вам нужно тупо посчитать количество импульсов в секунду, т.к. каждый импульс это оборот, а количество оборотов, это расстояние в секунду, тоесть скорость. Считая их количество в секунду а не в милисекунду вы получаете значение скорости и не сильно загружаете ардуино подсчетами.
    Сам принцип подсчета сводится к проверке пина, на котором у вас сигнал, а вернее изменения состояния пина с низкого на высокое и суммирование, поэтому можно обойтись и без прерываний вообще.
     
  3. mihaj109

    mihaj109 Нерд

    т.о.
    я жму газ в пол, мк при новом цикле видит это нажатие, затем проверяет скорость( на что уходит секунда)и если скорость например меньше 5км\ч, включает муфту. Правильно? Но тут вот и проблема - мне то нужно сразу жопу подключить, а пока он будет считать, перед уже буксанет.
    Выходит, что опрос скорости надо делать постоянно и в цикле в нужном месте быстренько сравнивать с условием? Так а можно например в войд сетап запихать подсчет импульсов и прочую математику, а в лупе просто использовать значение переменной в данный момент времени? Что-то я запутался..
     
  4. a1000

    a1000 Гик

    Так конечно можно, но ТС пишет
    Ему нужно быстро. А тут нужна именно длительность единичного импульса. Значит без таймеров не обойтись. Но судя по вопросу
    ТС это будет сложно.
     
  5. a1000

    a1000 Гик

    Вот примерно так и делается на таймере.
     
  6. mihaj109

    mihaj109 Нерд

    Походу придется осваивать. я просто понять не могу порядок выполнения. обработчик будет просто смотреть изменение уровня или еще и обсчитывать в скорость и делать это получается параллельно скетчу? или мк такой типа ну да сигнал меняется, а ты в цикле каждый раз считай трача время? не ну может доли секунды и хватит для подсчета - меня это вполне устроит. мне в целом и нужно то знать когда 60 и 80 км/ч. т.е. это может быть вполне много импульсов и соответственно меньше времени на подсчет. я вот всё жоплю деньги на покупку осцилографа, чтоб наглядно было видно период
     
  7. a1000

    a1000 Гик

    Конечно получится. Таймер это внешнее устройство, он работает самостоятельно и не занимает ресурсы процессора. Общение между ними в основном строится через прерывания. В общих чертах это должно выглядеть так: пришёл импульс - упали в прерывание где обнуляем таймер. По второму импульсу захватываем значение таймера и в прерывании сбрасываем это значение в вашу переменную скорости, которую вы собираетесь сравнивать в основном цикле. Измеряться будет длительность каждого второго импульса, следовательно каждый раз вы будете иметь вполне адекватные значения.
     
  8. mihaj109

    mihaj109 Нерд

    Спасибо большое за направление!
     
  9. b707

    b707 Гуру

    никакого "параллельно" не будет
    именно так - каждый раз придется "считать, тратя время". Другого пути нет.
    Но если программа грамотно написана. расчет этот займет даже не миллисекунды. а микро - т.е вполне возможно успевать и сигнал измерять. и обсчитывать. и включать муфту в нужный момент. Более того, я бы сказал что скорости работы Нано на это хватит с о-о-огромным запасом.
     
  10. b707

    b707 Гуру

    не пудрите ТС мозги :) на тему "независимого измерения" на таймере - считать скорость все равно придется в основном цикле, как ни крути.
     
  11. a1000

    a1000 Гик

    А нафига её считать? Как я понял, ему надо дать сигнал при превышении некого порогового значения. Можно просто сравнивать сырые данные от таймера. Только наоборот, ибо взаимосвязь длительности импульса и скорости обратная.
    А таймер будет тикать сам по себе.:)
     
  12. mihaj109

    mihaj109 Нерд

    На алекс гивер написано:
    • pulseIn(pin, value, timeout)
      – для импульсов от 10 мкс до ~3 минут, работает на счёте тактов процессора, лучше работает при отключенных прерываниях, более точно измеряет короткие импульсы.
    • pulseInLong(pin, value, timeout)
      – для импульсов от 10 мкс до ~3 минут, основано на
      micros()
      (т.е. на Таймере 0), не работает при отключенных прерываниях, более точно измеряет длинные импульсы.
    это разделение короткие/длинные импульсы к какой-то цифре привязано? Типа до 50-100 гц можно использовать первый вариант, а если больше частота, то лучше второй? или как? я пока входных данных не знаю, жду тепла, но судя по форумам частота будет 40-60 Гц. Т.е. длина импульса 25-15 мсек. Что в таком случае лучше использовать?
     
  13. mihaj109

    mihaj109 Нерд

    мне кажется минус этой пульсИн в том, что при маленькой скорости, частота будет маленькой и длительность импульса может дойти до секунды. к примеру на 10км/ч импульс получается 0,1 сек. Соответственно на опрос низкой скорости уйдет много времени. с другой стороны при такой низкой скорости наверное нет нужды в быстрой реакции на педаль газа...
    Я только успеваю редактировать свой коммент, т.к. нахожу ответы на вопросы )))
    при пульсИн я могу пользоваться дилэй? или луп переделывать под милис или микрос?
     
    Последнее редактирование: 5 окт 2020
  14. a1000

    a1000 Гик

    Это надо определять эксперементально. Посмотреть что за результаты выдаёт одна и вторая функции и выбрать ту, что обеспечит требуемую вам точность. Ну а пока
    о чём можно говорить? Эксперементировать вам не с чем.
    А по поводу
    Сами эти функции будут у вас как delay. Пока не отработают, программа далее не сдвинится.
    Для более точного совета покажите код.
     
  15. SergeiL

    SergeiL Оракул Модератор

    А муфтой то какой вы собрались управлять?
     
  16. b707

    b707 Гуру

    я бы посоветовал забыть pulsein() как страшный сон и никогда ее не использовать. Это функция аналогична delay() и не подходит для программ, которые должны быстро реагировать на внешние сигналы.
    Вы же вроде в начале ветки собирались осваивать прерывания? - вот и осваивайте
     
  17. mihaj109

    mihaj109 Нерд

    электромагнитная муфта заднего привода
     
  18. mihaj109

    mihaj109 Нерд

    изучаю. начал пока с этого ) а в потенциальном будущем, если увеличить частоту шим, это как-то повлияет на прерывания?
     
  19. b707

    b707 Гуру

    зачем вам в управлении муфтой ШИМ?
     
  20. mihaj109

    mihaj109 Нерд

    ну как. магнит притягивает сжимает фрикционы. чем больше напряжения тем сильнее притягивает. почему не подать просто 12В? получится блокированый дифференциал и при увеличении поворота колес, заднее и переднее колесо проходят разное расстояние. в лучшем случае жопа буксанет, в худшем полетит либо задний редуктор либо раздатка. ну и плюс жесткая блока редко нужна, достаточно просто немного момента на заднюю ось