Не изменяется скорость коллекторных моторов

Тема в разделе "Arduino & Shields", создана пользователем ProHacker, 21 дек 2017.

?

Где ошибка?

  1. Ошибка в программе

    100,0%
  2. Баги робота

    0 голосов
    0,0%
  1. ProHacker

    ProHacker Нуб

    Доброго времени суток, уважаемые робототехники!
    Требуется регулировать скорости 2 моторов, имея направление движения от -100 до 100. Вот код:
    Код (C++):

    void setup() {
      for (int p = 4; p < 8; p++) { pinMode(p, OUTPUT); }  //объявляем пины MotorShield
      digitalWrite(7, HIGH);  //левый мотор вперед
      digitalWrite(4, LOW);  //правый мотор вперед
      int t = 100;  //направление робота
      analogWrite(6, 112.5 + 2.55 * t);  //левый мотор скорость = средн. скорость + шаг * направление
      analogWrite(5, 112.5 - 2.55 * t);  //правый мотор скорость = средн. скорость + шаг * направление
      delay(5000);  //ожидание
      analogWrite(6, 0);  // выкл. левый мотор
      analogWrite(5, 0);  //выкл. правый мотор
    }

    void loop() {}
    Но моторы вращаются с одинаковой скоростью!
    Помогите, пожалуйста.
    Заранее благодарю.
     
  2. vasdor

    vasdor Нерд

    То есть, в середине
    Код (C++):
    analogWrite(6, 367.5);
    analogWrite(5, -142.5);
    Это именно то, что вы хотите там видеть?
     
  3. vasdor

    vasdor Нерд

    Возможно, ардуино воспринимает только 1-ю часть выражения и ставит скорость 112.5
    Я бы попробовал сделать переменные speed_1 и speed_2 и использовал их
    Кроме того,
    http://arduino.ru/Reference/AnalogWrite
    эти значения должны быть между 0 и 255
     
    ProHacker нравится это.
  4. brokly

    brokly Гик

    Она воспринимает именно усеченную часть от вычисленного, например при значении 367,5 в подпрограмму уйдет 111 :)
    Весь смысл автоматической кастрации:
    1. 367.5 -> (uint16 DEC) 367 -> (uint16 HEX) 0x16F -> (uint8 HEX) 0x6F -> (uint8 DEC) 111
    2. -142,5 -> (uint16 DEC) 65394-> (uint16 HEX) 0xFF72 -> (uint8 HEX) 0x72 -> (uint8 DEC) 114

    Так что крутятся моторы все же с разной скоростью ;)

    Причем, никакого обратного вращения быть не может. В вашем случае нужно менять полярность. Как это делать программно и схемотехнически - отдельный вопрос. Ищите тут http://forum.amperka.ru/threads/h-мост.2610/

    Поэтому вот это analogWrite(6, 112.5+2.55* t), при изменении t от 0 до 100
    должно быть максимум analogWrite(6, 2.55* t)
     
    Последнее редактирование: 22 дек 2017
    Kamikadze и DIYMan нравится это.
  5. ProHacker

    ProHacker Нуб

    Спасибо за информацию! Буду исправлять.