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.
main.cpp
- Committer:
- mariob
- Date:
- 2013-03-12
- Revision:
- 0:36d465acb1a2
File content as of revision 0:36d465acb1a2:
/**********************************************************
* 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
}
}
Mario Bambagini