Вывод на 1 В вместо ожидаемых 5 В, не связанный с аппаратным обеспечением
Привет всем!
Я работаю над проектом, в котором мне нужно отправить сигнал, если я обнаружу вакуум. Я посылаю сигнал на PIN 9, но вскоре понял , что получаю только 1 В.
Думал, что переключаюсь между сигналом и отсутствием сигнала, но журнал предоставил мне постоянные и непротиворечивые значения.
Затем я начал сомневаться в своей плате, поэтому всегда выводил 10-й PIN-код. При той же нагрузке, что и PIN 9 (я переключаю кабель, соединяющий PIN 9 с цепью, с PIN 10 в цепь), я получаю хорошие 5В. Таким образом, я исключаю любые проблемы с загрузкой.
Что касается проблемы с выводом PIN-кода, вы все видите, что она не отсутствует.
Моя последняя гипотеза заключается в том, что с моим кодом связано какое-то колдовство, которого я не знаю и не могу найти в Интернете...
Есть идеи, что может происходить?
// Константа
const int BL1 = 9;// BINARY LED 1 pin
const int TEST = 10;// BINARY LED 1 pin
const int AP = A0;// вывод АНАЛОГОВЫЙ ПРЕССОСТАТ
const int P = 85;//значение ДАВЛЕНИЯ ТРИГГЕРА
// Переменные
int LS1 = LOW; // СОСТОЯНИЕ СИД 1
float RPV = 1; // Необработанное напряжение прессостата (0-1024)
float PV = 1; // Напряжение прессостата (В)
float PDP = 20; // Выведенное прессостатом давление (кПа)
// Инициализация пинов при запуске
void setup() {
pinMode(AP, INPUT); // Вывод АНАЛОГОВОГО ПРЕССОСТАТА установлен как ВХОД
pinMode(BL1, OUTPUT);// BINARY LED 1 контакт установлен как OUTPUT
pinMode(TEST, OUTPUT);// BINARY LED 1 контакт установлен как OUTPUT
pinMode(LED_BUILTIN, OUTPUT);// вывод LED_BUILTIN установлен как ВЫХОД
Serial.begin(9600);
}
void loop() {
digitalWrite(TEST, HIGH);
RPV = analogRead(AP);
PV = (RPV/1024)*5;
PDP = (-1)*(PV-1)*(-101/4);
Serial.print("Pression: ");
Serial.print(PDP);
if ( PDP > P ){
int LS1 = HIGH; // СОСТОЯНИЕ СИД 1
digitalWrite(BL1, HIGH);
digitalWrite(LED_BUILTIN, HIGH);
Serial.print(" | LED: 1");
}
else {
int LS1 = LOW; // СОСТОЯНИЕ СИД 1
digitalWrite(BL1, LOW);
digitalWrite(LED_BUILTIN, LOW);
Serial.print(" | LED: 0");
}
digitalWrite(BL1, LS1);
Serial.print(" | Trigger: ");
Serial.println(P);
}
@O'Schell, 👍0
Обсуждение2 ответа
Лучший ответ:
Вот рабочий скрипт (я вернулся к выводу PWM, если это вообще имеет значение)
void loop() {
...// несвязанный код
if (PDP > P) {
LS1 = HIGH; // Светодиод 1 ВЫСОКИЙ
digitalWrite(BL1, LS1);
digitalWrite(LED_BUILTIN, LS1);
Serial.print(LS1);
}
else {
LS1 = LOW; // СОСТОЯНИЕ СИД 1
digitalWrite(BL1, LS1);
digitalWrite(LED_BUILTIN, LS1);
Serial.print(LS1);
}
...// еще несвязанный код
}
Я немного уменьшу
void loop() {
// ... не имеет значения
if ( PDP > P ){
int LS1 = HIGH; // скрывает глобальную переменную (создает локальную переменную, которая не будет существовать после })
digitalWrite(BL1, HIGH);
} else {
int LS1 = LOW; // снова затеняет глобальную переменную
digitalWrite(BL1, LOW);
}
digitalWrite(BL1, LS1); // LS1 все еще НИЗКИЙ
}
Загадка разгадана
Да, локальные переменные не сохраняются за пределами своей области {}, поэтому глобальная переменная с тем же именем остается неизменной вне этих областей. Это может показаться ШИМ, потому что внутренние переменные могут переключать контакт., @Dave X
О боже, как я это не понял?! Спасибо за поучительный ответ! Вот почему даже мой собственный ответ (который должен был измениться на вывод без ШИМ) оказался неработающим..., @O'Schell
- Выводы прерываний Arduino Mega 2560 и отображение портов с помощью поворотного энкодера
- Измерение скорости двигателя постоянного тока с помощью поворотного энкодера
- Сообщение об ошибке: "exit status 1 expected initializer before 'void'."
- SPI с преобразователем уровня на другом конце соединения
- Выход 3,3 В при установке вывода на высокий уровень
- Arduino Mega TIMER1 интервал в одну секунду
- Serial — отправляет данные в Arduino, пока Arduino отправляет данные
- Почему этот код не воспроизводит преобразованный заголовочный файл wav2c через Arduino на мой динамик?
Какое устройство подключено к выходному контакту? Сколько тока он потребляет от контакта?, @chrisl
Как измеряете напряжение на 9 контакте? Цифровой мультиметр будет иметь тенденцию интегрировать и давать вам среднее значение, так что, скажем, 5 вольт при рабочем цикле 20% будут измеряться как 1 вольт. С другой стороны, осциллограф покажет истинное напряжение для полной формы сигнала., @6v6gt
@ 6v6gt Это то, что я (думаю, я) исключил во втором абзаце. Из-за размера всего проекта (это лишь малая его часть) я не могу использовать осциллограф..., @O'Schell
Я не знаю, но штифт «всегда включен» может его удерживать ... Так что проблема не в этом., @O'Schell
@ 6v6gt ОБНОВЛЕНИЕ: я нашел осциллограф, который могу использовать, я сообщу вам как можно скорее. В любом случае, как с моим кодом я могу отправить ВЫСОКИЙ сигнал 20% цикла?, @O'Schell
Происходит 20% за цикл: как это происходит?!, @O'Schell
Объявления локальных переменных. См. ответ @kiiv: https://arduinoprosto.ru/q/93195/6628., @Dave X
добавьте задержку (999) в цикл и перепроверьте свой мультиметр, возможно, это не тот устойчивый ВЫСОКИЙ уровень, который вы ожидаете., @dandavis