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

Dependencies:   mbed

Files at this revision

API Documentation at this revision

Comitter:
GerritPathuis
Date:
Sat Jan 07 16:35:13 2012 +0000
Child:
1:d95ae9068740
Commit message:
First revision

Changed in this revision

main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
--- /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");
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Sat Jan 07 16:35:13 2012 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/078e4b97a13e