ADC Int Div Error Issue

Hallo ich versuche einen gemessenen Wert in eine ADC Variable umzurechen.
Der Wert ist 450mA und wird per Seriell empfangen.
Die Betriebsspannung ist 3,3V = 3305mV.
Es handelt sich um einen 12-Bit ADC = 4096
Der Dazugehörige ADC Wert soll 558 sein.

int U_3_3V;                   //3305
int Akku_Strom_MW ; //450
float Akku_I_ADC;

Akku_I_ADC = (Akku_Strom_MW / (U_3_3V/ 4096));
//                      (450                         / (3305    / 4096)) = 558
Serial.println(Akku_I_ADC);       //-4.00

Es kommt komischerweise -4.00 raus.
Wenn ich das in einen Taschenrechner eingebe dann kommt 558 raus.
Wenn ich die Variable "Akku_I_ADC " auf "int" Stelle dann kommt -1 raus.

Wieso?

Wokwi simulation: https://wokwi.com/arduino/projects/299588224434569736

void setup() 
{
  Serial.begin( 9600);
  Serial.println( "------------------------------");
  Serial.println( "Mit int:");

  int U_3_3V = 3305;
  int Akku_Strom_MW = 450;
  float Akku_I_ADC;

  int intdiv = U_3_3V / 4096;
  Serial.print( "      U_3_3V / 4096 = ");
  Serial.println( intdiv);

  //  Akku_I_ADC = (Akku_Strom_MW / (U_3_3V / 4096));
  //  Akku_I_ADC = Akku_Strom_MW / 0;
  Serial.print( "      Akku_Strom_MW / 0 = ");
  Serial.println( "durch null teilen !");

  Serial.println( "------------------------------");

  Serial.println( "Mit float:");
  float Voltage = 3.305;
  float BatteryWatt = 0.450;
  float BatteryIADC = BatteryWatt / Voltage * 4096.0;
  Serial.print( "      ");
  Serial.println( BatteryIADC);

  Serial.println( "------------------------------");
}

void loop() 
{
}
1 Like

Hallo und guten morgen
Schaue dir die, für die Berechnung verwendeten, Variablen und die dazu gehörigen Datentypen an.
Q&DS: allen Variablen den Datentyp float zuweisen.

Akku_I_ADC = (Akku_Strom_MW / (U_3_3V/ 4096))

Drei Probleme:
Klammerrechnung vor Punktrechnung
Rechnen mit ganzen Zahlen
Wertebereich

(450 / (3305/4069))
als erstes: 3305/4096 = 0
Und weil INT auch ins negative gehen kann, Stichwort Wertebereich, kommt da für den Teil hinterm Komma der gerundete Wert -1 raus.

Wenn Du unbedingt float machen willst, musst Du auf der rechten Seite des Gleichheitszeichen auch mindestens mit dem ersten Rechenwert float rechnen.

Akku_I_ADC = (Akku_Strom_MW / (U_3_3V/ 4096.0))

Und dann bleibt noch die Frage, ob Deine Spannungen und Ströme negativ werden können.
Wenn nicht, mach daraus unsigned int.

Danke für die Antworten.

Das mit dem Simulator finde ich Mega. Hatte ich noch nicht gesehen.