Медленно увеличивайте скорость с помощью ШИМ arduino

pwm

Я пытаюсь контролировать скорость двигателя постоянного тока с помощью ШИМ. Вот мой код до сих пор:

int motor = 9;        
int fadeValue = 5;

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

void loop() {
  for (int fadeValue = 5 ; fadeValue <= 245; fadeValue += 10) {
    analogWrite(motor, fadeValue);
    delay(100);
  if (fadeValue==245) {
    fadeValue=255;
    break;
  }
}

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

Заранее спасибо ребятам.

, 👍1

Обсуждение

Ваш код очень творческий. Нам не хватает части, где loop() называется..., @Vladimir Cravero

Я считаю, что компилятор Arduino абстрагирует основную() функцию. Функция loop() автоматически вызывается непрерывно. Кроме того, этот вопрос, вероятно, относится к Arduino SE., @Dan Laks

Вот вызов Arduino AVR Boards loop (): https://github.com/arduino/Arduino/blob/1.8.1/hardware/arduino/avr/cores/arduino/main.cpp#L46, @per1234


5 ответов


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

1

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

int fadeValue = 5;

void loop()
{
    if (fadeValue < 255)
    {
        if (fadeValue >= 245)
        {
            fadeValue = 255;
        }
        else
        {
            fadeValue++;
        }
        analogWrite(motor, fadeValue);
        delay(100); 
    }

    //Другой код здесь
}

Установив значение FadeValue на другое значение, затухание начнется снова с нового значения до максимального.

,

0

Однако цикл продолжает повторяться.

В этом весь смысл loop(). Если вы хотите, чтобы какой-то код запускался только один раз после запуска программы, поместите его в setup():

int motor = 9;
int fadeValue = 5;

void setup() {
  pinMode(motor, OUTPUT);

  for (int fadeValue = 5 ; fadeValue <= 245; fadeValue += 10) {
    analogWrite(motor, fadeValue);
    delay(100);
    if (fadeValue == 245)
    {
      fadeValue = 255;
      break;
    }
  }
}

void loop() {
}
,

Почему он съедает отступ моего кода после того, как я отправлю ответ? Досадно, что я не испытывал этого на других сайтах SE., @per1234

@zuzu -- вы должны указать все детали того, что вам нужно, в вопросе, чтобы избежать ненужных ответов..., @Wesley Lee


0

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

вы можете использовать счетчик циклов или счетчик времени, чтобы замедлить нарастание, не привязывая микроконтроллер, например:

  time_now = time(); //считайте текущее время. или millies()
  if (time_now < TIME_RAMPUP) { //все еще нужно увеличить его
    if (time_now > time_prev) { //нужно увеличить скорость двигателя
      time_prev+=TIME_INC;
      motor_dc+=PWM_STEP;  //возможно, вы захотите привязать постоянный ток здесь
      analogWrite(MOTOR_PIN, motor_dc); //увеличение постоянного тока
    }
  }
,

0

Если вы хотите, чтобы цикл void() выполнялся только один раз, и не хотите помещать свой код в setup() по какой-то странной причине, точно так же, как бесконечный цикл while в конце с задержкой внутри, как это:

void loop() 
{
  for (int fadeValue = 5 ; fadeValue <= 245; fadeValue += 10)
{
    analogWrite(motor, fadeValue);
    delay(100);
  if (fadeValue==245) 
{
    fadeValue=255;
    break;
  }

While(1)
    Delay(1000);

}
,

1

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

void loop() {
  if (fadeValue == 245) {
    fadeValue=255;
    analogWrite(motor, fadeValue);  // двигатель останется на самом высоком значении
    }
  else {
      for (int fadeValue = 5 ; fadeValue <= 245; fadeValue += 10) {
        analogWrite(motor, fadeValue);
        delay(100);
        }
  }
}

Итак, теперь цикл будет выполняться до тех пор, пока значение fadeValue == 245, и в этот момент цикл не перейдет в цикл for, потому что "если" в операторе if/else выполнено. Я на самом деле не уверен, сработает ли это, но это идея.

,

*Итак, теперь цикл будет выполняться до тех пор, пока значение fadeValue == 245* - нет, оно будет выполняться до тех пор, пока значение fadeValue **не станет больше** 245, что означает, что тест, равный 245 в начале "цикла", не будет выполнен., @Nick Gammon