Gerrit Pathuis
/
Measuring_Capacitance
Measuring the capacity of a capacitor, dumping info to PC screen
main.cpp@0:863c3f4f452f, 2012-01-07 (annotated)
- 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?
User | Revision | Line number | New 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 | } |