DC-DC преобразователь для детского электромобиля

CW - Clockwise (по часовой стрелке)
CCW - Counter Clockwise (против часовой стрелки)

1 лайк

Ааа, ну это да. У меня две микросхемы, так как два мотора.

я жеж вам приводил как надо правильно считать и подавать значение шим на моторы, на старом форуме тележка или танк на ардуино, скетч один человек как раз к такой машинке пристроил, там правда радиоуправление, но не суть, алгоритм расчета ШИМ посмотрите

1 лайк

Я тут не понимаю…)

Спойлер
 // а теперь управляем моторами и нормируем скорости
  // только если прошел цикл (Fpwm=490гц или 2мсек!)
  // управлять моторами чаще чем раз в 10мсек - бессмысленно..

  if ( millis() - prevTime >= period )
  {
    if (rc_data[1] >= 1481 && rc_data[1] <= 1519) {
      speedA = 0;
      speedB = 0;
    }
    if (rc_data[1] <= 1480 || rc_data[1] >= 1520) {
      if (rc_data[1] <= 1150 || rc_data[1] >= 1850) { // скорость при которой реакцию руля уменьшаем в два раза
        speedA = (long)fspeed +  ((lr * lr) / diff_lr * (lr >= 0 ? 1 : -1));
        speedB = (long)fspeed -  ((lr * lr) / diff_lr * (lr >= 0 ? 1 : -1));
      } else {
        speedA = (long)fspeed +  (lr * lr * (lr >= 0 ? 1 : -1));
        speedB = (long)fspeed -  (lr * lr * (lr >= 0 ? 1 : -1));

      }
    } // ход только при нажатии педали газа
    if ( speedA > 255    ) {
      speedA =  255;
    }
    if ( speedB > 255    ) {
      speedB =  255;
    }
    if ( speedA < -255   ) {
      speedA = -255;
    }
    if ( speedB < -255   ) {
      speedB = -255;
    }
    if ( abs(speedA) < minPwm ) {
      speedA = 0;  // мотор не тянет, нет смысла жечь батарейку..
    }
    if ( abs(speedB) < minPwm ) {
      speedB = 0;
    }

    if ( speedA > 0     ) {
      aForward();
      analogWrite(ena,  (int)speedA);
    }
    else if ( speedA < 0 ) {
      aBackward();
      analogWrite(ena, -(int)speedA);
    }
    else                {
      aStop();
    }

    if ( speedB > 0     ) {
      bForward();
      analogWrite(enb,  (int)speedB);
    }
    else if ( speedB < 0 ) {
      bBackward();
      analogWrite(enb, -(int)speedB);
    }
    else                {
      bStop();
    }

    prevTime = millis();

    //  Serial.println(speedA, DEC);
    //  Serial.println(speedB, DEC);
  }
}

Значит не просто увеличить частоту ШИМ

// Пины D9 и D10 - 7.8 кГц
TCCR1A = 0b00000001;  // 8bit
TCCR1B = 0b00001010;  // x8 fast pwm

Вы думаете я понимаю, написал и забыл, у нас ham это дело обычное )))

1 лайк

Может не увеличивать частоту нужно, а уменьшать?
Попробовали бы на простейшем скетче с delaymicroseconds , чтобы не страдать пока с таймерами.

M=100;
N=M/10;
while(1) {
delay(N);
ВКЛ;
delay(M);
ВЫКЛ;
}

И поподбирать M до исчезновения писка (потенциометром м.б.)

2 лайка

Спасибо. Сегодня попробую.

Так и должно быть, не подавайте 0-50.
Т.е. всё что меньше 50 равно 0.

от 0 до 255 надо расти по квадратичному закону, тогда более-менее прилично отрабатывает

uint16_t M;
uint16_t N ;

void setup() {
  Serial.begin(9600);
}

void loop() {
  M = analogRead(0);
  Serial.println(M);
  N = M / 10;
  delayMicroseconds (N);
  digitalWrite(3,  1);
  delayMicroseconds(M);
  digitalWrite(3,  0);
}

Отследить число M в порту не могу, при использовании Serial.println(M) мотор пищит во всём диапазоне и не крутится.

uint16_t M = 30;
Примерно с 30 начинает крутиться на холостом ходу.

Ну так выводите в монитор не каждый раз, а, скажем, один раз на 1000.

Вобщем, у вас цель - понять при каком периоде (M+N) мотор пищит, а при каком уже нет. И каков тренд - на увеличение частоты или уменьшение. 9600 на 115200 поменяйте - меньше будет задержка.

У меня на шаговом было определённое значение PPS, когда он в резонанс входил и пердеть начинал. Пришлось выяснить экспериментально и проскакивать при регулировании.

uint16_t M;
uint16_t N;

void setup() {
  Serial.begin(115200);
  pinMode(3, OUTPUT);
}

void loop() {
  M = analogRead(0);
 Serial.println(M);
  N = M / 10;
  delayMicroseconds (N);
  digitalWrite(3,  1);
  delayMicroseconds(M);
  digitalWrite(3,  0);
}

До 100 пищит и не крутится, далее крутится, но писк всё равно слышен.

Одинаково пищит или изменяется? Тренд каков?

При увеличении M писк становится громче, после 100 такое ощущение что писк не меняется.

Ну, видать, несовместим с шим мотор… Или побольше взять период, чтобы выйти из зоны на 1023. Отмасштабировать через map, например.

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

Второй вход перемычкой к земле притянут.

1 лайк

Ну тогда всё нормально, видимо тут я протупил )))

Тогда скорее всего драйвер высокие частоты ШИМ не поддерживает, без проблемные они дорогие однако

Попробую на другом моторе. Спасибо.