Arduino вкл/выкл ШИМ

pwm

Когда я включаю двигатель постоянного тока с помощью кнопки, я получаю фиксированное значение ШИМ, которое переходит в цикл до тех пор, пока состояние кнопки не изменится.

Что я должен изменить, чтобы я мог изменить значение X с помощью потенциометра в цикле?

int X = A0;
int SW = 2;
int Xval=5;
int SWval;
int buttonNew;
int buttonOld = 1;
int buttonState= 1;
int engine = 6;


void setup() { // This executes once
  Serial.begin(9600);
  pinMode(X, INPUT);
  pinMode(SW, INPUT_PULLUP);
}


void loop() { // This loops continuously
  Xval = analogRead(X);
  buttonNew = digitalRead(SW);

  if (buttonOld == 0 && buttonNew == 1) {
    if (buttonState == 0) {
      analogWrite(engine, Xval);
      buttonState = 1;
    }
    else {
      digitalWrite(engine, LOW);
      buttonState = 0;
    }
  }

  buttonOld = buttonNew;
  delay(1);
  Serial.print("button");
  Serial.print(SWval);
  Serial.print("          X=");
  Serial.println(Xval);        
}

, 👍1


1 ответ


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

1

Переместите аналоговую запись из кода изменения состояния кнопки, и она будет обновлять ШИМ постоянно, а не только при нажатии кнопки.

См. Код ниже.

Я также меняю имя переменной buttonState на motorState, так как оно указывает на состояние двигателя (Вкл/Выкл). И я перевернул его, так что 1 означает, что двигатель ВКЛЮЧЕН.

Еще одна вещь, которую я сделал,-это увеличил задержку до 10 мс, так что у вас не возникнет никаких проблем с переключением-отскоком.

int X = A0;
int SW = 2;
int Xval=5;
int SWval;
int buttonNew;
int buttonOld = 1;
int motorState= 0;//указывает, включен ли двигатель / выключен
int engine = 6;


void setup() { // Выполняется один раз
  Serial.begin(9600);
  pinMode(X, INPUT);
  pinMode(SW, INPUT_PULLUP);
}


void loop() { // Выполняется постоянно
  buttonNew = digitalRead(SW);
  if (buttonOld == 0 && buttonNew == 1) {
    if (motorState == 0) {
      motorState = 1;
    }
    else {
      motorState = 0;
    }
  }
  buttonOld = buttonNew;

  if (motorState == 1) {
    Xval = analogRead(X);
    analogWrite(engine, Xval);
  }
  else {
    digitalWrite(engine, LOW);
  }

  delay(10);
  Serial.print("button");
  Serial.print(SWval);
  Serial.print("          X=");
  Serial.println(Xval);        
}
,