20 #include <avr/interrupt.h> 32 uint32_t sekunden = 0;
51 _delay_ms ( WARTEZEIT * 1000 );
101 if ( V_CHG_1_mess < 200 )
107 if ( I_CHG_1_mess < 200 )
113 if ( V_CHG_2_mess < 200 )
119 if ( I_CHG_2_mess < 200 )
125 if ( V_BAT_mess < 200 )
131 if ( I_BAT_mess < 200 )
137 V_CHG_1 = V_CHG_1_mess * adc_lsb * SPANNUNGSTEILER_LADEN;
138 V_CHG_2 = V_CHG_2_mess * adc_lsb * SPANNUNGSTEILER_LADEN;
139 V_BAT = V_BAT_mess * adc_lsb * SPANNUNGSTEILER_BETRIEB;
141 I_CHG_1 = (I_CHG_1_mess * adc_lsb / TS_1101_50) * 1000 / R_MESS;
142 I_CHG_2 = (I_CHG_2_mess * adc_lsb / TS_1101_50) * 1000 / R_MESS;
143 I_BAT = (I_BAT_mess * adc_lsb / TS_1101_100) * 1000 / R_MESS;
146 CHARGE_1 = (float) (I_CHG_1 * WARTEZEIT / 3600);
147 CHARGE_2 = (float) (I_CHG_2 * WARTEZEIT / 3600);
148 CHARGE_BAT = (float) (I_BAT * WARTEZEIT / 3600);
164 fprintf ( &usbout,
"\x1B[2J" );
165 fprintf ( &usbout,
"\x1B[2;1HKontrollplatine - Statusanzeige\n\r" );
166 fprintf ( &usbout,
"\x1B[34m===================================\x1B[0m\n\n\r" );
167 fprintf ( &usbout,
"Betriebszeit: %s\n\n\r", laufzeit );
168 fprintf ( &usbout,
"Block 1: Block 2: \n\n\r" );
169 fprintf ( &usbout,
"Spannung: %5.2fV Spannung: %5.2fV\n\r", V_CHG_1, V_CHG_2 );
170 fprintf ( &usbout,
"Strom: %5imA Strom: %5imA\n\n\r", I_CHG_1, I_CHG_2 );
171 fprintf ( &usbout,
"Betrieb: \n\n\r" );
172 fprintf ( &usbout,
"Spannung: %5.2fV\n\r", V_BAT );
173 fprintf ( &usbout,
"Strom: %5imA\n\n\r", I_BAT );
175 fprintf ( &usbout,
"Raw Data:\n\n\r" );
176 fprintf ( &usbout,
"Block 1: Block 2: \n\n\r" );
177 fprintf ( &usbout,
"Spannung: %5i %5.2fV Spannung: %5i %5.2fV\n\r", V_CHG_1_mess, (
float) (V_CHG_1_mess *
ADC_LSB), V_CHG_2_mess, (
float) (V_CHG_2_mess * ADC_LSB) );
178 fprintf ( &usbout,
"Strom: %5i %5.2fV Strom: %5i %5.2fV\n\n\r", I_CHG_1_mess, (
float) (I_CHG_1_mess * ADC_LSB), I_CHG_2_mess, (
float) (I_CHG_2_mess * ADC_LSB) );
179 fprintf ( &usbout,
"Betrieb: \n\n\r" );
180 fprintf ( &usbout,
"Spannung: %5i %5.2fV\n\r", V_BAT_mess, (
float) (V_BAT_mess * ADC_LSB) );
181 fprintf ( &usbout,
"Strom: %5i %5.2fV\n\n\r", I_BAT_mess, (
float) (I_BAT_mess * ADC_LSB) );
192 static bool einmal =
true;
197 printf (
"Zeit;Ladespannung 1;Ladestrom 1;Ladungsdifferenz 1;Ladespannung 2" );
198 printf (
";Ladestrom 2;Ladungsdifferenz 2;Betriebsspannung;Betriebsstrom;Ladungsdifferenz\n\r" );
201 printf (
"%s;%5.2f;%5i;%5.0f;%5.2f;%5i;%5.0f;%5.2f;%5i;%5.0f\n\r", laufzeit, V_CHG_1, I_CHG_1, CHARGE_1, V_CHG_2, I_CHG_2, CHARGE_2, V_BAT, I_BAT, CHARGE_BAT );
216 TCC0.CTRLA = TC_CLKSEL_DIV1024_gc;
217 TCC0.CTRLB = TC_WGMODE_NORMAL_gc;
218 TCC0.INTCTRLA = TC_CCAINTLVL_HI_gc;
235 USART_Init ( eUSARTF0, BAUD_A, BAUD_B );
236 USART_Connect ( eUSARTF0, OUT_FILENO );
246 PMIC.CTRL = PMIC_LOLVLEN_bm | PMIC_MEDLVLEN_bm | PMIC_HILVLEN_bm;
258 uint8_t stunde, minute, sekunde;
260 stunde = sekunden / 3600;
261 minute = (sekunden - stunde * 3600) / 60;
262 sekunde = sekunden - stunde * 3600 - minute * 60;
264 sprintf ( laufzeit,
"%02i:%02i:%02i", stunde, minute, sekunde );
#define RES_ADC
12bit Auflösung
#define GND_REF
XMEGA A-Family Manual S. 288ff; Kompensation deltaV mit GND_REF berücksichtigt (0,05*VREF => 200)
uint16_t ADCA_Conversion(ADC_CH_t *Channel, char Pin)
Konvertiert die Spannung über Channel, die an Pin anliegt.
void ADCA_init(void)
ADC A wird eingestellt.
Bibliothek zur USB-Kommunikation von Jürgen W.
void laufzeit_berechnen(void)
Berechnung der Laufzeit.
void Config32MHzClock(void)
Einstellung der Systemtakte und der USB-Clock.
void terminal_usb(void)
Ausgabe der Messwerte auf einem Terminal über USB.
Bibliothek zur USB-Kommunikation von Jürgen W.
#define V_REF
XMEGA A-Family Manual S. 288ff; 3,28/1,6 = 2,05.
void init(void)
Hier werden alle Initialisierungen vorgenommen.
void timer_init(void)
Timer als Zeitgeber.
#define ADC_LSB
LSB 2,05/4096 = 0,000501.
void werte_berechnen(void)
ADC wird ausgelesen und die Werte umgerechnet.
int main(void)
Main: Ablaufsteuerung.
void terminal_usart(void)
Messwertübertragung auf ein Terminal.
Standardheader und Auswahl der Übertragungsgeschwindigkeit.
void I_sgn_init(void)
Stromrichtung aus den Strommesssensoren TS1101.