digitalWrite дает разные выходные напряжения между программами

Я использую Arduino Uno R3 для включения нескольких светодиодов в ответ на управление компьютером. Я написал две программы: первую, чтобы попробовать объектно-ориентированный стиль, а вторую, чтобы разбить код на более управляемые фрагменты. Оба они выполняют одну и ту же функцию, включая один светодиод, затем выключая и повторяя это для другого светодиода. Я бы также поставил конденсаторы на 100 мкФ между анодом и землей каждого светодиода для эффекта затухания. При работе с первым скетчем это работает нормально, но я заметил, что со вторым скетчем затухание больше не работает, и светодиоды стали намного ярче. Аппаратное обеспечение между скетчами не менялось, и возврат к любому из них ничего не меняет. При проверке с помощью мультиметра обнаруживается большая разница в выходном напряжении (1,6 В -> 5,2 В) между программами. Пробовал менять пины, эффекта нет. Это код или я пропустил что-то очевидное с оборудованием?

Программа 1

#include "Arduino.h"
// создаем класс сигнала
class two_aspect_signal {
  //сохраняем номера пинов
  const int danger_aspect;
  const int clear_aspect;

  public:
    two_aspect_signal(int danger_pin, int clear_pin):
      danger_aspect(danger_pin),
      clear_aspect(clear_pin)
    {}
    void setup(){
      // устанавливаем для вывода
      pinMode(danger_aspect,OUTPUT);
      pinMode(clear_aspect,OUTPUT);
    }

    void danger(){
      // включаем красный свет, зеленый свет выключаем
      digitalWrite(danger_aspect,HIGH);
      digitalWrite(clear_aspect,LOW);
    }

    void cleaR(){
      //выключить красный свет, включить зеленый свет
      digitalWrite(danger_aspect,LOW);
      digitalWrite(clear_aspect,HIGH);
    }
};
//создаем сигнальный объект
two_aspect_signal sig(7,8);
void setup() {
}
void loop() {
  // включаем красный свет, зеленый выключаем
  sig.danger();
  delay(2000);
  // включаем зеленый свет, красный свет выключаем
  sig.cleaR();
  delay(2000);
}

Программа 2

#include "sig2.h"
//создаем сигнальный объект
two_aspect sig(7,8);
void setup(){}
void loop() {
  // включить красный свет, выключить зеленый
  sig.danger();
  delay(2000);
  // включить зеленый, выключить красный
  sig.cleaR();
  delay(2000);
}

Программа 2 (sig2.cpp)

#include "Arduino.h"
#include "sig2.h"

two_aspect::two_aspect(int clear_pin, int danger_pin)
{
  //устанавливаем выводы для вывода и сохранения
  pinMode(danger_pin,OUTPUT);
  pinMode(clear_pin,OUTPUT);
  _danger_pin = danger_pin;
  _clear_pin = clear_pin;
}

void two_aspect::danger()
{
  // включаем красный свет, зеленый выключаем
  digitalWrite(_danger_pin,HIGH);
  digitalWrite(_clear_pin,LOW);
}
void two_aspect::cleaR()
{
  // включаем зеленый светодиод, красный выключаем
  digitalWrite(_danger_pin,LOW);
  digitalWrite(_clear_pin,HIGH);
}

Программа 2 (sig2.h)

#ifndef sig2_h
#define sig2_h

#include "Arduino.h"

class two_aspect
{
  public:
    two_aspect(int clear_pin, int danger_pin);
    void danger();
    void cleaR();
  private:
    int _clear_pin;
    int _danger_pin;
};

#endif

Пожалуйста, дайте мне знать, если это должно было быть на форуме электроники, спасибо за чтение.

, 👍0


1 ответ


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

0

Разница в том, что в вашем первом скетче вы никогда не вызываете two_aspect_signal.setup(), поэтому выводы никогда не устанавливаются в качестве выходных данных. По умолчанию контакты настроены как входы. Выполнение digitalWrite(), когда контакт настроен как вход, включает или отключает внутренний подтягивающий резистор этого контакта.

Итак, в вашем первом скетче вы питаете светодиоды через внутренний подтягивающий резистор (если я правильно помню, около 10 кОм). Поэтому они довольно тусклые. Также требуется некоторое время для зарядки конденсатора через большой подтягивающий резистор.

Во втором скетче вы настраиваете контакты как выходные данные. Таким образом, светодиоды теперь будут активно управляться через выходной драйвер контактов. Он может обеспечить гораздо больший ток, чем подтягивающий резистор, поэтому светодиоды светятся ярче. И больший ток также может заряжать конденсатор за меньшее время (время настолько маленькое, что вы его даже не видите). Таким образом, вы не видите никакого затухания (затухание есть, но слишком быстрое для ваших глаз).

Что нужно знать? Конечно, вы можете просто использовать подтягивающий резистор (и не настраивать контакты как выходные). Или вы можете настроить контакты как выходы и добавить токоограничивающий резистор между контактом и связкой светодиод/конденсатор. С вашим вторым скетчом и схемой тока вы рискуете повредить выходные драйверы этого вывода (из-за тока светодиода и из-за высокого пускового тока, пока конденсатор не зарядится). Размер этого резистора зависит от ваших потребностей. Убедитесь, что ток никогда не превышает 20 мА (устойчивый максимальный ток на контакте) (для 5 В это будет R = U / I = 5 В / 20 мА = 250 Ом в качестве минимального сопротивления). Чем выше сопротивление, тем тусклее будет светодиод и тем дольше будет заряжаться конденсатор. После этого вы также можете изменить емкость. Чем выше емкость, тем больше времени потребуется для его зарядки (поэтому эффект затухания дольше).

,

Благодарю вас! Я поставил резистор 1k перед землей и подумал, что этого будет достаточно, теперь я поставил резисторы 10k на выходы, и он отлично работает., @MCR