Mit externem ADC sieht's so aus:
1 | #ifdef ACS712
|
2 | Vcc=measure_vcc();
|
3 | // Read ACS712 voltage output differential
|
4 | adc.setMultiplexer(ADS1115_MUX_P1_N3);
|
5 | adc.setGain(ADS1115_PGA_4P096);
|
6 | mVopamp=adc.getConversion();
|
7 | #endif
|
8 |
|
9 | #ifdef ACS712
|
10 | // ACS712: 185mV/1000mA -> 5.4054 mA / 1 mV
|
11 | current = (((mVopamp) * adc.getMvPerCount())- (Vcc/2)) * 5.4054; // noise 20mV absolute without filter capacitor.->~100mA "blind"
|
12 | mVopamp *= adc.getMvPerCount();
|
13 | #endif
|
Und measure_vcc() (war zu faul, das sauber selber zu schreiben, daher
Copy&Paste aus dem Netz):
1 | long measure_vcc() {
|
2 | // Read 1.1V reference against AVcc
|
3 | // set the reference to Vcc and the measurement to the internal 1.1V reference
|
4 | ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
|
5 |
|
6 | delay(2); // Wait for Vref to settle
|
7 | ADCSRA |= _BV(ADSC); // Start conversion
|
8 | while (bit_is_set(ADCSRA,ADSC)); // measuring
|
9 |
|
10 | uint8_t low = ADCL; // must read ADCL first - it then locks ADCH
|
11 | uint8_t high = ADCH; // unlocks both
|
12 |
|
13 | long result = (high<<8) | low;
|
14 |
|
15 | result = 1125300L / result; // Calculate Vcc (in mV); 1125300 = 1.1*1023*1000
|
16 | return (result); // Vcc in millivolts
|
17 | }
|
Die Variablen sind einigermaßen sprechend deklariert, damit sollte der
Rechenweg klar sein. Du musst jetzt eigentlich nur die ADC-Werte vom
internen ADC verwenden und die zugöhrigen Werte anpassen.
Edit: Ups, hab den Code zwar für Shunt/Hall-Sensor strukturiert, aber
die eigentlichen Berechnungen für den ACS im Single-Ended-Modus schon
entsorgt gehabt (habe einen 1:1 Spannungsteiler für Vcc/2 am
differentiellen ADC-Eingang) - der ACS ist mir zu ungenau im Vergleich
zum Shunt, 0-100mA sieht man gar nicht, erst danach geht's los (siehe
Bild). Nachgepflegt.