Проблема с считыванием напряжения в 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);
}

, 👍2

Обсуждение

Какова цель резистора и МОП-транзистора? Зачем тебе это? Когда вы включаете МОП-транзистор, более 500 мА потечет через резистор на землю, конечно, напряжение вашей батареи упадет!, @hcheung

@hc Heung : для оценки емкости батареи напряжение под нагрузкой часто более важно, чем напряжение ненагруженной батареи., @Edgar Bonet

Я сделаю тестер емкости батареи, поэтому разрядите ток батареи с помощью резистора и измерьте емкость., @Faizur Rahman

Да, я согласен с вами, но если я измеряю напряжение с помощью мультиметра и аналогового контакта Arduino одновременно в условиях недогрузки, почему значение так сильно отличается. Пример: показания Arduino = 3,07 В и показания мультиметра = 3,48 В одновременно., @Faizur Rahman

Куда подключали минусовой щуп мультиметра? К минусовой клемме аккумулятора или к земле Arduino?, @Edgar Bonet

Ух ты! все время я использовал отрицательный щуп мультиметра с отрицательной клеммой батареи, но теперь я проверил с заземлением Arduino, и это дает мне точное значение. Мой вопрос: отрицательная клемма батареи закорочена на Arduino GND, но почему этот другой результат выходит ?, @Faizur Rahman


2 ответа


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

0

Основная проблема заключалась в проводе держателя батареи по умолчанию, эти провода имели высокое сопротивление. После замены этих проводов проблема решилась. Всем спасибо

,

2

Электрические провода имеют сопротивление. Большую часть времени это сопротивление можно игнорировать, но это не всегда так. В частности, если по проводу протекает большой ток, падение напряжения на нем может быть значительным.

Рассмотрите эту схему:

схема

По красным проводам течет большой ток, и напряжение на них значительно падает. Черные провода почти не пропускают ток и являются равнопотенциальными. Оба вольтметра слева будут измерять одинаковое напряжение, на которое влияют перепады напряжения на АВ и на DE. Вольтметр справа измеряет более низкое напряжение, поскольку на него также влияют перепады вдоль BC и EF.

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

Вывод заключается в том, что вы должны убедиться, что точки соединения между токоведущими проводами и измерительными проводами (точки B и E для вольтметров слева) находятся как можно ближе к аккумулятору. В противном случае ваше измерение будет необъективным.

,

Люблю тебя мужчина!! Я работаю над этим проектом в течение 5-6 дней, чтобы выяснить проблему, я думал, что у меня проблема с кодом, поэтому я попытался упростить свой код, чтобы выяснить, откуда именно возникла проблема, но пока не получил никакого решения. Но на самом деле Ты учишь меня тому, чего я никогда не знала. Большое спасибо, брат. Ралли оценили., @Faizur Rahman

Я решаю проблему. Но теперь проблема заключается в том, что когда я подключаю высокий цифровой выходной контакт Arduino для включения MOSFET-GatePin, напряжение на цифровом контакте Arduino падает с 5 В до 3 В на GatePin. Эти вещи происходят с 7MOSFET и другими 3, работающими отлично. Я поменял мосфет и резистор подтягивания, но безрезультатно., @Faizur Rahman