Measuring the capacity of a capacitor, dumping info to PC screen

Dependencies:   mbed

Committer:
GerritPathuis
Date:
Sat Jan 07 16:35:13 2012 +0000
Revision:
0:863c3f4f452f
Child:
1:d95ae9068740
First revision

Who changed what in which revision?

UserRevisionLine numberNew contents of line
GerritPathuis 0:863c3f4f452f 1 #include "mbed.h"
GerritPathuis 0:863c3f4f452f 2
GerritPathuis 0:863c3f4f452f 3 //////////////////////////////////////////
GerritPathuis 0:863c3f4f452f 4 // GPa@quicknet.nl
GerritPathuis 0:863c3f4f452f 5 /////////////////////////////////////////
GerritPathuis 0:863c3f4f452f 6 //
GerritPathuis 0:863c3f4f452f 7 // An unkwown ceramic capacitor is connected to
GerritPathuis 0:863c3f4f452f 8 // pin21 via a 82 kilo ohm resister, the other
GerritPathuis 0:863c3f4f452f 9 // capacitor terminal is connected to ground
GerritPathuis 0:863c3f4f452f 10 //
GerritPathuis 0:863c3f4f452f 11 // A ceramic capacitor is used becouse it is non polarized
GerritPathuis 0:863c3f4f452f 12 //
GerritPathuis 0:863c3f4f452f 13 // ||
GerritPathuis 0:863c3f4f452f 14 // pin21-----RRRRRRR-----------||------- pin1 (GND)
GerritPathuis 0:863c3f4f452f 15 // | ||
GerritPathuis 0:863c3f4f452f 16 // 82k ohm | ?? Farad
GerritPathuis 0:863c3f4f452f 17 // |
GerritPathuis 0:863c3f4f452f 18 // pin20-------------------
GerritPathuis 0:863c3f4f452f 19 //
GerritPathuis 0:863c3f4f452f 20 // Mbed pins used
GerritPathuis 0:863c3f4f452f 21 // Pin 20...... analog input
GerritPathuis 0:863c3f4f452f 22 // Pin 21...... digital out
GerritPathuis 0:863c3f4f452f 23 //////////////////////////////////////////
GerritPathuis 0:863c3f4f452f 24 // How does it work
GerritPathuis 0:863c3f4f452f 25 // measure voltage on pin 20
GerritPathuis 0:863c3f4f452f 26 // If (not zero Volt) then wait
GerritPathuis 0:863c3f4f452f 27 // else pin 21 goes high 3.3 Volt
GerritPathuis 0:863c3f4f452f 28 // wait 2 micro seconds (the capacitor is now charging)
GerritPathuis 0:863c3f4f452f 29 // measure voltage on pin 20
GerritPathuis 0:863c3f4f452f 30 // the Voltage increase in 2 micro seconds is a measure
GerritPathuis 0:863c3f4f452f 31 // for the size of the capacitor
GerritPathuis 0:863c3f4f452f 32 // a small capacitor will charge fast a big one slow
GerritPathuis 0:863c3f4f452f 33 //
GerritPathuis 0:863c3f4f452f 34 // Cap = current * time / measured voltage change
GerritPathuis 0:863c3f4f452f 35 // current = voltage over the resistor / resistor value
GerritPathuis 0:863c3f4f452f 36 // voltage max is 3.3 volt !!!
GerritPathuis 0:863c3f4f452f 37 //
GerritPathuis 0:863c3f4f452f 38 // The measuring results are send via Teraterm to the PC screen
GerritPathuis 0:863c3f4f452f 39 // Note 1)
GerritPathuis 0:863c3f4f452f 40 // The tolerance range of a ceramic capacitor
GerritPathuis 0:863c3f4f452f 41 // lies between 5 and 100%, not very accure at all.
GerritPathuis 0:863c3f4f452f 42 // Note 2)
GerritPathuis 0:863c3f4f452f 43 // Choose the charging time such that the capacitor
GerritPathuis 0:863c3f4f452f 44 // reaches about 3 Volt, lower you get less accurate results
GerritPathuis 0:863c3f4f452f 45 // higher the 3.3 is not acceptable to the analogin
GerritPathuis 0:863c3f4f452f 46 //
GerritPathuis 0:863c3f4f452f 47 // Cap sizes are
GerritPathuis 0:863c3f4f452f 48 // m = 10^-3 (mili)
GerritPathuis 0:863c3f4f452f 49 // u = 10^-6 (micro)
GerritPathuis 0:863c3f4f452f 50 // n = 10^-9 (nano)
GerritPathuis 0:863c3f4f452f 51 // p = 10^-12 (pico)
GerritPathuis 0:863c3f4f452f 52 // f = 10^-15 (femto)
GerritPathuis 0:863c3f4f452f 53 /////////////////////////////////////////
GerritPathuis 0:863c3f4f452f 54
GerritPathuis 0:863c3f4f452f 55 AnalogIn ain(p20);
GerritPathuis 0:863c3f4f452f 56 DigitalOut red(p21);
GerritPathuis 0:863c3f4f452f 57 Serial pc(USBTX, USBRX); // tx, rx
GerritPathuis 0:863c3f4f452f 58
GerritPathuis 0:863c3f4f452f 59 int main() {
GerritPathuis 0:863c3f4f452f 60 int i, cnt;
GerritPathuis 0:863c3f4f452f 61 double volt_0; // first measurement
GerritPathuis 0:863c3f4f452f 62 double volt_1; // second measurement
GerritPathuis 0:863c3f4f452f 63 double volt_delta; // delta voltage
GerritPathuis 0:863c3f4f452f 64 double current; // max current trough resistor
GerritPathuis 0:863c3f4f452f 65 double cx; // capacitance to be calculated;
GerritPathuis 0:863c3f4f452f 66 double mmtime =20; // measure time in micro seconds
GerritPathuis 0:863c3f4f452f 67
GerritPathuis 0:863c3f4f452f 68
GerritPathuis 0:863c3f4f452f 69 pc.baud(9600);
GerritPathuis 0:863c3f4f452f 70 pc.format(8,Serial::None,1);
GerritPathuis 0:863c3f4f452f 71
GerritPathuis 0:863c3f4f452f 72 for (i=0; i<2250; i +=1) {
GerritPathuis 0:863c3f4f452f 73 // starting at zero volt
GerritPathuis 0:863c3f4f452f 74 red.write(0);
GerritPathuis 0:863c3f4f452f 75 wait_ms(20); // deterime the number of measurements
GerritPathuis 0:863c3f4f452f 76
GerritPathuis 0:863c3f4f452f 77 // start measurement, wait for 0.0 volt on input
GerritPathuis 0:863c3f4f452f 78 volt_0 = 1;
GerritPathuis 0:863c3f4f452f 79 cnt=0;
GerritPathuis 0:863c3f4f452f 80 while (volt_0 > 0.0001) { // wait for 0.0 Volt
GerritPathuis 0:863c3f4f452f 81 wait_us(2);
GerritPathuis 0:863c3f4f452f 82 cnt+=1; // wait
GerritPathuis 0:863c3f4f452f 83 volt_0 = ain.read();
GerritPathuis 0:863c3f4f452f 84 }
GerritPathuis 0:863c3f4f452f 85 red.write(1); // output high
GerritPathuis 0:863c3f4f452f 86 wait_us(mmtime); // measuring time
GerritPathuis 0:863c3f4f452f 87 volt_1 = ain.read();
GerritPathuis 0:863c3f4f452f 88 red.write(0); // output low
GerritPathuis 0:863c3f4f452f 89
GerritPathuis 0:863c3f4f452f 90 // calculations
GerritPathuis 0:863c3f4f452f 91 volt_0 *= 3.3;
GerritPathuis 0:863c3f4f452f 92 volt_1 *= 3.3;
GerritPathuis 0:863c3f4f452f 93
GerritPathuis 0:863c3f4f452f 94 volt_delta = abs(volt_1 - volt_0);
GerritPathuis 0:863c3f4f452f 95 current = (3.3- volt_delta/2) / 82000; // 82k resistor
GerritPathuis 0:863c3f4f452f 96 cx = current* mmtime/(1000 * 1000 * volt_delta);
GerritPathuis 0:863c3f4f452f 97 //pc.printf("Volt_0 %f, volt_1 %f, current %f ", volt_0, volt_1, current);
GerritPathuis 0:863c3f4f452f 98 //pc.printf("Delta voltage %f, time %f ", volt_delta, mmtime);
GerritPathuis 0:863c3f4f452f 99 pc.printf("cnt= %3d, Delta= %5.4f Volt ", cnt, volt_delta);
GerritPathuis 0:863c3f4f452f 100 if (volt_1 > 3.1)
GerritPathuis 0:863c3f4f452f 101 pc.printf("Out of range \n\r");
GerritPathuis 0:863c3f4f452f 102 else {
GerritPathuis 0:863c3f4f452f 103 if (cx < 1 and cx >= 0.001) {
GerritPathuis 0:863c3f4f452f 104 cx = cx *1000;
GerritPathuis 0:863c3f4f452f 105 pc.printf("Cap. is %5.4f milli Farad ", cx);
GerritPathuis 0:863c3f4f452f 106 } else if (cx < 0.001 and cx >= 0.000001) {
GerritPathuis 0:863c3f4f452f 107 cx = cx *1000 *1000;
GerritPathuis 0:863c3f4f452f 108 pc.printf("Cap. is %5.4f micro Farad ", cx);
GerritPathuis 0:863c3f4f452f 109 } else if (cx < 0.000001 and cx >= 0.000000001) {
GerritPathuis 0:863c3f4f452f 110 cx = cx *1000 *1000 *1000;
GerritPathuis 0:863c3f4f452f 111 pc.printf("Cap. is %4.2f nano Farad ", cx);
GerritPathuis 0:863c3f4f452f 112 }
GerritPathuis 0:863c3f4f452f 113 if (cx < 0.000000001 and cx >= 0.000000000001) {
GerritPathuis 0:863c3f4f452f 114 cx = cx *1000 *1000 *1000 *1000;
GerritPathuis 0:863c3f4f452f 115 pc.printf("Cap. is %4.0f pico Farad ", cx);
GerritPathuis 0:863c3f4f452f 116 } else if (cx < 0.000000000001)
GerritPathuis 0:863c3f4f452f 117 pc.printf("Cx = %f Out of range too small! ", cx);
GerritPathuis 0:863c3f4f452f 118 pc.printf("\r");
GerritPathuis 0:863c3f4f452f 119 // pc.printf("\n");
GerritPathuis 0:863c3f4f452f 120 }
GerritPathuis 0:863c3f4f452f 121 }
GerritPathuis 0:863c3f4f452f 122 }