Проблема с считыванием напряжения в 10-канальном тестере емкости батареи на базе Arduino mega
Я хочу сделать 10-канальный тестер емкости батареи на основе Arduino mega, используя резисторы 4,7 Ом 10 Вт, управляющие ими с помощью полевых МОП-транзисторов IRFZ44n с уважаемыми цифровыми выводами. Батарея на 8,4 В питает Arduino (не рассматривайте понижающий преобразователь на картинке). Я отлаживаю свой проект шаг за шагом. Когда я считываю напряжение отдельных батарей с помощью соответствующих аналоговых контактов, не включая «выводы MOSFET-Gate», тогда Arduino правильно измеряет напряжения, но когда я включаю выводы затвора, Arduino измеряет напряжение неправильно. Значение, если я подключаюсь батарея с аналоговым выводом и мультиметр одновременно, и значение почти такое же. Например, 3,70 В для мультиметра и 3,72 для аналогового вывода, но когда я включаю затвор MOSFET, значение Arduino равно 3,07 В, а значение мультиметра - 3,48 В. Заранее спасибо.
Вот принципиальная схема моего проекта:
Простая версия для понимания:
Код:
long readVcc() {
// Чтение ссылки 1,1 В относительно AVcc
// установить ссылку на Vcc и измерение на внутреннюю ссылку 1,1 В
#if defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
ADMUX = _BV(REFS0) | _BV(MUX4) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
#elif defined (__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__)
ADMUX = _BV(MUX5) | _BV(MUX0) ;
#else
ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
#endif
ADCSRB &= ~_BV(MUX5);
delay(2); // Подождите, пока Vref установится
ADCSRA |= _BV(ADSC); // Начать преобразование
while (bit_is_set(ADCSRA,ADSC)); // измерение
uint8_t low = ADCL; // сначала нужно прочитать ADCL - затем он блокирует ADCH
uint8_t high = ADCH; // разблокирует оба
long result = (high<<8) | low;
result = 1125300L / result; // Рассчитать Vcc (в мВ) ; 1125300 = 1,1*1023*1000//1126400L внутреннееRefVolt(1,1) * 1023 * 1000; код может быть более точным, вычислив internalRefVolt (1.1)
return result; // Vcc в милливольтах
}
void setup() {
Serial.begin(115200);
delay(3000);
pinMode(22,OUTPUT);//***Контакты затвора Mosfet********
pinMode(23,OUTPUT);
pinMode(24,OUTPUT);
pinMode(25,OUTPUT);
pinMode(26,OUTPUT);
pinMode(27,OUTPUT);
pinMode(28,OUTPUT);
pinMode(29,OUTPUT);
pinMode(30,OUTPUT);
pinMode(31,OUTPUT);
digitalWrite(22,LOW);//***Изначально низкий уровень на выводах затвора Mosfet********
digitalWrite(23,LOW);
digitalWrite(24,LOW);
digitalWrite(25,LOW);
digitalWrite(26,LOW);
digitalWrite(27,LOW);
digitalWrite(28,LOW);
digitalWrite(29,LOW);
digitalWrite(30,LOW);
digitalWrite(31,LOW);
}
/**********************************Void Loop******************************************************/
void loop() {
float voltRef = readVcc() / 1000.0;
digitalWrite(22,HIGH);//*** Высокий уровень на выводах затвора Mosfet********
digitalWrite(23,HIGH);
digitalWrite(24,HIGH);
digitalWrite(25,HIGH);
digitalWrite(26,HIGH);
digitalWrite(27,HIGH);
digitalWrite(28,HIGH);
digitalWrite(29,HIGH);
digitalWrite(30,HIGH);
digitalWrite(31,HIGH);
float volt0 = analogRead(A0)*(voltRef/1024);
delay(10);
volt0 = analogRead(A0)*(voltRef/1024);
/* if(volt0>3.0){
digitalWrite(22,HIGH); // Высокий = МОП-транзистор ВКЛ.
digitalWrite(36,HIGH); // Высокий = светодиод выключен
}*/
float volt1 = analogRead(A1)*(voltRef/1024);
delay(10);
volt1 = analogRead(A1)*(voltRef/1024);
float volt2 = analogRead(A2)*(voltRef/1024);
delay(10);
volt2 = analogRead(A2)*(voltRef/1024);
float volt3 = analogRead(A3)*(voltRef/1024);
delay(10);
volt3 = analogRead(A3)*(voltRef/1024);
float volt4 = analogRead(A4)*(voltRef/1024);
delay(10);
volt4 = analogRead(A4)*(voltRef/1024);
float volt5 = analogRead(A5)*(voltRef/1024);
delay(10);
volt5 = analogRead(A5)*(voltRef/1024);
float volt6 = analogRead(A6)*(voltRef/1024);
delay(10);
volt6 = analogRead(A6)*(voltRef/1024);
float volt7 = analogRead(A7)*(voltRef/1024);
delay(10);
volt7 = analogRead(A7)*(voltRef/1024);
float volt8 = analogRead(A8)*(voltRef/1024);
delay(10);
volt8 = analogRead(A8)*(voltRef/1024);
float volt9 = analogRead(A9)*(4.95/1024);
delay(10);
volt9 = analogRead(A9)*(4.95/1024);
//*************************************************** *******************************
Serial.print("B0= ");
Serial.println(volt0);
Serial.print("B1= ");
Serial.println(volt1);
Serial.print("B2= ");
Serial.println(volt2);
Serial.print("B3= ");
Serial.println(volt3);
Serial.print("B4= ");
Serial.println(volt4);
Serial.print("B5= ");
Serial.println(volt5);
Serial.print("B6= ");
Serial.println(volt6);
Serial.print("B7= ");
Serial.println(volt7);
Serial.print("B8= ");
Serial.println(volt8);
Serial.print("B9= ");
Serial.println(volt9);
Serial.println("");
Serial.println("==========================");
delay(500);
}
@Faizur Rahman, 👍2
Обсуждение2 ответа
Лучший ответ:
Основная проблема заключалась в проводе держателя батареи по умолчанию, эти провода имели высокое сопротивление. После замены этих проводов проблема решилась. Всем спасибо
Электрические провода имеют сопротивление. Большую часть времени это сопротивление можно игнорировать, но это не всегда так. В частности, если по проводу протекает большой ток, падение напряжения на нем может быть значительным.
Рассмотрите эту схему:
По красным проводам течет большой ток, и напряжение на них значительно падает. Черные провода почти не пропускают ток и являются равнопотенциальными. Оба вольтметра слева будут измерять одинаковое напряжение, на которое влияют перепады напряжения на АВ и на DE. Вольтметр справа измеряет более низкое напряжение, поскольку на него также влияют перепады вдоль BC и EF.
В вашем эксперименте проблема усугубляется тем фактом, что по заземляющему проводу проходит ток от всех батарей. Поэтому он является причиной большей части падения напряжения, с которым вы сталкиваетесь.
Вывод заключается в том, что вы должны убедиться, что точки соединения между токоведущими проводами и измерительными проводами (точки B и E для вольтметров слева) находятся как можно ближе к аккумулятору. В противном случае ваше измерение будет необъективным.
Люблю тебя мужчина!! Я работаю над этим проектом в течение 5-6 дней, чтобы выяснить проблему, я думал, что у меня проблема с кодом, поэтому я попытался упростить свой код, чтобы выяснить, откуда именно возникла проблема, но пока не получил никакого решения. Но на самом деле Ты учишь меня тому, чего я никогда не знала. Большое спасибо, брат. Ралли оценили., @Faizur Rahman
Я решаю проблему. Но теперь проблема заключается в том, что когда я подключаю высокий цифровой выходной контакт Arduino для включения MOSFET-GatePin, напряжение на цифровом контакте Arduino падает с 5 В до 3 В на GatePin. Эти вещи происходят с 7MOSFET и другими 3, работающими отлично. Я поменял мосфет и резистор подтягивания, но безрезультатно., @Faizur Rahman
- Можно ли прочитать несколько кнопок с помощью CD74HC4067?
- Проблемы с мультиплексором SPI Arduino
- Мультиплексор кодирования для 64 ИК-датчиков
- Как получить более 16 аналоговых входов на Arduino Mega для использования 24 пьезодатчиков
- Как разделить входящую строку?
- Как использовать SPI на Arduino?
- Как сбросить или отформатировать Arduino?
- Управление скоростью вентилятора с помощью библиотеки Arduino PID
Какова цель резистора и МОП-транзистора? Зачем тебе это? Когда вы включаете МОП-транзистор, более 500 мА потечет через резистор на землю, конечно, напряжение вашей батареи упадет!, @hcheung
@hc Heung : для оценки емкости батареи напряжение под нагрузкой часто более важно, чем напряжение ненагруженной батареи., @Edgar Bonet
Я сделаю тестер емкости батареи, поэтому разрядите ток батареи с помощью резистора и измерьте емкость., @Faizur Rahman
Да, я согласен с вами, но если я измеряю напряжение с помощью мультиметра и аналогового контакта Arduino одновременно в условиях недогрузки, почему значение так сильно отличается. Пример: показания Arduino = 3,07 В и показания мультиметра = 3,48 В одновременно., @Faizur Rahman
Куда подключали минусовой щуп мультиметра? К минусовой клемме аккумулятора или к земле Arduino?, @Edgar Bonet
Ух ты! все время я использовал отрицательный щуп мультиметра с отрицательной клеммой батареи, но теперь я проверил с заземлением Arduino, и это дает мне точное значение. Мой вопрос: отрицательная клемма батареи закорочена на Arduino GND, но почему этот другой результат выходит ?, @Faizur Rahman