заставить сервопривод оставаться в текущей позиции, когда вызывается attach()

Я использую небольшой сервопривод SG90 с Arduino. Когда я вызываю attach(), сервопривод перемещается в положение по умолчанию или то, что я установил с помощью write() перед ним.

Я хочу, чтобы сервопривод оставался в текущем положении, когда я вызываю attach() в setup().

Как этого добиться?

Я считаю, что могу просто сохранить последнюю позицию в EEPROM. Это немного поможет. Однако боюсь, что EEPROM долго не протянет.

, 👍0

Обсуждение

Зачем вам вызывать attach() снова и снова?, @G-aura-V


1 ответ


1

Вы не можете прочитать положение сервопривода, поэтому ваш скетч не имеет возможности узнать реальное текущее положение.

И вы обнаружили, что вам нужно установить начальное значение "драйвера" сервопривода на то, которое ваш скетч считает последним известным положением сервопривода.

Итак, ваша проблема сводится к следующим вопросам: "Как сохранить значение во время отключения питания?" Это приводит к общему решению сохранения значения в EEPROM. Это известное и широко распространенное решение, но вы уже столкнулись с проблемой: "Как можно сохранить значение в EEPROM, не перенапрягая его?"

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

Некоторые идеи, как «стать лучше»:

  • Уменьшите норму сохранения. Я вижу как минимум два фактора: Частота обновления импульса управления сервоприводом составляет всего 50 Гц. И сервопривод будет перемещаться между (крайними) положениями всего несколько раз в секунду. В зависимости от приложения может не потребоваться сохранение чаще одного раза в секунду или даже медленнее.
  • Не сохранять, если значение не изменилось. Ну это надо делать уже на уровне драйвера EEPROM. Не помешает прочитать его документацию и/или исходный код.
  • Используйте как можно больший массив для хранения значения. Вы сохраните маркер для «недействительного» во всех ячейках, кроме одной, и только эта ячейка содержит реальное значение. Это поместит «нагрузку» в две записи на одно сохранение в EEPROM, но распределение по более чем двум ячейкам снизит среднюю нагрузку. Если вы выберете значение, состоящее из всех единиц, как «недействительное», оно фактически будет таким же, как стертое значение EEPROM, которое в любом случае необходимо в следующий раз.
  • Добавьте схему, которая обнаруживает потерю питания до того, как ЦП остановится. Это наиболее часто используемое решение, но его можно использовать только тогда, когда аппаратное обеспечение может это сделать. Вам нужно всего несколько миллисекунд, чтобы сохранить значение, посмотрите документацию. Если вы реализуете ISR, который перехватывает предстоящую потерю мощности, сохраните значение и дождитесь окончания.
,