Forum: Analoge Elektronik und Schaltungstechnik Berechnung Kondensator Kapazität


von saxosun (Gast)


Lesenswert?

Hallo,

ich möchte Elko-Kapazitäten mit einem µC messen. Dabei wird der Elko 
über einen bekannten Ladewiderstand geladen und nach einer bestimmten 
Zeit wird die Spannung mit Hilfe des ADC gemessen. Die gemessene 
Spannung muss dann auf die Kapazität umgerechnet werden.

Ich benutze AVR Studio 4 und einen Atmega 644, die math.h habe ich 
eingebunden.

Mein Problem ist, dass ich immer Fehler mit den Datentypen bekomme.
Ich habe das selbe mal in VB ohne Probleme gemacht, dort lautete meine 
Formel:

C = (-t_load / (resistor * (Math.Log(1 - c_mess / V_real)))) * 1000000

Das Ergebnis wurde in µF angezeigt.

Zur Zeit habe ich mir in Excel eine Tabelle angefertigt, und diese als 
Datenarray eingebunden. Das soll aber nur die Notlösung sein, Ich würde 
lieber die Kapazität direkt im µC berechnen.

Wie müssen meine Datentypen deklariert sein, und wie muss die Formel 
dann geschrieben werden?

vielen Dank für eure Bemühungen im vorraus,
Grüße
Michael

: Verschoben durch Admin
von ... (Gast)


Lesenswert?

saxosun schrieb:
> Mein Problem ist, dass ich immer Fehler mit den Datentypen bekomme.

Das wird an deiner Variablendeklaration oder an deiner Umsetzung der 
Formel liegen. Guck mal in Zeile 42.

von saxosun (Gast)


Lesenswert?

1
double c_real;           //Kapazität in µF
2
double time;             //Messzeit in Sekunden
3
double resistor;         //Ladewiderstand in Ohm
4
double voltage_adc;      //gemessene Spannung nach laden
5
double voltage_load;     //angelegte Ladespannung  
6
7
c_real = (-time / resistor * log( 1- voltage_adc / voltage_load)) * 1000000;
Fehlermeldung:
1
c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/../../../../avr/lib/avr5\libc.a(floatsisf.o): In function `__floatunsisf':
2
(.text.avr-libc.fplib+0x0): multiple definition of `__floatunsisf'
3
c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/avr5\libgcc.a(_usi_to_sf.o):c:\avrdev\gcc\build-avr\avr\avr5\libgcc/../../.././gcc/fp-bit.c:1391: first defined here


Grüße
Michael
(was meinst du mit Zeile 42?)

von HildeK (Gast)


Lesenswert?


von STK500-Besitzer (Gast)


Lesenswert?

saxosun schrieb:
> multiple definition of `__floatunsisf'

Und was sagt uns diese Fehlermeldung?
Es liegt nicht an den Variablen, sondern an dem, was du geschrieben 
hast.
Hast du die math.h vielleicht mehrfahr eingefügt?
Vielleicht dadurch, dass eine andere header-Datei eingefügt hast?
Ohne deinen Quellcode, wird niemand außer dir den Fehler finden können.

von saxosun (Gast)


Lesenswert?

1
#include  <avr/io.h>
2
#define  F_CPU 10000000 
3
#include  <util/delay.h>
4
#include  <math.h>
5
///////////////////////////////////////////////////
6
unsigned char Flag = 0;
7
#define t_fk     SBIT (Flag, 0 )
8
#define t_tast     SBIT (Flag, 2 )
9
///////////////////////////////////////////////////
10
double c_real;      
11
unsigned char t_time = 10; 
12
unsigned char v_s = 50;      
13
///////////////////////////////////////////////////
14
struct bits 
15
  { 
16
    uint8_t b0:1; uint8_t b1:1; uint8_t b2:1; uint8_t b3:1; 
17
    uint8_t b4:1; uint8_t b5:1; uint8_t b6:1; uint8_t b7:1;
18
  }
19
   __attribute__((__packed__));
20
#define SBIT(port,pin) ((*(volatile struct bits*)&port).b##pin)
21
///////////////////////////////////////////////////
22
void get_in (void)
23
  {if ((t_time <= 79) && (t_tast == 1))  t_fk = 1;}
24
///////////////////////////////////////////////////
25
int main (void)
26
  {  
27
    while(1)                    
28
      {
29
        get_in();              
30
        c_real = log(c_real);
31
        _delay_ms(v_s);
32
      }
33
    return(0);
34
  }
35
////////////////////////////////////////////////////


Hallo,
ich habe den Code jetzt soweit reduziert, dass die Fehlermeldung immer 
noch erscheint. Der Code macht natürlich keinen Sinn mehr.
Setze ich z.B. in _delay_ms(v_s) einen festen Wert ein, verschwindet die 
Fehlermeldung. Genauso wenn ich den Code aus der Funktion get_in direkt 
in die mainloop einfüge, oder um eine Bedingung reduziere....
Ich verstehe das Problem leider nicht, und würde mich über Hilfe freuen.
Grüße
Michael

von STK500-Besitzer (Gast)


Lesenswert?

saxosun schrieb:
> Setze ich z.B. in _delay_ms(v_s) einen festen Wert ein, verschwindet die
> Fehlermeldung.

Dann soltest du dir mal angucken, wie "_delay_ms()" funktioniert.
1
t_fk = 1;

Wenn ich das richtig interpretiere, steht da:
1
SBIT (Flag, 0 ) = 1;

ist wohl Blödsinn, oder?

"_delay_ms()" mit einem Char aufzurufen fällt unter die gleiche 
Kategorie...

von saxosun (Gast)


Lesenswert?

Ich schrieb doch das der Code keinen Sinn mehr macht, aber, es wird wohl 
einfacher sein den Fehler hier zu finden, als in 2000 Zeilen Code.

von saxosun (Gast)


Lesenswert?

Also,
wenn ich bei _ms_delay() einen Übergabewert als double einsetze 
verschwindet die Fehlermeldung, das hat geholfen, danke.

Aber warum funktioniert es dann ohne die log Berechnung, und was 
bedeutet die Fehlermeldung?

Und, warum ist es ein Problem (Blödsinn), wenn ich mir ein vorher 
deklariertes Flag in einer Bedingung auf 1 setze?
Grüße
Michael

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.