Вывод на 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);

  }

, 👍0

Обсуждение

Какое устройство подключено к выходному контакту? Сколько тока он потребляет от контакта?, @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


2 ответа


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

0

Вот рабочий скрипт (я вернулся к выводу 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);
  }
  ...// еще несвязанный код
}
,

3

Я немного уменьшу

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