Управление фототранзистором двигателя постоянного тока

Итак, у меня есть схема с фототранзистором, и я хочу преобразовать значение фототранзистора в сигнал ШИМ, который может управлять скоростью двигателя. Код, который я придумал, приведен ниже, однако он не работает. Что я сделал не так в своем коде? Я использую чип l293d.

int photoTran = A1;
int reading = 0;
int forward=2;
int backward=3;
int motorspeed=0;


void setup(){
  pinMode(photoTran,INPUT);
  Serial.begin(9600);
  pinMode (backward, OUTPUT);
  pinMode (forward, OUTPUT);
}

void loop(){
  lcd.setCursor(0,0);
  reading = analogRead(photoTran);
  lcd.print(reading);
  lcd.print("  ");
  delay(100);
{ 
  if (reading<30){
    digitalWrite(backward,HIGH);
    digitalWrite(forward,LOW);
    motorspeed = map(reading, 30, 1023, 0, 255);
    analogWrite(backward,motorspeed);
  }
  else {
    digitalWrite(backward,LOW);
    digitalWrite(forward,HIGH);
    motorspeed = map(reading, 30, 400, 0, 255);
    analogWrite(forward,motorspeed);
  }
  }
}

, 👍1

Обсуждение

Вам нужно быть немного более конкретным, чем это. Знаете ли вы, что фототранзистор работает сам по себе, как и драйвер двигателя? Кроме того, что не работает? Разве это не компилируется, не показывает правильное значение на ЖК-дисплее, не влияет на двигатель и т. Д.? В вашем коде я вижу "{" после вашей задержки (100), которую я не вижу в этой цели и почему внутри нее находятся операторы if/else. Я бы избавился от этого и проверил., @Braydon Burkhardt

Фототранзистор трудно откалибровать, и его лучше использовать в качестве переключателя (digitalRead), @DataFiddler


2 ответа


1

analogRead() возвращает целое число от 0 до 1023. Использование значений 30 и 400 в функции map(), а затем передача значения вне этого диапазона вызовет странные результаты. Вот набросок, иллюстрирующий мою точку зрения.

void setup(){

  Serial.begin(9600);

  // Печатает от -20 до 684
  for(int i = 0; i < 1024; i++){
    Serial.println(map(i, 30, 400, 0, 255));
  }
  Serial.println();

  // Печатает от -7 до 255
  for(int i = 0; i < 1024; i++){
    Serial.println(map(i, 30, 1023, 0, 255));
  }
  Serial.println();

  // Печатает от 0 до 255
  for(int i = 0; i < 1024; i++){
    Serial.println(map(i, 0, 1023, 0, 255));
  }
}

void loop(){}
,

1

Если вы используете l293d, вы должны управлять напряжением на его ENABLE PIN, а не на других INPUT PINS (l293d). Вот простой учебник по управлению двигателем с помощью L293d. здесь.

И @VE7JRO прав насчет функции map(), поскольку вы передаете значения, выходящие за пределы диапазона, пожалуйста, позаботьтесь и об этой части.

,