Эскиз государственного аппарата для управления двигателем постоянного тока с концевыми выключателями [закрыт]

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

Я читал, что кодирование конечного автомата для выполнения этой задачи является лучшим методом, однако я не знаю, с чего начать.

Ниже вы найдете фрагмент моей экспериментальной конфигурации для реализованного кода и блок-схемы.

Valid XHTMLValid XHTML

2 голоса | спросил Kreation 1 FebruaryEurope/MoscowbThu, 01 Feb 2018 15:29:54 +0300000000pmThu, 01 Feb 2018 15:29:54 +030018 2018, 15:29:54

2 ответа


2

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

 введите описание изображения здесь>> </a> </p>

<p> В этой диаграмме состояния турникета (с указанной выше страницы wikipedia машины состояния) наблюдается, что узлы (пузырьки) содержат состояние турникета и по краям (стрелки) записывают условие, необходимое для перемещения в направлении стрелки к новому состоянию. </p>

<p> Для заданного здесь вопроса необходимо указать не менее 2 узлов, чтобы указать направление двигателя. Края, вероятно, укажут, какая стрелка должна использоваться для перехода в новое состояние, на основе которого переключатель открыт или закрыт. Позже рассмотрите возможность добавления нового состояния, чтобы остановить двигатель, когда конечный выключатель закрыт. (Подсказка: вероятно, вам понадобятся два стоповых узла: один для каждого конечного выключателя. Причина в том, что вам нужно знать, в каком направлении двигатель должен включаться при перезапуске.) </p>

<p> В некоторых случаях добавление кратковременного контактного переключателя является сложным из-за необходимости уменьшить <a href= контакт подпрыгивать . Это верно, когда изменяется значение активации переключателя. Значение конечного выключателя не изменяется, поэтому нет необходимости смягчать контактный отскок или «отбрасывать» конечные выключатели. Однако предполагается, что «Cycle Switch» может запускать двигатель, вращающийся в разных направлениях в зависимости от истории движения двигателя. Поэтому «Циклический коммутатор» может получить преимущество от конечного автомата с четырьмя узлами, где есть узлы, которые выводят выключатель и закрываются. Но чтобы добраться до любого из этих двух узлов, необходимо иметь еще два узла, в которых обрабатывается переключатель «debouncing».

 введите описание изображения здесь>> </a> </p>

<p> При обработке нескольких состояний машин в одной программе важно не блокировать поток. Все государственные машины должны быть постоянно проверены на наличие шансов штата (проверка краевых условий для перехода от текущего узла к новому узлу). </p>

<p> При написании Arduino (в C /C ++) чаще всего используется шаблон кода (switch /case), где переменной присваиваются номера, связанные с разными узлами. В таком шаблоне кода каждый «случай» представляет собой узел, который содержит краевой тест (ы) и может назначить новое значение переменной для переключения на новый узел («случай»), если любой из краевых тестов является истинным. </p>

<p> Упрощение дизайна: если вы не планируете останавливать двигатель, вам не нужно «отказываться» от «Cycle Switch». </p>

<p> Вот почему: Значение «Cycle Switch» изменяется от push-to-start до push-to-stop, если вы хотите остановить двигатель между двумя стоп-переключателями. Если вам нужно только запустить двигатель после того, как любой из переключателей остановки закрыт, то количество раз, когда откаты «Циклический выключатель» отскакивает, не имеет значения, если отскоки не продолжаются дольше, чем требуется для достижения двигателем противоположный выключатель остановки. </p></body></html>

ответил st2000 1 FebruaryEurope/MoscowbThu, 01 Feb 2018 16:18:30 +0300000000pmThu, 01 Feb 2018 16:18:30 +030018 2018, 16:18:30
1

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

Вы также можете использовать несколько ортогональных statemachines и смешать их. Например, 1, чтобы контролировать, нужно ли вообще управлять двигателем, и один, чтобы контролировать, в каком направлении он приводится. Таким образом, часть управления двигателем будет выглядеть следующим образом:

if(motorDriven) {
    if(motorDirection = TOP) {
        driveMotorCW();
    } else {
        driveMotorCCW();
    }
} else {
    stopMotor();
}

Тогда управление конечным автоматом является простым. Если нажат конечный выключатель, измените направление вращения двигателя на противоположное (и, возможно, остановите двигатель).

Для синхронизации вы должны сохранить отметку времени начала интервала, а затем проверить, есть ли millis() - timestamp > interval. Для интервалов менее месяца это будет достаточно прилично (запрет дрейфа). Для интервалов, больших, чем вы должны инвестировать во внешние часы.

ответил ratchet freak 1 FebruaryEurope/MoscowbThu, 01 Feb 2018 16:43:19 +0300000000pmThu, 01 Feb 2018 16:43:19 +030018 2018, 16:43:19

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132