Hanna
Sourcecode Batteriemanagementsystem
Funktionen | Variablen
ad7997.h-Dateireferenz

Header für ADC AD7997, Definition der Register und Commands. Mehr ...

#include <stdint.h>
#include "twi_master_driver.h"
Include-Abhängigkeitsdiagramm für ad7997.h:
Dieser Graph zeigt, welche Datei direkt oder indirekt diese Datei enthält:

gehe zum Quellcode dieser Datei

Makrodefinitionen

TWI (I2C) Konfiguration
#define TWI_BAUDRATE   100000
 100 KHz Taktrate im I2C-Bus
 
#define TWI_BAUDSETTING   TWI_BAUD(F_CPU, TWI_BAUDRATE)
 
#define TWI_AD7997_MASTER_PORT   PORTC
 
#define AD7997_ADC2_I   0x22
 Adresse für ADC2 zur Strommessung.
 
#define AD7997_ADC1_V   0x21
 Adresse für ADC1 zur Spannungsmessung.
 
Configuration Register
#define AD7997_CONFIG_REG   0x02
 Registeradresse.
 
#define AD7997_CONFIG_MSB   0x0F
 0FF0: Alle 8 Kanäle enabled (Bit 11 - Bit 4 = 1)
 
#define AD7997_CONFIG_LSB   0xFB
 D3 FLTR (SDA/SDC = 1 an, default), D2 ALERT EN = 0, D1 BUSY/ALERT = 0, D0 BUSY/ALERT POLARITY = 0 (active low)
 
Result Register
#define AD7997_RESULT_REG   0x00
 Registeradresse.
 
#define AD7997_CHANNEL_FLT   0x70
 01110000, filtert den aktiven Kanal aus dem Result Register
 
#define AD7997_RESULT_FLT   0x3FF
 10bit ADC => 2 LSB sind immer 0. RESULT_REG >> 2, dann 10bit - Filter (0x3FF)
 
#define AD7997_READ_SEQUENCE   0x70
 Sequence of channels selected in the configuration register, Bits D11 to D4.
 
#define AD7997_SEQUENCE_RESULT   (AD7997_RESULT_REG | AD7997_READ_SEQUENCE)
 
#define AD7997_READ_SINGLE   0x80
 
#define AD7997_READ_SINGLE_V1   0x80
 
#define AD7997_READ_SINGLE_V2   0x90
 
#define AD7997_READ_SINGLE_V3   0xA0
 
#define AD7997_READ_SINGLE_V4   0xB0
 
#define AD7997_READ_SINGLE_V5   0xC0
 
#define AD7997_READ_SINGLE_V6   0xD0
 
#define AD7997_READ_SINGLE_V7   0xE0
 
#define AD7997_READ_SINGLE_V8   0xF0
 
Cycle Time Register
#define AD7997_CTIMER_REG   0x03
 
#define AD7997_CTIMER_bm   0x00
 Cycle Timer = 0x00 für Mode 1 (CONVST-PIN) und Mode 2.
 
#define AD7997_CONVST_CMD   0x00
 Command Bits bei Konversion via CONVST.
 
PIN für das Stromrichtungssignal, HIGH beim Entladen (negativ), LOW beim Laden (positiv)
#define I_SGN_1_1   PIN0_bm
 
#define I_SGN_1_2   PIN1_bm
 
#define I_SGN_1_3   PIN2_bm
 
#define I_SGN_1_4   PIN3_bm
 
#define I_SGN_2_1   PIN4_bm
 
#define I_SGN_2_2   PIN5_bm
 
#define I_SGN_2_3   PIN6_bm
 
#define I_SGN_2_4   PIN7_bm
 
CONVST PIN und Port
#define AD7997_ADC1_CONVST_PIN_bm   PIN4_bm
 
#define AD7997_ADC1_CONVST_PIN_CTRL   PIN4CTRL
 
#define AD7997_ADC1_CONVST_PORT   PORTE
 
Batterienummer und ADC Index stimmen nicht überein => Übersetzungsarray
#define BAT_NUMMER2CHANNEL_1_1   0
 
#define BAT_NUMMER2CHANNEL_1_2   2
 
#define BAT_NUMMER2CHANNEL_1_3   4
 
#define BAT_NUMMER2CHANNEL_1_4   6
 
#define BAT_NUMMER2CHANNEL_2_1   1
 
#define BAT_NUMMER2CHANNEL_2_2   3
 
#define BAT_NUMMER2CHANNEL_2_3   5
 
#define BAT_NUMMER2CHANNEL_2_4   7
 
Konstanten zur Spannungsberechnung
#define REF_VOLTAGE   3.213
 Referenzspannung für die ADC; In V7.1 5V, in V7.2 3,3V !
 
#define ADC_RES   1024.0
 10bit Auflösung des ADC
 
#define R_MESS   0.015
 Messwiderstand, 15mOhm.
 
#define SPANNUNGSTELER_1   2.613
 Faktor zur Umrechnung der Batteriespannung in Säule 1.
 
#define SPANNUNGSTELER_2   1.3
 Faktor zur Umrechnung der Batteriespannung in Säule 2.
 

Funktionen

void AD7997_CONVST_voltage_get_data (void)
 
float AD7997_current_calculate_value (uint16_t bit_code, uint8_t sensor_nummer)
 
void AD7997_current_get_data (void)
 Ermittelt die Stromstärke in den Batteriestromkreisen. Mehr ...
 
int AD7997_current_vorzeichen (uint8_t sensor_nummer)
 Ermittelt die Stromrichtung der abgefragten Batterie. Mehr ...
 
void AD7997_init (void)
 TWI (I2C) und ADC 1/2 werden initialisiert. Mehr ...
 
void AD7997_voltage_get_data (void)
 Ermittelt die Spannungen der Batterien. Mehr ...
 
void leerlauf_voltage_get_data (void)
 

Variablen

uint8_t bat_nummer2channel [8]
 
int16_t current []
 
TWI_Master_t twiAD7997
 
float voltage []
 

Ausführliche Beschreibung

Header für ADC AD7997, Definition der Register und Commands.

Autor
Hanna Burggraf
Datum
15.01.2016
            $Revision: 404 $
            $Date: 2016-03-29 13:03:35 +0200 (Tue, 29 Mar 2016) $

Definiert in Datei ad7997.h.

Dokumentation der Funktionen

void AD7997_current_get_data ( void  )

Ermittelt die Stromstärke in den Batteriestromkreisen.

Die TS1101 Bausteine geben die am Shunt-Widerstand gemessene Spannung um den Faktor 100 verstärkt als analoges Signal aus, das über den ADC2 gemessen wird.
Der ADC misst die Spannung in Bezug zu einer Referenzspannung und gibt einen 10bit digitalen Wert aus.

Achtung
Die Referenzspannung beträgt bei BMS V7.1 5V, bei BMS V7.2 3,3V !
  • Die Referenzspannung (5V oder 3,3V) wird durch die Auflösung 1024 geteilt.
  • Die eingelesenen Daten \( n_U\) werden mit diesem Wert multipliziert.
  • Das Ergebnis wird durch 100 geteilt, da der TS1101 die Spannung um den Faktor 100 verstärkt ausgibt.
  • \( I = \frac{ U }{ R }\) => zur Ermittlung der Stromstärke muss noch durch \( R = 0,015\, \Omega \) geteilt werden.
  • Umrechnung in mA *1000

    \[ U_I = \frac{ U_{REF} }{ 1024 } * n_U * \frac{ 1 }{ 100 } \]



    \[ I = \frac{ U_I }{ 0,015\, \Omega } * 1000 \frac{ mA }{ A } \]



    Achtung
    Batterienummer und ADC Kanal stimmen nicht überein => Übersetzungsarray bat_nummer2channel[8].

Definiert in Zeile 128 der Datei ad7997.c.

Hier ist ein Graph, der zeigt, was diese Funktion aufruft:

Hier ist ein Graph der zeigt, wo diese Funktion aufgerufen wird:

int AD7997_current_vorzeichen ( uint8_t  sensor_nummer)

Ermittelt die Stromrichtung der abgefragten Batterie.

Parameter
sensor_nummerNummer des Sensors bzw. der abgefragten Batterie.
Rückgabe
Stromrichtung als +1 oder -1

Die Strommesssensoren TS1101 geben die Stromrichtung über ein 0/1 Signal an. HIGH beim Entladen (negatives Vorzeichen), LOW beim Laden (positives Vorzeichen)

Definiert in Zeile 168 der Datei ad7997.c.

Hier ist ein Graph der zeigt, wo diese Funktion aufgerufen wird:

void AD7997_init ( void  )

TWI (I2C) und ADC 1/2 werden initialisiert.

TWI

Der TWI-Bus auf Port C wird initialisiert.

Strommessung

Die Strommessung erfolgt über den ADC2 AD7997 für jeden Batteriestromkreis einzeln.
Die Stromstärke wird über einen Widerstand in ein analoges Spannungssignal umgewandelt und am ADC gemessen. Bei einer Stromstärke von 2A werden 3V als Messsignal weitergeleitet, bei 100mA sind es 150 mV.
Der ADC2 wird auf Mode2 konfiguriert (Datenblatt AD7997 S. 29). Alle acht Messeingänge sind aktiviert. Die Messeingänge werden seriell abgefragt (halbautomatisch), bei jeder Abfrage wird um einen Messkanal weitergeschaltet.
Zusätzlich übermittelt der TS1101 auch die Stromrichtung über ein 0/1 Signal. HIGH beim Entladen (negatives Vorzeichen), LOW beim Laden (positives Vorzeichen). Die acht Signale werden über den Port A gemessen.

Spannungsmessung

Die Spannungsmessung erfolgt über den ADC1 AD7997 für jeden Batteriestromkreis einzeln.
Die Ausgangsspannungen der einzelnen Batterien werden über einen Spannungsteiler reduziert und an das Niveau der Referenzspannung angepasst.
Umrechnungsfaktor: \( \frac{ R_1 + R_2 }{ R_2 }\)
Der ADC1 wird auf Mode2 konfiguriert (Datenblatt AD7997 S. 29). Alle acht Messeingänge sind aktiviert. Die Messeingänge werden seriell abgefragt (halbautomatisch), bei jeder Abfrage wird um einen Messkanal weitergeschaltet.

V7.1

  • Referenzspannung 5V.
  • Spannungsteiler Säule 1: \( R_1 = 100K\Omega;\:\: R_2 = 100K\Omega; \)
  • Umrechnungsfaktor Säule 1: \( \frac{ R_1 + R_2 }{ R_2 } = \frac{ 100K + 100K }{ 100K } = 2\)
  • Spannungsteiler Säule 2: -
  • Umrechnungsfaktor Säule 2: 1

V7.1

  • Referenzspannung 3,3V.
  • Spannungsteiler Säule 1: \( R_1 = 100K\Omega;\:\: R_2 = 62K\Omega; \)
  • Umrechnungsfaktor Säule 1: \( \frac{ R_1 + R_2 }{ R_2 } = \frac{ 100K + 62K }{ 62K } = 2,613\)
  • Spannungsteiler Säule 2: \( R_1 = 30K\Omega;\:\: R_2 = 100K\Omega; \)
  • Umrechnungsfaktor Säule 2: \( \frac{ R_1 + R_2 }{ R_2 } = \frac{ 30K + 100K }{ 100K } = 1,3\)

Definiert in Zeile 75 der Datei ad7997.c.

Hier ist ein Graph, der zeigt, was diese Funktion aufruft:

Hier ist ein Graph der zeigt, wo diese Funktion aufgerufen wird:

void AD7997_voltage_get_data ( void  )

Ermittelt die Spannungen der Batterien.

Die Batteriespannung wird über einen Spannungsteiler \( \frac{ R_2 }{ R_1 + R_2 }\) auf ein für die Referenzspannung geeignetes Maß reduziert. Die reduzierte Spannung wird als analoges Signal über den ADC1 gemessen.
Der ADC misst die Spannung in Bezug zu einer Referenzspannung und gibt einen 10bit digitalen Wert aus.

Achtung
Die Referenzspannung beträgt bei BMS V7.1 5V, bei BMS V7.2 3,3V !
  • Die Referenzspannung (5V oder 3,3V) wird durch die Auflösung 1024 geteilt.
  • Die eingelesenen Daten \( n_U\) werden mit diesem Wert multipliziert.
  • Das Ergebnis wird mit dem Faktor \( \frac{ R_1 + R_2 }{ R_2 }\) des Spannungsteilers multipliziert, um die Ausgangsspannung zu ermitteln.
    Achtung
    Die Spannungsteiler unterscheiden sich zwischen Säule 1 und Säule 2 sowie zwischen V7.1 und V7.2 !


    \[ U_{Bat} = \frac{ U_{REF} }{ 1024 } * n_U * \frac{ R_1 + R_2 }{ R_2 } \]



    BMS V7.1

  • Referenzspannung 5V.
  • Umrechnungsfaktor Säule 1: \( \frac{ R_1 + R_2 }{ R_2 } = \frac{ 100K + 100K }{ 100K } = 2\)
  • Umrechnungsfaktor Säule 2: 1

    BMS V7.2

  • Referenzspannung 3,3V.
  • Umrechnungsfaktor Säule 1: \( \frac{ R_1 + R_2 }{ R_2 } = \frac{ 100K + 62K }{ 62K } = 2,613\)
  • Umrechnungsfaktor Säule 2: \( \frac{ R_1 + R_2 }{ R_2 } = \frac{ 30K + 100K }{ 100K } = 1,3\)

    Achtung
    Batterienummer und ADC Kanal stimmen nicht überein => Übersetzungsarray bat_nummer2channel[8].

Definiert in Zeile 211 der Datei ad7997.c.

Hier ist ein Graph, der zeigt, was diese Funktion aufruft:

Hier ist ein Graph der zeigt, wo diese Funktion aufgerufen wird: