Программирование сервопривода на ATtiny85

Плата: "ATtiny25/45/85"

Процессор: "ATtiny85"

Часы: "Внутренний 1 МГц"

Программатор: "Arduino как ISP"

Я хочу запустить сервопривод вперед и назад на ATtiny85. Библиотека сервоприводов не совместима с ATtiny85, поэтому мне пришлось писать код с нуля. В этот момент код, который заставляет сервопривод двигаться вперед (по часовой стрелке), является:

void setup() {
  pinMode(PB1, OUTPUT);
}

void loop() {
  digitalWrite(PB1, HIGH);
  delayMicroseconds(1000);
  // 1 миллисекунда определяет сервопривод, идущий вперед
  digitalWrite(PB1, LOW);
  delay(19);
}

И код, который заставляет сервопривод идти назад (против часовой стрелки), просто меняет количество микросекунд на:

delayMicroseconds(2000); 

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

void setup() {
  pinMode(PB1, OUTPUT);
}

void loop() {
  digitalWrite(PB1, HIGH);
  delayMicroseconds(1000);
  digitalWrite(PB1, LOW);
  delay(19);
  digitalWrite(PB1, HIGH);
  delayMicroseconds(2000);
  digitalWrite(PB1, LOW);
  delay(19);
}

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

, 👍2

Обсуждение

Вы пробовали использовать **8 МГц**?, @Allen Chak

@AllenChak да, я действительно пробовал это сделать, но это все равно не дает желаемого результата, потому что я хочу, чтобы сервопривод вращался вперед и назад подряд, а не отдельно., @Utsav

Попробуйте эту ссылку: https://forum.arduino.cc/index.php?topic=62912.msg459183#msg459183, @Allen Chak


1 ответ


Лучший ответ:

2

Сервопривод не может двигаться вперед и назад за 40 миллисекунд. Это будет больше похоже на дрожь между обоими.

Попробуйте сделать что-то вроде этого:

// продолжайте посылать 0 позиций примерно в течение 400 мс
for(int i = 0; i<20; ++i) {
  digitalWrite(PB1, HIGH);
  delayMicroseconds(1000);
  digitalWrite(PB1, LOW);
  delay(19);
}

// продолжайте посылать вторую позицию примерно в течение 400 мс
for(int i = 0; i<20; ++i) {
  digitalWrite(PB1, HIGH);
  delayMicroseconds(2000);
  digitalWrite(PB1, LOW);
  delay(18);
}
,

Привет, большое спасибо, это действительно помогло, и это тоже имеет смысл. У меня есть только один вопрос, что задержка(19) при изменении на задержку(20) сервопривод ведет себя по-другому. Почему эта задержка держится на уровне 19 миллисекунд, а не на чем-то другом? еще раз спасибо., @Utsav

Серво ожидает импульсов со скоростью 20 мс (= 50 Гц) , включая высокую боковую ширину импульса., @KIIV

В попытке найти базовый код для работы сервопривода это очень помогло. Спасибо!, @Devin Carpenter