Inhaltsverzeichnis

RC-Glied Batterie Spannungs Messung

Wichtig zu wissen, das ganze geht nur wegen der Vernachlässigung von Vc1! Diese Methode ist relativ ungenau, bietet aber einen groben Überblick ob eine Batterie fast leer ist.

Formeln

Schaltplan

Die 3.3V Spannungsquelle soll die „Referenzspannung“ der I/Os angeben. Im Falle des RaspberryPis ist das 3.3V. Im Falle eines 5V Arduinos 5V. Diese Spannungsquelle ist die Betriebsspannung des CPUs.

Code - Arduino

sketch.ino
#include <Arduino.h>
 
void setup() {
    // put your setup code here, to run once:
    Serial.begin(115200);
}
const int rcpin = 2;
const float vih_voltage = 2.85;
const float capacity = 100 * pow(10, -9);
const float resistor = 100000;
const int dischargeDelay = 200;
 
float meassureVoltage(){
  //Pin auf Low setzen zum entladen des Kondensators
  pinMode(2, OUTPUT);
  digitalWrite(rcpin, LOW);
  delay(dischargeDelay); //Warten bis Kondensator leer
  long startMicros = micros(); //Startzeit festlegen
  pinMode(2, INPUT); //Pin auf Input legen um zu detektieren wann Pin High
  while(!digitalRead(rcpin)){ //Warte solange Pin nicht High
 
  }
  long endMicros = micros(); //Neue Zeit speichern
  long finalMicros = endMicros - startMicros; //Dauer des Vorgangs berechnen
  //Serial.println(finalMicros);
 
  //Berechnen der Spannung
  float vbat = (vih_voltage * capacity * resistor) /((float)(finalMicros * pow(10, -6)));
  return vbat;
}
 
 
void loop() {
    Serial.println(meassureVoltage());
}

Code - Java RaspberryPi

RC_meassure.java
package rc_meassure;
 
import com.pi4j.io.gpio.GpioController;
import com.pi4j.io.gpio.GpioFactory;
import com.pi4j.io.gpio.GpioPinDigitalInput;
import com.pi4j.io.gpio.GpioPinDigitalOutput;
import com.pi4j.io.gpio.Pin;
import com.pi4j.io.gpio.PinState;
import com.pi4j.io.gpio.RaspiPin;
import static java.lang.Math.pow;
import java.util.concurrent.TimeUnit;
 
/**
 *
 * In einer echten Java Anwendung würde man das nicht so machen, das dient wirklich nur als Beispiel.
 */
public class RC_meassure {
 
    /**
     * @param args the command line arguments
     */
    static Pin rcPin = RaspiPin.GPIO_00;
    static final int r = 100000;
    static final float c = (float) (100 * pow(10, -9));
    /**
     * Vih = 0.625*Vdd
     * http://www.farnell.com/datasheets/1835725.pdf
     */
    static final float vih = (float) 2.976473;
    public static void main(String[] args) throws InterruptedException {
        GpioController gpio = GpioFactory.getInstance();
        gpio.unexportAll();
        final GpioPinDigitalOutput outPin = gpio.provisionDigitalOutputPin(rcPin);
        outPin.setShutdownOptions(true, PinState.LOW);
        outPin.low(); //Entlade Kondensator;
 
        TimeUnit.SECONDS.sleep(1);       
        //gpio.shutdown(); 
        gpio.unprovisionPin(outPin);
 
        long startTime = System.nanoTime();
        final GpioPinDigitalInput inPin = gpio.provisionDigitalInputPin(rcPin);
 
        while(inPin.isLow()){ //warte
 
        }
        long estimatedTime = System.nanoTime() - startTime;
        gpio.unprovisionPin(inPin);
        System.out.println(estimatedTime); 
        System.out.println("Voltage: " + meassureRCVoltage(estimatedTime, r, c, vih));
    }
    static float meassureRCVoltage(long t, float r, float c, float vih_voltage){
        float vbat = (vih_voltage * c * r) /((float)(t * pow(10, -9)));
        return vbat;
    }
}