Прохождение полного напряжения через транзисторы

Здравствуйте! Я пытаюсь создать контроллер вентилятора на Arduino. Вентиляторы (светодиоды-заглушки) работают от постоянного тока напряжением 12 В и силой тока 0,23 А, поэтому у меня есть внешний источник питания. Я планирую управлять этим током с помощью n-p-n-транзисторов.

Но прежде чем собрать его, я запускаю его в симуляторе. И у меня возникла проблема: иногда напряжение питания не проходит через транзисторы, а иногда они подключены параллельно, и напряжение на всех трёх падает до 4,12 В.

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

Tinkercad Design

TechDrawingOne

TechDrawingTwo

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

    //#include <DHT.h>
    //#include <DHT_U.h>
    //#include <Adafruit_Sensor.h>
    #include <Wire.h>
    #include <LiquidCrystal_I2C.h>
    LiquidCrystal_I2C lcd(0x27, 16, 2); 

    //#define DHTPIN A0     
    //#define DHTTYPE DHT11   
    //DHT dht(DHTPIN, DHTTYPE);

    unsigned long time = 0;      
    unsigned long debounce = 200UL;


    float(value);
    int Temp = 0;
    int tmp = A0;
    
    int fan1State = 0;
    int fan2State = 0;
    int fan3State = 0;
    int fansOn = 0;

    int fanOne = 5;
    int fanTwo = 6;
    int fanThree = 7;
    int bF1 = 2;        
    int bF2 = 3;
    int bF3 = 4;

    int oldbFState1;
    int oldbFState2;
    int oldbFState3;

    int bFState1;
    int bFState2;
    int bFState3;

    int bCount = 0;

    int dispA = 13;
    int dispB = 12;
    int dispC = 10;
    int dispD = 9;
    int dispE = 8;
    int dispG = 11;

    void setup(){

      pinMode(dispA, OUTPUT);
      pinMode(dispB, OUTPUT);
      pinMode(dispC, OUTPUT);
      pinMode(dispD, OUTPUT);
      pinMode(dispE, OUTPUT);
      pinMode(dispG, OUTPUT);

      pinMode(tmp, INPUT);
      pinMode(fanOne, OUTPUT);
      pinMode(fanTwo, OUTPUT);
      pinMode(fanThree, OUTPUT);
      pinMode(bF1, INPUT_PULLUP);
      pinMode(bF2, INPUT_PULLUP);
      pinMode(bF3, INPUT_PULLUP);

      Serial.begin(9600);

      lcd.begin(16,2);
      lcd.init();
      lcd.backlight();
      lcd.setCursor(0,0);
      lcd.print("Hello World.");
      delay(2000);
      lcd.setCursor(0,1);
      lcd.print("Boot Done.");
    }

    void loop(){


      //Temp = (analogRead(tmp)*(3300/1024));
      //lcd.setCursor(0,0);
      //lcd.print("Temperature: ");
      //lcd.print(Temp);

        // SEVEN SEGMENT DISPLAY.

      if (bCount >= 0) {

        if (bCount == 1) {
          digitalWrite(dispA, LOW);
          digitalWrite(dispB, HIGH);
          digitalWrite(dispC, HIGH);
          digitalWrite(dispD, LOW);
          digitalWrite(dispE, LOW);
          digitalWrite(dispG, LOW);
        }
        if (bCount == 2) {
          digitalWrite(dispA, HIGH);
          digitalWrite(dispB, HIGH);
          digitalWrite(dispC, LOW);
          digitalWrite(dispD, HIGH);
          digitalWrite(dispE, HIGH);
          digitalWrite(dispG, HIGH);
        }
        if (bCount == 3) {
          digitalWrite(dispA, HIGH);
          digitalWrite(dispB, HIGH);
          digitalWrite(dispC, HIGH);
          digitalWrite(dispD, HIGH);
          digitalWrite(dispE, LOW);
          digitalWrite(dispG, HIGH);
        }
        else {
          digitalWrite(dispA, LOW);
          digitalWrite(dispB, LOW);
          digitalWrite(dispC, LOW);
          digitalWrite(dispD, LOW);
          digitalWrite(dispE, LOW);
          digitalWrite(dispG, LOW);
        }
      }
        // FAN CONTROL CODE LIES BELOW  

      int bFState1 = digitalRead(bF1);
      int bFState2 = digitalRead(bF2);
      int bFState3 = digitalRead(bF3);

      // Ehaust Fan 1

      if (bFState1 == HIGH && oldbFState1 == LOW) {

        if (fan1State == 0) {
          digitalWrite(fanOne, HIGH);
          Serial.println("B1 ON");
          lcd.clear();
          lcd.setCursor(0,0);
          lcd.print("Ehaust Fan On.");
          fan1State = 1;
          bCount = (bCount + 1);
          delay(1000);
          lcd.clear();

        } else {
          digitalWrite(fanOne, LOW);
          Serial.println("B1 OFF");
          lcd.clear();
          lcd.setCursor(0,0);
          lcd.print("Ehaust Fan Off.");
          fan1State = 0;
          bCount = (bCount - 1);
          delay(1000);
          lcd.clear();

        }
      }

      oldbFState1 = bFState1;

      // Intake Fan 2

      if (bFState2 == HIGH && oldbFState2 == LOW) {

        if (fan2State == 0) {
          digitalWrite(fanTwo, HIGH);
          Serial.println("B2 ON");
          lcd.clear();
          lcd.setCursor(0,0);
          lcd.print("Intake Fan 1 On.");
          fan2State = 1;
          bCount = (bCount + 1);
          delay(1000);
          lcd.clear();

        } else {
          digitalWrite(fanTwo, LOW);
          Serial.println("B2 OFF");
          lcd.clear();
          lcd.setCursor(0,0);
          lcd.print("Intake Fan 1 Off.");
          fan2State = 0;
          bCount = (bCount - 1);
          delay(1000);
          lcd.clear();

        }
      }

      oldbFState2 = bFState2;

      // Intake Fan 3

      if (bFState3 == HIGH && oldbFState3 == LOW) {

        if (fan3State == 0) {
          digitalWrite(fanThree, HIGH);
          Serial.println("B3 ON");
          lcd.clear();
          lcd.setCursor(0,0);
          lcd.print("Intake Fan 2 On.");
          fan3State = 1;
          bCount = (bCount + 1);
          delay(1000);
          lcd.clear();

        } else {
          digitalWrite(fanThree, LOW);
          Serial.println("B3 OFF");
          lcd.clear();
          lcd.setCursor(0,0);
          lcd.print("Intake Fan 2 Off.");
          fan3State = 0;
                  bCount = (bCount - 1);
          delay(1000);
          lcd.clear();

        }
      }

      oldbFState3 = bFState3;
    }

, 👍-1

Обсуждение

Почему заземление питания вентилятора подключено к выводу 3,3 В платы Arduino? Должен ли он быть заземлен? Кроме того, обычно используются резисторы для светодиодов семисегментного индикатора (и, технически, для светодиодов-заглушек) и соответствующий резистор у основания транзистора, чтобы предотвратить повреждение компонентов из-за слишком большого тока., @chrisl

Что именно означает «иногда»? Случайным образом между отдельными прогонами моделирования? И что вы подразумеваете под параллельными и последовательными в данном случае?, @chrisl

Ну, заземляющий кабель туда не должен был идти. Это была ошибка. Но обе платы должны иметь общую землю, иначе база транзистора, похоже, не принимает входной сигнал. Да, в перерывах между симуляциями иногда просто не работает блок питания., @Ironshi

Светодиоды не подходят для использования в качестве заглушек для вентиляторов. Они ведут себя совершенно иначе. Для транзисторов необходимы базовые резисторы, чтобы не перегружать выводы GPIO платы Arduino, а вентиляторы (если они реализованы) должны быть оснащены обратными диодами, поскольку они являются индуктивной нагрузкой., @StarCat

На данный момент я полагаю, что транзисторы включены параллельно, поскольку напряжение на эмиттере составляет всего около 4 В. А чтобы вентиляторы вращались с приличной скоростью и перемещали воздух, мне нужны все 12 В на выходе блока питания., @Ironshi

Так? [Обновленный TransistorBoard](https://media.discordapp.net/attachments/853066378642718760/1309485255329054730/image.png?ex=6741c0ad&is=67406f2d&hm=34e69060718f72c3400c0eed5725c50a3720f35cf4e4e3689e57a84f5d9f3258&=&format=webp&quality=lossless&width=363&height=350), @Ironshi

Кроме того, нагрузку (светодиоды/вентиляторы) следует размещать на «высокой стороне», т.е. не между эмиттером и землей, а между P1+ (шина питания 12 В) и эмиттером., @StarCat

Следуя рекомендациям, я заменил светодиоды для двигателей постоянного тока. Наверное, стоило сделать это с самого начала, но я просто не подумал, что светодиоды не очень хорошо подходят в качестве замены. Спасибо. Блок питания не работал между симуляциями, возможно, это просто баг в TinkerCad, поскольку сейчас всё вроде бы нормально. Однако двигатели по-прежнему работают параллельно и получают только 3–4 В, что не обеспечивает им нормального вращения., @Ironshi

[Tinkercad_Screenshot](https://media.discordapp.net/attachments/853066378642718760/1309491274843422751/image.png?ex=6741c649&is=674074c9&hm=3ae38803476517371762b389f49323e317d6e6b673fb60cb30beca517e8e7f26&=&format=webp&quality=lossless&width=1102&height=676) [Технические_чертежи_двигателей](https://media.discordapp.net/attachments/853066378642718760/1309491308049469590/image.png?ex=6741c651&is=674074d1&hm=8c6e39596d08797528f5b4735b69ed05f180b6541c3d89a1fc484355c17e21e0&=&format=webp&quality=lossless&width=877&height=676), @Ironshi

Здесь слишком много всего. Уберите всё, что не относится к вашей текущей проблеме (ЖК-дисплей, семисегментный дисплей, кнопки), и оставьте только один мотор. Как только всё будет работать надёжно, можно будет добавить недостающее., @Edgar Bonet


1 ответ


0

Вот как управлять индуктивной нагрузкой с помощью Arduino и NPN транзистор:

< img src="https://i.sstatic.net/HiGa8uOy.png" alt="схема" />

Обратите внимание на общее заземление, резистор на базе транзистор, диод обратного хода и тот факт, что транзистор установлен как переключатель на стороне низкого напряжения.

,

Спасибо за эту схему. Я сделал отдельную схему с одним мотором, следуя ей, и она работала безупречно., @Ironshi

Однако когда я добавляю другие двигатели, напряжение падает практически до нуля, что означает, что одновременно может работать только один вентилятор., @Ironshi

Является ли решением этой проблемы только более мощный источник питания и регуляторы напряжения или этого можно добиться с помощью сложной проводки?, @Ironshi

@Ironshi: Таким образом, вы сможете управлять любым количеством двигателей. Если напряжение питания падает, это значит, что вы превышаете мощность блока питания. Или, может быть, это лабораторный блок питания, и вы настроили его так, чтобы он не превышал заданный максимальный ток., @Edgar Bonet

Я вижу, что это могут быть ограничения электропитания программ. Спасибо за помощь ., @Ironshi