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

Dependencies:   mbed

Revision:
0:863c3f4f452f
Child:
1:d95ae9068740
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Sat Jan 07 16:35:13 2012 +0000
@@ -0,0 +1,122 @@
+#include "mbed.h"
+
+//////////////////////////////////////////
+// GPa@quicknet.nl
+/////////////////////////////////////////
+//
+// An unkwown ceramic capacitor is connected to 
+// pin21 via a 82 kilo ohm resister, the other 
+// capacitor terminal is connected to ground
+//
+// A ceramic capacitor is used becouse it is non polarized 
+// 
+//                                 ||
+//     pin21-----RRRRRRR-----------||------- pin1 (GND)        
+//                            |    || 
+//                82k ohm     |    ?? Farad
+//                            |
+//     pin20-------------------
+//
+// Mbed pins used
+// Pin 20...... analog input
+// Pin 21...... digital out
+//////////////////////////////////////////
+// How does it work
+// measure voltage on pin 20
+// If (not zero Volt) then wait
+// else pin 21 goes high 3.3 Volt
+// wait 2 micro seconds (the capacitor is now charging)
+// measure voltage on pin 20
+// the Voltage increase in 2 micro seconds is a measure
+// for the size of the capacitor
+// a small capacitor will charge fast a big one slow
+//
+// Cap = current * time / measured voltage change
+// current = voltage over the resistor / resistor value
+// voltage max is 3.3 volt !!!
+//
+// The measuring results are send via Teraterm to the PC screen
+// Note 1)
+// The tolerance range of a ceramic capacitor
+// lies between 5 and 100%, not very accure at all.
+// Note 2)
+// Choose the charging time such that the capacitor 
+// reaches about 3 Volt, lower you get less accurate results
+// higher the 3.3 is not acceptable to the analogin
+//
+// Cap sizes are
+// m = 10^-3  (mili)
+// u = 10^-6  (micro)
+// n = 10^-9  (nano)
+// p = 10^-12 (pico)
+// f = 10^-15 (femto)
+/////////////////////////////////////////
+
+AnalogIn ain(p20);
+DigitalOut red(p21);
+Serial pc(USBTX, USBRX); // tx, rx
+
+int main() {
+    int i, cnt;
+    double volt_0;       // first measurement
+    double volt_1;       // second measurement
+    double volt_delta;   // delta voltage
+    double current;      // max current trough resistor
+    double cx;           // capacitance to be calculated;
+    double mmtime =20;   // measure time in micro seconds
+
+
+    pc.baud(9600);
+    pc.format(8,Serial::None,1);
+
+    for (i=0; i<2250; i +=1)  {
+        // starting at zero volt
+        red.write(0);
+        wait_ms(20);        // deterime the number of measurements
+
+        // start measurement, wait for 0.0 volt on input
+        volt_0 = 1;
+        cnt=0;
+        while (volt_0 > 0.0001) {   // wait for 0.0 Volt
+            wait_us(2);  
+            cnt+=1;                 // wait
+            volt_0 = ain.read();
+        }
+        red.write(1);               // output high
+        wait_us(mmtime);            // measuring time
+        volt_1 = ain.read();
+        red.write(0);               // output low
+
+        // calculations
+        volt_0 *= 3.3;
+        volt_1 *= 3.3;
+
+        volt_delta = abs(volt_1 - volt_0);
+        current = (3.3- volt_delta/2) / 82000;   // 82k resistor
+        cx = current* mmtime/(1000 * 1000 * volt_delta);
+        //pc.printf("Volt_0  %f, volt_1 %f, current %f  ", volt_0, volt_1, current);
+        //pc.printf("Delta voltage %f, time %f ", volt_delta, mmtime);
+        pc.printf("cnt= %3d, Delta= %5.4f Volt ", cnt, volt_delta);
+        if (volt_1 > 3.1)
+            pc.printf("Out of range \n\r");
+        else {
+            if (cx < 1 and cx >= 0.001) {
+                cx = cx *1000;
+                pc.printf("Cap. is %5.4f milli Farad    ", cx);
+            } else if (cx < 0.001 and cx >= 0.000001) {
+                cx = cx *1000 *1000;
+                pc.printf("Cap. is %5.4f micro Farad     ", cx);
+            } else if (cx < 0.000001 and cx >= 0.000000001) {
+                cx = cx *1000 *1000 *1000;
+                pc.printf("Cap. is %4.2f nano Farad      ", cx);
+            }
+            if (cx <  0.000000001 and cx >=  0.000000000001) {
+                cx = cx *1000 *1000 *1000 *1000;
+                pc.printf("Cap. is %4.0f pico Farad       ", cx);
+            } else if (cx < 0.000000000001)
+                pc.printf("Cx = %f Out of range too small! ", cx);
+            pc.printf("\r");
+            // pc.printf("\n");
+        }
+    }
+}