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



Не думаю, что мой код понадобится, но на всякий случай я приведу его ниже.
//#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;
}
@Ironshi, 👍-1
Обсуждение1 ответ
Вот как управлять индуктивной нагрузкой с помощью Arduino и NPN транзистор:
< img src="https://i.sstatic.net/HiGa8uOy.png" alt="схема" />
Обратите внимание на общее заземление, резистор на базе транзистор, диод обратного хода и тот факт, что транзистор установлен как переключатель на стороне низкого напряжения.
Спасибо за эту схему. Я сделал отдельную схему с одним мотором, следуя ей, и она работала безупречно., @Ironshi
Однако когда я добавляю другие двигатели, напряжение падает практически до нуля, что означает, что одновременно может работать только один вентилятор., @Ironshi
Является ли решением этой проблемы только более мощный источник питания и регуляторы напряжения или этого можно добиться с помощью сложной проводки?, @Ironshi
@Ironshi: Таким образом, вы сможете управлять любым количеством двигателей. Если напряжение питания падает, это значит, что вы превышаете мощность блока питания. Или, может быть, это лабораторный блок питания, и вы настроили его так, чтобы он не превышал заданный максимальный ток., @Edgar Bonet
Я вижу, что это могут быть ограничения электропитания программ. Спасибо за помощь ., @Ironshi
- Как использовать SPI на Arduino?
- Как решить проблему «avrdude: stk500_recv(): programmer is not responding»?
- Как создать несколько запущенных потоков?
- avrdude ser_open() can't set com-state
- Как подключиться к Arduino с помощью WiFi?
- Mac OSX Yosemite не отображает последовательные порты для Uno R3
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
Почему заземление питания вентилятора подключено к выводу 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