Измерение напряжения 3s 18650

navakasi

✩✩✩✩✩✩✩
20 Авг 2023
8
0
Народ, нужна помощь. Собираю устройство которое питается от аккумулятора с3 18650. Меряю на аналоговом выходе напряжение через делитель напряжения. При включении устройство все показывает правильно. Но в течении 2-3 минут показании батареи стремятся к 0, хотя напряжение измеряемое мультиметром не меняется. Serial port тоже показывает 0 значения. При перезагрузке снова показывает реальные значения. Еще при подключении зарядки к BMS плате значения начинают дико скакать и начинают ложно срабатывать кнопки ( хочу реализовать отображение процесса зарядки через дисплей ) как победить эти проблем?
 

rkit

★★★✩✩✩✩
5 Фев 2021
510
127
составить схему по правилам и разобраться в принципе работы bms
 

poty

★★★★★★✩
19 Фев 2020
3,265
950
@navakasi, @Геннадий П, дело говорит. Без дополнительных цепей заряжать аккумуляторы и питать от них устройство не получится.
Что касается неверных показаний при измерении - покажите код. И совсем непонятно, что может показать Serial порт в этом случае?
 

navakasi

✩✩✩✩✩✩✩
20 Авг 2023
8
0
@poty,
Подключение следующее - резистор 50кОм на + бмс платы, 10 кОм на минус БМС платы, выводы резисторов соедеены и подключены к аналоговому порту.
C++:
#include <Audio.h>
#include <Wire.h>
#include <SPI.h>
#include <SD.h>
#include <SerialFlash.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

//oled
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 32 // OLED display height, in pixels
#define OLED_RESET    -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
#define MOS_PIN 3

// Create the Audio components
AudioPlaySdWav      playWav;
AudioOutputI2S      audioOutput;
AudioAmplifier      amp1;  // Audio amplifier object for volume control
AudioAmplifier      amp2;  // You might need two if you have stereo output
AudioConnection     patchCord1(playWav, 0, amp1, 0);
AudioConnection     patchCord2(amp1, 0, audioOutput, 0);
AudioConnection     patchCord3(playWav, 1, amp2, 0);
AudioConnection     patchCord4(amp2, 0, audioOutput, 1);

int butt;
unsigned long myTime;
const int batteryPin = A0;
int flag;
int counter;
unsigned long Vsummary;
// int R1 = 1;
// int R2 = 5;
// const float 3sMaxV = 12.6;
// const float 3sMinV = 11.1;
// const float MAX_VOLTAGE = 4.2; // Maximum battery voltage
// const float MIN_VOLTAGE = 3.0; // Minimum battery voltage

void setup() {
  pinMode(MOS_PIN, OUTPUT);
    if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C))
    { // Address 0x3C for 128x32
        Serial.println(F("SSD1306 allocation failed"));
        for (;;)
            ; // Don't proceed, loop forever
    }
  display.display();
  delay(2000);  // Pause for 2 seconds

  display.setTextSize(2);      // Size of the text to be displayed
  display.setTextColor(SSD1306_WHITE);


  Serial.begin(9600);
  pinMode(PIND6, INPUT_PULLUP);   
  AudioMemory(8);  // allocate memory blocks for audio processing
 
  if (!SD.begin(10)) {  // SD card CS pin is 10
    Serial.println("SD Card initialization failed!");
    return;
  }

  // Set initial volume (0.1 = 10%)
  amp1.gain(0.9);
  amp2.gain(0.9);
  playWav.play("0001.wav");
}

void loop() {

  if (millis() - myTime > 100) {
    myTime = millis();
    if (counter <100)  {
      counter++;
      Vsummary = Vsummary + analogRead(batteryPin);
      //Serial.println(analogRead(batteryPin));
      //Serial.println(Vsummary);
      // Serial.println(counter);
      }
    if (counter == 100) {
      counter = 0;
      Serial.println(Vsummary);
      Serial.println(Vsummary/100);
      int percentage = map(Vsummary/100, 574, 656, 0, 100);
      percentage = constrain(percentage, 0, 100);  // Ensure percentage is between 0 and 100
      display.clearDisplay();
      display.setCursor(0,0);
      display.setTextSize(4);
      display.print(percentage);
      display.print("%");
      display.display();
      Serial.println(percentage);
      Serial.println("%");
      Vsummary =0;
    }

  }
  butt = digitalRead(PIND6);


  if (butt == 0 && flag == 0) {
    flag = 1;
    playWav.stop();
    Serial.println("button is pressed");
    Serial.println(butt);
    Serial.println(flag);
    playWav.play("0002.wav");
    digitalWrite(MOS_PIN, HIGH);
    }
if (butt == 1 && flag == 1) {
    flag = 0;
    digitalWrite(MOS_PIN, LOW);
    playWav.stop();
    Serial.println("button is relesed");
    Serial.println(butt);
    Serial.println(flag);
    playWav.play("0003.wav");
    delay(400);
    playWav.stop();
    playWav.play("0001.wav");
    
    }


}
 

poty

★★★★★★✩
19 Фев 2020
3,265
950
Получается, что входное напряжение делится на 6. С3 - это три аккумулятора, соединённые последовательно? Тогда минимальное напряжение батареи = 7,5В, максимальное - 12,6В, после делителя диапазон 1,25-2,1В. Вы "отлавливаете" значение от 574 до 656, скорее всего напряжение питания (или напряжение референса) процессора 3,3В (3,3*574/1024=1,84; 3,3*656/1024=2,1В). Меня несколько смущает нижний диапазон, но это Ваш выбор. В чём может быть проблема? Функция map принимает значения типа long (не unsigned long, как объявлена Vsummary), соответственно, если полученное входное значение Vsummary/100 меньше 574, то map вернёт отрицательное значение (map не включает constrain) и последующий constrain с границами 0-100 превратит его в 0. То есть все измеренные значения меньше 11,04В (а номинальное значение напряжения аккумулятора 3,6В, батареи - 10,8В), превращаются в 0.
 

navakasi

✩✩✩✩✩✩✩
20 Авг 2023
8
0
плата teensy 4 там больше 3.3 вольт нельзя. меня смущает то что перве несколько минут код работает. а потом именно плавно снижается отображаемй заряд, как будто батарея садиться, но это не так...
 

vortigont

★★★★★★✩
24 Апр 2020
1,022
543
Saint-Petersburg, Russia
Вы ведь мультиметром замеряете потенциал на пине А0 относительно земли платы, да? И там наблюдаете какое значение? Больше тайн нужно привносить, а то нам тут гадать скучно :)
 
  • Лойс +1
Реакции: poty

poty

★★★★★★✩
19 Фев 2020
3,265
950
@navakasi, так а значение-то какое? @vortigont прав насчёт тайн, можно и как-то поразвёрнутее отвечать, это сильно быстрее приблизит разгадку.
Кстати, нет никакой реакции у Вас и на нижнее значение 574, которое Вы считаете полным разрядом, хотя в пересчёте оно превышает номинальное напряжение батареи.
смущает то что перве несколько минут код работает
это нормальное поведение. На холостом ходу напряжение может быть выше номинального (и даже точно будет). При появлении нагрузки оно будет уменьшаться. Но Вы сглаживаете показания в интервале 10 секунд поэтому кажется, что напряжение падает постепенно.
 

vortigont

★★★★★★✩
24 Апр 2020
1,022
543
Saint-Petersburg, Russia
Относительно общей земли (- BMS )
по-моему такие темы надо или сносить или создать раздел "игра-данетка" где нужно угадать проблему автора основываясь на его ответах в стиле "да, нет, не знаю" :)
Причем тут BMS вообще... можно же воткнуть один шуп мультиметра на пин gnd, другой на пин А0, снять показания своими собственными глазами в течение 10 сек в вольтах и всё станет ясно, но нет... автор будет до упора смущаться что
перве несколько минут код работает
 

navakasi

✩✩✩✩✩✩✩
20 Авг 2023
8
0
@vortigont, так я же пишу,что мерил мультиметром , показания 1.98 вольт,и пишу как мерил, по сути разница нет куда я щуп втыкал , земля она и есть земля, показания не меняются. Капец конечно токсично тут
 

vortigont

★★★★★★✩
24 Апр 2020
1,022
543
Saint-Petersburg, Russia
пишу,что мерил мультиметром
нет, не пишете. Пишете что меряете, но где и какие значения не пишете - надо догадываться.

по сути разница нет куда я щуп втыкал... показания не меняются
об этом вы тоже не пишете.

Капец конечно токсично тут
ну а что делать если большинство сообщений в стиле "не работает", ни кода, ни схемы, ни методики измерений. Помочь тут никто не сможет, так хоть постебемся, иначе вам вообще никто не ответит.

Если на входе напряжение стабильное, значит проблема либо в коде либо в плате. Уберите свою мишуру из усредения и констрейна и тупо выводите в сериал абсолютное значение полученное из аналогрид с пина каждую секунду. Если получите предсказуемые стабильные значения, тогда уже будете усреднять. Если нет - ищите что там с АЦП на вашей плате (тип платы вы тоже, конечно же, "забыли" упомянуть в первом сообщении что бы всем здесь веселее было)