Lab_interaccio/2017/autogain/autogain.ino
2025-02-25 21:29:42 +01:00

60 lines
1.3 KiB
C++

#include <Wire.h>
#include <MCP3424.h>
#include <math.h>
MCP3424 adc(0x68);
void setup() {
SerialUSB.begin(57600);
Wire.begin();
adc.generalCall(GC_RESET);
}
void show_v(double& value, _ConfReg r) {
char v[24], buff[48];
dtostrf(value,8,8,v);
sprintf(buff, "channel: %d, gain: %d, value: %s", r.ch, 1 << r.pga, v);
SerialUSB.println(buff);
}
double value;
void loop() {
for (int i = (int)CH1; i <= (int)CH4; i++) {
_ConfReg& c = adc.creg[(Channel)i];
c.bits = { GAINx1, SR12B, ONE_SHOT, (Channel)i, 1 };
ConvStatus err = adc.read(c.ch, value);
//while (err != R_OK) ConvStatus err = adc.read(c.ch, value);
if (err == R_OK) {
show_v(value, c);
c.srate = SR18B;
c.pga = adc.findGain(value);
err = adc.read(c.ch, value);
if (err == R_OK) {
show_v(value, c);
SerialUSB.println();
} else
SerialUSB.println(" error.");
} else {
SerialUSB.print("conversion error: ");
SerialUSB.println(err);
}
}
asm volatile ("nop");
}
char *dtostrf (double val, signed char width, unsigned char prec, char *sout) {
asm(".global _printf_float");
char fmt[20];
sprintf(fmt, "%%%d.%df", width, prec);
sprintf(sout, fmt, val);
return sout;
}