код и фактический результат не совпадали

Я хочу сделать материал, вывод которого записывается из аналогового чтения, но когда A3 == HIGH, используется выходной контакт 9, а когда A3 == LOW, используется выходной контакт 10, и когда я моделирую это в протеусе, кажется, что это не то же самое, что я имею в виду, что не так с кодом, пожалуйста, нужна ваша помощь.

  int hasil
  int reado;
  int z;
  int baca;
  bool en = false;
  void setup() {
  // поместите сюда свой код установки для однократного запуска:

  TCCR1A = 0b00100010;
  TCCR1B = 0b00011001;
  TCCR0A = 0; TCCR0B = 0;
  ICR1 = 100000;//отключаем функцию миллис, задержки и микросекунд
  //отключаем функцию миллис, задержки и микросекунд

   // поместите сюда свой код установки для однократного запуска:
  Serial.begin(115200);
  pinMode(A2, INPUT); pinMode(A3, INPUT);
  pinMode(9,OUTPUT); pinMode(10,OUTPUT);
  }

  void loop() {
  // поместите сюда свой основной код для многократного запуска:

 hasil = analogRead(A2);
 baca = digitalRead(A3);
 for (z=0; z<=hasil; z++)
 reado = map (hasil, 0, 255, 0, ICR1);
 if (hasil > 30 && baca == HIGH)
 {analogWrite(9,hasil); analogWrite(10,0);}
 else if (hasil >30 && baca == LOW)
 {analogWrite(9,0); analogWrite(10,hasil);}
 else if (hasil<30)
 {analogWrite(9, 0);
 analogWrite(10, 0);}}

, 👍1

Обсуждение

AnalogWrite запускает сигнал ШИМ. вы не даете ему работать и запускаете его снова и снова. поэтому вместо |_|_|_ вы получите ||||||, @Juraj

так как же правильно использовать ШИМ, сэр @Juraj, @john caren

AnalogWrite запустит ШИМ-сигнал. а затем снова вызовите AnalogWrite, только если вы хотите изменить его или остановить., @Juraj

По «bool en = false;»: Да, мы выяснили, что имена ваших переменных не на английском языке, не нужно писать их явно., @Edgar Bonet


2 ответа


0

Проблема, как я вижу, существует в операторах if else. Вы используете несколько операторов else if, но в конце вы должны завершить их оператором else. Используйте «if/else if», если вам нужно выбрать один из нескольких вариантов или ни один из них. Вы могли бы написать приведенную выше программу, используя отдельные операторы if, такие как показано ниже, но подход if/else if является более чистым и лучшим, указывает на то, что программа должна выбрать либо один из вариантов, либо ни один из них. Вот как ты это делаешь Если (){}.... Иначе, если (){}..... Иначе, если(){} ...... Еще{} здесь это может помочь вам ввести здесь описание ссылки

,

спасибо, сэр, я попробую, @john caren


1

Вы написали:

когда я симулирую это в протеусе, это кажется не тем, что я имею в виду

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

ICR1 = 100000;

Здесь вы устанавливаете для ICR1 значение 34464 (т.е. 100000 по модулю 216). Вероятно, вы не это имеете в виду...

Serial.begin(115200);

Нет смысла инициализировать последовательный интерфейс, если вы не собираюсь использовать его.

for (z = 0; z <= hasil; z++)
    reado = map(hasil, 0, 255, 0, ICR1);

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

analogWrite(9, hasil);

Здесь вы устанавливаете рабочий цикл на некоторое число от 31 до 1023. Учитывая, что максимальное значение таймера равно 34464, фактический рабочий цикл всегда будет меньше 3%. Вот почему это похоже на серия узких пиков на виртуальной области видимости.

Но, возможно, на самом деле вы имели в виду следующее:

reado = map(hasil, 0, 1023, 0, ICR1); // note: 1023, not 255
analogWrite(9, reado);

Я бы не рекомендовал использовать analogWrite() с нестандартной вершиной значение счетчика. В analogWrite() обрабатывается особый случай, когда: если аргумент окажется 255, вместо этого вы получите digitalWrite(pin, HIGH). Скорее всего, это не то, что вам нужно. Сейчас что вы начали управлять таймером с помощью прямого доступа к вводу-выводу, вам следует продолжайте в том же духе.

else if (hasil < 30)

Обдумывали ли вы, что должна делать программа, если hasil окажется ровно 30? Ни один из случаев if/else не будет соответствовать. Вы, вероятно имел в виду

< pre class="lang-c++ Prettyprint-override">else if (hasil <= 30)

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

,

очень краткое объяснение, сэр, но я до сих пор не знаю, как сделать выход таким же, как аналоговый вход, не хотите ли вы научить меня, как это сделать?, @john caren

@johncaren: Исправьте проблемы, которые я вам показал, а затем повторите попытку., @Edgar Bonet