Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Revision 1:d95ae9068740, committed 2012-01-07
- Comitter:
- GerritPathuis
- Date:
- Sat Jan 07 20:36:57 2012 +0000
- Parent:
- 0:863c3f4f452f
- Commit message:
- Rev 2, algorithm now based on step response of a first order system.
Changed in this revision
| main.cpp | Show annotated file Show diff for this revision Revisions of this file |
--- a/main.cpp Sat Jan 07 16:35:13 2012 +0000
+++ b/main.cpp Sat Jan 07 20:36:57 2012 +0000
@@ -4,15 +4,15 @@
// GPa@quicknet.nl
/////////////////////////////////////////
//
-// An unkwown ceramic capacitor is connected to
-// pin21 via a 82 kilo ohm resister, the other
+// 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
-//
+// A ceramic capacitor is used becouse it is non polarized
+//
// ||
-// pin21-----RRRRRRR-----------||------- pin1 (GND)
-// | ||
+// pin21-----RRRRRRR-----------||------- pin1 (GND)
+// | ||
// 82k ohm | ?? Farad
// |
// pin20-------------------
@@ -25,24 +25,22 @@
// 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
+// Capacitor is charging
+// wait until 3.13 Volt being 3 Tou
+// Theory step response on a first order system
//
-// Cap = current * time / measured voltage change
-// current = voltage over the resistor / resistor value
-// voltage max is 3.3 volt !!!
+// 1 x Tou= 63% final value
+// 2 x Tou= 86% final value
+// 3 x Tou= 95% final value
+//
+// Tou = R x C
+// ==> C = Tou / R
//
// 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)
@@ -55,68 +53,58 @@
AnalogIn ain(p20);
DigitalOut red(p21);
Serial pc(USBTX, USBRX); // tx, rx
+Timer timer;
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
-
+ int i;
+ double timec;
+ double volt; // Voltage measurement
+ double cx; // capacitance
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
+ wait_ms(10); // 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();
+ // Wait for 0.0 volt on input
+ red.write(0);
+ volt = 1;
+ while (volt > 0.0001) { // wait for 0.0 Volt
+ wait_us(2);
+ volt = ain.read();
}
+ // start to measure
+ timer.reset();
+ timer.start();
red.write(1); // output high
- wait_us(mmtime); // measuring time
- volt_1 = ain.read();
+
+ while (volt < 3.13) { // wait for 3.13 Volt
+ volt = ain.read()*3.3;
+ }
+ timer.stop();
+ timec=timer.read();
red.write(0); // output low
// calculations
- volt_0 *= 3.3;
- volt_1 *= 3.3;
+ cx = (double) timec/ (3 * 82000);
- 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");
- }
+ pc.printf("Volt %3.2f, time %9.4f msec ", volt, timec*1000);
+ if (cx < 1 and cx >= 0.001) {
+ cx = cx *1000;
+ pc.printf("Cap. is %5.1f milli Farad ", cx);
+ } else if (cx < 0.001 and cx >= 0.000001) {
+ cx = cx *1000 *1000;
+ pc.printf("Cap. is %5.1f micro Farad ", cx);
+ } else if (cx < 0.000001 and cx >= 0.000000001) {
+ cx = cx *1000 *1000 *1000;
+ pc.printf("Cap. is %5.1f nano Farad ", cx);
+ } else if (cx < 0.000000001 and cx >= 0.000000000001) {
+ cx = cx *1000 *1000 *1000 *1000;
+ pc.printf("Cap. is %5.1f pico Farad ", cx);
+ } else if (cx < 0.000000000001)
+ pc.printf("Cx = %5.1f Out of range too small! ", cx);
+ pc.printf("\r");
+ pc.printf("\n");
}
-}
+}
\ No newline at end of file