Gelöst: Fragen zu ADCManager

paddy

Active member
Hallo zusammen,

für meinen neuen Mäher (Hoverboard + ROS) benötige ich eine Art Base controller, welcher das Batteriemanagement, Perimeter und den Mähmotor übernimmt. Dazu habe ich die bisherige Schaltung für Batterie und Ladungsmanagement auf einer eigenen, kleinen Platine untergebracht. Gesteuert wird dies mittels Arduino Nano.

Vorlage für die Software ist der Azurit Code, Perimeter, ADCManager wurden 1:1 übernommen, Batteriemanagement Funktionen entsprechend heraus kopiert. Perimeter liefert gute Werte, die Batteriespannung weicht aber unfassbar stark ab. So recht erklären kann ich es mir nicht, vielleicht kann mir da jemand weiterhelfen.

Die Batterie ist ein 10S2P, also maximal 42V, aktuell hat sie 40,4V

Als Spannungsteiler verwende ich 150K+10K Widerstände, was bei maximaler Ladung einen Prüfwert von ~ 2,65V ergibt (die Idee war, hier auch mit 3,3V MCUs arbeiten zu können)

Als batFactor wird 0,78 errechnet. Die Funktion VoltageDividerUGes liefert 16 zurück, was nach meinem Verständnis korrekt ist. ADC2Voltage liefert 0,00488V für einen ADC Wert von 1.
Code:
 batFactor = voltageDividerUges(150, 10, 1.0) * ADCMan.ADC2voltage(1) * 10; // ADC to battery voltage factor *10

Das berechnen der Spannung erfolgt wie beim Azurit Code. Zum debuggen habe ich ein paar Ausgaben in die Konsole geschrieben mit diesem Ergebnis:
Code:
void Battery::check_battery_voltage()
{
  // convert to double
  int batADC =  ADCMan.read(pinBatteryVoltage);
  double batvolt = ((double)batADC) * batFactor;


   // low-pass filter
    double accel = 0.01;
    //double accel = 1.0;
    if (abs(batVoltage - batvolt) > 5)
     batVoltage = batvolt;
    else
     batVoltage = (1.0 - accel) * batVoltage + accel * batvolt;


}

batADC127
batFactor0,78
UGes bei 1V (voltageDividerUGes(1))16
ADC2voltage(1)0,004887
Batteriespannung laut Arduino99,32V
tatsächliche Spannung40,4V
Spannung am Pin A3 (hier ist die Batterie angeschlossen)2,52V

Die vorherige ADC Kalibrierung liefert dieses Ergebnis:
Code:
13:43:44.324 -> ADC calibration...
13:43:44.792 -> ADC calibration ch0=0
13:43:45.308 -> ADC calibration ch4=127
13:43:45.777 -> ADC calibration ch5=127
13:43:45.777 -> ---ADC calib---
13:43:45.824 -> ADC sampleRate=38462
13:43:45.824 -> AD0    min=0    max=0    diff=0    ofs=0
13:43:45.824 -> AD1    min=5    max=5    diff=0    ofs=0
13:43:45.824 -> AD2    min=0    max=0    diff=0    ofs=0
13:43:45.824 -> AD3    min=127    max=127    diff=0    ofs=0
13:43:45.824 -> AD4    min=127    max=127    diff=0    ofs=127
13:43:45.824 -> AD5    min=127    max=127    diff=0    ofs=127
13:43:45.824 -> AD6    min=0    max=0    diff=0    ofs=0
13:43:45.824 -> AD7    min=0    max=0    diff=0    ofs=0

Mich wundert, dass der ADC Manger immer 127 als Messwert zurück liefert. Der Messbereich ist nach meinem Verständnis 1023 bei 5V, sollte also irgendwo um 516 liegen, statt bei 127.
Wo steckt denn hier mein Denkfehler?


EDIT: Ich habe eine andere Batterie mit aktuell 38,2V Spannung angeschlossen. Auch in diesem Fall liefert der Code 99,32V bzw. 127 als ADC Wert

Grüße Patrick
 
Zuletzt bearbeitet:
Ich habe den Fehler gefunden. Ausgangsbasis meiner Software war der Sketch PerimeterV2 aus dem Tests Ordner.
Die hier verfügbare ADCMan Klasse unterscheidet sich deutlich von der aus Azurit. Die Testklasse liest nur 8 Bit und der gelesene Wert wird zusätzlich auf max 127 begrenzt.
 
Hi .
I did not check this part of code but are you sure ADCMan is needed for the battery mesurement ?
You say 2.52 V at the arduino analog pin , so the value 127 return by the calibration is perfect (255/2)

AnalogRead on 8 bit return 0->255 , so
0 if 0V
255 if 5V
127 if 2.52V

It's better to directly use a 3.3V module (ESP32 / teensy or directly Rpi / jetson) to test the code because on analogread you can find some code working on the arduino nano and fail on other module or with less accuracy.
 
Hello Bernard,
It is necessary as analogRead is blocking function so the Arduino won't be able to act as Perimeter receiver. ADCMan is interrupt driven.

Battery Management with Jetson Nano or RaspberryPi is odd as it needs some time to boot and set pin to high. Also it will not monitor battery, if the process dies for some reason. Last but not least, the motor driver I use operates with 5V.
As Arduino is on Board for perimeter, it can be used for other tasks as well.

The reason it wasn't working was the Version I used. I tooked it from perimeter test Sketch and here it only use 8 Bit. Also the value gets limited to 127 by Code. I just changed to the Version used at Azurit and it worked like a charm.

Patrick
 
Oben