Hallo,
ich will die Kapazität von einem kondensator so im Bereich 10pF - 100pF
messen, und zwar indem ich die Zeit messe, die der Kondensator braucht
um sich auf 63% der Ladespannung 5V aufzuladen. µc ist ein Atmega8 der
mit 16Mhz läuft ohne Vorteiler.
Jetzt brauche ich für 55pF aber 691 Takte zum aufladen anstelle der
errechneten 880, genauso für 102pF 1050 anstatt 1632. Der Ladewiderstand
beträgt 1Mohm, und ich verwende den internen Komparator des ATmega8.
Noch etwas Code:
1 | SIGNAL(SIG_COMPARATOR)
|
2 | {
|
3 | double result = 0;
|
4 | result = TCNT1;//*62/1000;
|
5 | //result = TCNT1;
|
6 | char test[10];
|
7 | dtostrf(result,3,1,test);
|
8 | send_string(test);
|
9 | send_string("pF---");
|
10 | ACSR &= ~(1<<ACIE); //Interrupt disablen um prellen zu verhindern
|
11 |
|
12 | }
|
13 |
|
14 | void get_cap(void)
|
15 | {
|
16 |
|
17 | TCNT1 = 0x00; // Timerregister 0 setzen
|
18 | PORTD |= (1<<PD5); // High setzen um Kondensator zu laden
|
19 | ACSR |= (1<<ACIE); //Interrupt enablen
|
20 | }
|
21 |
|
22 | int main(void)
|
23 | {
|
24 | sei();
|
25 | init_usart();
|
26 | DDRD |= (1<<PD5);
|
27 | DDRD &= ~(1<<PD7) | ~(1<<PD6);
|
28 | TCCR1B = (1 << CS10); //Prescaler: keiner
|
29 | ACSR |= (1<<ACIE) | (1<<ACIS0) | (1<<ACIS1); //Interrupt enable rising edges
|
30 |
|
31 | while(1)
|
32 | {
|
33 | delay_ms(1000);
|
34 | PORTD &= ~(1<<PD5); // Kondensator entladen
|
35 | delay_ms(1000);
|
36 | get_cap();
|
37 |
|
38 | }
|
39 |
|
40 | }
|
Wäre super wenn einer von euch eine Idee hätte, ich habe keine :(