Berechnung Kondensator Kapazität

Gast #2709167
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
Gast #2709189
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?)
Gast #2709205
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.
Gast #2711512
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
Gast #2711516
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...
Gast #2711536
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren