Program for reading data from one (or two) ACS712 (current sense amplifier). Read the configuration before trying it.
This program aims at implementing a simple current reader which, sensing from an ACS712, prints on the USB port the average of n samples.
The program can be configured at compile-time by setting few defines:
- the number of channels: either only p20 or the sum of p19 and p20;
- the number of samples to read before printing their average
- the operating mode:
- PIN_TRIGGERED: read a handful of samples when the pin p9 rises
- USER_TRIGGERED: start reading when the user presses the character 's'
- ENDLESS_READ: read continuosly
First of all, when the program starts, it read a bunch of samples and then sets their mean value as reference. This means that the software assumes that when such a reference value is read, there is no current absorption.
Revision 0:36d465acb1a2, committed 2013-03-12
- Comitter:
- mariob
- Date:
- Tue Mar 12 12:20:25 2013 +0000
- Commit message:
- MB
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 |
diff -r 000000000000 -r 36d465acb1a2 main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Tue Mar 12 12:20:25 2013 +0000 @@ -0,0 +1,133 @@ +/********************************************************** + * CONFIGURATION: before starting, configure the reader + **********************************************************/ + +//define the number of channels to use: +// -) 1 channel: p20 +// -) 2 channels: p19 and p20 +#define NCHANNELS 1 +//#define nChannels 1 + +//number of samples to read before printing their average +#define NSAMPLES 2500 + +//number of samplng operation after an user trigger +//(total samples: NSAMPLES*NSAMPLING) +#define NSAMPLING 50 + +//read NSAMPLES values when the pin p9 is high +#define PIN_TRIGGERED 2 + +//the sampling is run only when the user presses the character 's' +//the operation lasts for NSAMPLING iterations +#define USER_TRIGGERED 1 + +//read all the time +#define ENDLESS_READ 0 + +#define ACQ_TYPE USER_TRIGGERED + + +/********************************************************** + * CONFIGURATION CHECK + **********************************************************/ +#if !defined(NCHANNELS) || (NCHANNELS!=1 && NCHANNELS!=2) +#error "The number of channels is wrong" +#endif + +#if !defined(ACQ_TYPE) || (ACQ_TYPE!=ENDLESS_READ && \ + ACQ_TYPE!=PIN_TRIGGERED && ACQ_TYPE!=USER_TRIGGERED) +#error "Acquisition type not detected or not valid" +#endif + +#if ACQ_TYPE==USER_TRIGGERED && !defined(NSAMPLING) +#error "Define a number of samplings after the user trigger" +#endif + + +/********************************************************** + * CODE + **********************************************************/ + +#include "mbed.h" + +AnalogIn ain_1(p20); +#if NCHANNELS==2 +AnalogIn ain_2(p19); +#endif + +#if ACQ_TYPE==PIN_TRIGGERED +DigitalIn firer (p9); +#endif + +#define V_max 3.3 + +int main() +{ + double vref_1 = 0.0; +#if NCHANNELS==2 + double vref_2 = 0.0; +#endif + + //acquiring v_ref + for (int i=0; i<NSAMPLES; i++) { + vref_1 += ain_1; +#if NCHANNELS==2 + vref_2 += ain_2; +#endif + } + vref_1 /= NSAMPLES; + printf("Vref 1: %f\n\r", vref_1); +#if NCHANNELS==2 + vref_2 /= NSAMPLES; + printf("Vref 2: %f\n\r", vref_2); +#endif + + //main loop + while(true) { + //start condition +#if ACQ_TYPE==USER_TRIGGERED + printf("press \'s\' to start\n\r"); + int c; + do { + c = getchar(); + } while (c!='s'); + for (int i=0; i<NSAMPLING; i++) { +#elif ACQ_TYPE==PIN_TRIGGERED + while(firer==0); +#elif ACQ_TYPE==ENDLESS_READ +#else +//already signaled +//#error "Acquisition type not detected" +#endif + + //acquisition + double sum_1 = 0.0; +#if NCHANNELS==2 + double sum_2 = 0.0; +#endif + for (int samples = 0; samples<NSAMPLES; samples++) { + sum_1 += ain_1; +#if NCHANNELS==2 + sum_2 += ain_2; +#endif + } + sum_1 /= NSAMPLES; + sum_1 = (sum_1-vref_1)*V_max/0.185; +#if NCHANNELS==2 + sum_2 /= NSAMPLES; + sum_2 = (sum_2-vref_2)*V_max/0.185; + printf("%f\n\r", sum_1+sum_2); +#else + printf("%f\n\r", sum_1); +#endif + + //final condition +#if ACQ_TYPE==USER_TRIGGERED + } +#elif ACQ_TYPE==PIN_TRIGGERED +#elif ACQ_TYPE==ENDLESS_READ +#else +#endif + } +}
diff -r 000000000000 -r 36d465acb1a2 mbed.bld --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.bld Tue Mar 12 12:20:25 2013 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/mbed_official/code/mbed/builds/0954ebd79f59 \ No newline at end of file