код и фактический результат не совпадали
Я хочу сделать материал, вывод которого записывается из аналогового чтения, но когда 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);}}
@john caren, 👍1
Обсуждение2 ответа
Проблема, как я вижу, существует в операторах if else. Вы используете несколько операторов else if, но в конце вы должны завершить их оператором else. Используйте «if/else if», если вам нужно выбрать один из нескольких вариантов или ни один из них. Вы могли бы написать приведенную выше программу, используя отдельные операторы if, такие как показано ниже, но подход if/else if является более чистым и лучшим, указывает на то, что программа должна выбрать либо один из вариантов, либо ни один из них. Вот как ты это делаешь Если (){}.... Иначе, если (){}..... Иначе, если(){} ...... Еще{} здесь это может помочь вам ввести здесь описание ссылки
спасибо, сэр, я попробую, @john caren
Вы написали:
когда я симулирую это в протеусе, это кажется не тем, что я имею в виду
Прикрепленная картинка не очень понятна, но мне кажется, что это так. делает именно то, что вы просили: выход ШИМ, который переключается между двумя разные выходные контакты. Программа должна работать как положено, только несколько предостережений. Позвольте мне прокомментировать это более подробно:
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 не будет соответствовать. Вы, вероятно
имел в виду
else if (hasil <= 30)
но, как следует из ответа пользователя 11249082, лучше всего использовать простой else
способ убедиться, что вы охватили все возможные случаи.
очень краткое объяснение, сэр, но я до сих пор не знаю, как сделать выход таким же, как аналоговый вход, не хотите ли вы научить меня, как это сделать?, @john caren
@johncaren: Исправьте проблемы, которые я вам показал, а затем повторите попытку., @Edgar Bonet
- Ускорение двигателя постоянного тока с помощью ШИМ
- Проблема с увеличением ШИМ с течением времени
- Проблема при попытке ограничить скорость двигателя определенным числом оборотов в минуту с помощью модуля триггерного переключателя MOSFET
- Установите частоту ШИМ на 25 кГц.
- Какова частота PWM-выхода на Arduino
- Управление скоростью вентилятора с помощью библиотеки Arduino PID
- Как устранить шум от вентилятора 12 В с ШИМ-управлением на низкой скорости
- Генерация частоты ШИМ выше 125 кГц с помощью Arduino Uno
AnalogWrite запускает сигнал ШИМ. вы не даете ему работать и запускаете его снова и снова. поэтому вместо
|_|_|_
вы получите||||||
, @Jurajтак как же правильно использовать ШИМ, сэр @Juraj, @john caren
AnalogWrite запустит ШИМ-сигнал. а затем снова вызовите AnalogWrite, только если вы хотите изменить его или остановить., @Juraj
По «
bool en = false;
»: Да, мы выяснили, что имена ваших переменных не на английском языке, не нужно писать их явно., @Edgar Bonet