Mäta spänning & ström med Arduino

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
rolex42
Inlägg: 523
Blev medlem: 11 augusti 2009, 17:12:49
Ort: Uppsala

Mäta spänning & ström med Arduino

Inlägg av rolex42 »

Jag tänker bygga olika apparater som mäter spänning & ström. Exvis solcellsregulator. Det jag märkt är att det är inte helt enkelt att mäta med någorlunda god nogrannhet. Här kommer en liten sammanställning av mina tester och slutsatser som jag hoppas få kommentarer på.

I de fall man (mha Arduino) vill mäta spänning och ström någorlunda exakt kommer man ganska snart till slutsatsen att de flesta exempel & tutorials inte ger några bra mätvärden. Exvis utgår många exempel från att den interna 5V-spänningen är exakt 5 volt, vilket den inte alltid är.
I en del andra exempel använder man då den interna 1.1V referensen men inte heller den är exakt (se stycke ADC Characteristics i http://www.atmel.com/Images/doc8161.pdf). Ett exempel där 1.1V referensen används (med mindre bra resultat) http://www.arduino.cc/playground/Main/CurrentSensing.

Experiment
Vid behov finns läsning om mätning på en analog ingång http://arduino.cc/it/Reference/AnalogReference.

I experimenten nedan vill vi kunna variera den interna 5V spänningen en aning mellan de olika testerna. Detta för att vi vill kunna mäta ”rätt” analog inspänning oavsett andra omständigheter.
I mitt fall använder jag olika USB-kablar. Vissa tunna USB-kablar ger en lägre spänning.
I samtliga mina experiment utgår jag från att mitt spänningsaggregat är "sanningen". Det är såklart inte sant men det duger i de här experimenten.

Experiment #1a
Mätning med 5V referens (DEFAULT).
experiment1a.JPG
Power supply kopplad till analog ingång. Med exakt samma spänning (4.0 volt) mäter vi värdet på ingången med de olika intern 5V (olika USB-kablar).
Trots att vi har exakt samma spänning på analoga ingången kommer vi att få olika värden på avläsningen eftersom Arduino använder den interna 5v som en referens vid mätningen.


Experiment #1b
Användning av Arduinos interna 1.1V referens.
ATmega_ADC_characteristics.JPG
Anslut en voltmeter till pinne 5V och kör följande program och jämför.
Prova oxå med olika Arduinon och jämför.

Kod: Markera allt

void loop(){ 
  long   InternalVcc    = readInternalVcc();
  Serial.print("InternalVcc: ");
  Serial.print(InternalVcc, DEC);
  Serial.println("");
  delay(1000);
} 
long readInternalVcc() { 
  long result;
  ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
  delay(2);                                                    // Wait for Vref to settle
  ADCSRA |= _BV(ADSC);                                         // Convert
  while (bit_is_set(ADCSRA,ADSC));
  result = ADCL;
  result |= ADCH<<8;
  result = 1126400L / result;                                  // Back-calculate AVcc in mV
  return result;
} 
Experiment #2
Med hjälp av en mycket noggrann spänningsreferens ta reda på Arduinons egentliga värde på 1.1 volt referens.
TL431 ger 2.495 volt med en viss noggrannhet som specificeras i databladet. Några vanliga värden är 0.5%, 1% & 2%. Man bör använda 1% eller noggrannare. Det måste flöda minst 1mA genom TL431 för att den ska fungera. Därför ska motståndet R inte vara för stort. Ett värde runt 1kohm bör fungera. I=2.5/1000=2.5mA.
experiment2.JPG
I fallet med en National LM431BCZ är spänningen mellan 2.470 & 2.520. Tillräckligt noggrant för att vi ska anse det vara 2.5V. I Arduino-programmet läser vi av analoga ingången och kan därmed ta reda på vilket värde den interna 1.1V referensen egentligen har.
I mitt fall när jag har fler än en Arduino görs detta för samtliga genom att numrera dem var och en och sedan dokumentera värdena i en tabell.
Med följande kalibreringsprogram kan man ta reda på värdet för 1.1 volt referensen för varje enskild Arduino. Programmet är uppdelat på så sätt att man tar reda på den aktuella Arduinons korrekta 1.1 volt referens i två steg. Steg ett itererar från 1.0 till 1.2 volt och visar de värden som ligger nära den aktuella 2.5 volt som anslutits till analog ingång A0. När man fått fram ett ungefärligt värde övergår man till steg 2 genom att ange det nya värdet i början av koden (long ref_1_1volt = xxxxL;) och aktiverar int step = 2;. När man sedan exekverar ska värdet som visas vara mycket nära 2500.

Kod: Markera allt

long ref_1_1volt = 1068L; // Corrected 1.1 V reference in mV
/*
* To find the best value of the inernal 1.1V volt reference of the
* current Arduino unit you can execute the following two steps:
* 1/ Iterate to find values that match the voltage connected to input A0
* 2/ Set the value of 1.1 ref and see if input A0 reads correct after setting
*    the ref_1_1volt above.
*/
//int step = 1;
int step = 2;
long sensorValue;
void setup() {
  pinMode(A0, INPUT);
  Serial.begin(57600);
}
void loop() {
  sensorValue = analogRead(A0);
  if (step == 1) {
    Serial.println("one");
    long ref = 0;
    long v = 0;
    // Iterate from 1.0 to 1.2 volt
    for (long i=1000; i<=1200; i++) {
      ref_1_1volt = i;
      v = sensorValue * readVcc() /1024;
      if (v < 2505 && v > 2495) {
        Serial.print(" adjusted 1.1 ref: "); Serial.print(ref_1_1volt);
        Serial.print(" => "); Serial.print(v);
        ref = ref_1_1volt;
      }
    }
    ref_1_1volt = ref;
  } else {
    Serial.print(" calibrated internalVcc: ");  Serial.print(readVcc());
    Serial.print(" input ADC: ");  Serial.print(sensorValue);
    Serial.print(" adjusted input volt: ");  Serial.print(sensorValue * readVcc() /1024);
  }
  Serial.println(" ");
  delay(1000);
}
// Read 1.1V reference against AVcc
long readVcc() {   
  long result;   // Read 1.1V reference against AVcc
  ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);   
  delay(2); // Wait for Vref to settle
  ADCSRA |= _BV(ADSC); // Convert
  while (bit_is_set(ADCSRA,ADSC));   
  result = ADCL;   
  result |= ADCH<<8;   
  // Use an adjusted value for 1.1 volt ref.
  result = ref_1_1volt * 1024L / result; // Back-calculate AVcc in mV
  return result; 
}
Om man vill kan man lagra denna information i EEPROM för varje enskild Arduino så att man slipper ange värdet i koden.

Experiment #4
Om den interna 1.1volt referensen inte är tillräckligt bra kan man använda en extern referens kopplad till ingången Aref.
experiment4.JPG
Det finns olika referenser som är mycket exakta (ex REF02, TL431 & spänningsdelare). Om man använder TL431 bör man tänka på att motstånden i spänningsdelaren har en noggrannhet som påverkar den totala noggrannheten förutom noggrannheten i TL431. Använd helst 0.1% motstånd el nogrannare.
Oavsett vilken referens man har måste man dessutom försäkra sig om att man har mellan 7 & 12 volt matning till Arduinon.
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
bearing
Inlägg: 11676
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Re: Mäta spänning & ström med Arduino

Inlägg av bearing »

Intressant!
Om jag förstår detta rätt varierar alltså själva "grundspänningen" ganska mycket mellan olika exemplar. "Grundspänningen" ligger sedan relativt stadigt vid varierande temperatur och matningsspänning, enligt kurvan i "typical characteristics".

Vilka är de största och minsta värdena på Vref du mätt upp?

AD-omvandlaren har ju ungefär 1 promille upplösning, har du funderat på att använda en extern spänningsreferens med bättre än 1 promilles tolerans?

Min erfarenhet är att AD-omvandlarens resultat hoppar en del från omvandling till omvandling. Jag brukar summera flera samplingar för att få ett medelvärde (t.ex summera 64 samplingar för att få ett "16bit-resultat"). Det kanske vore en idé att använda medelvärden i ditt kalibreringsprogram, så att inte någon "glitch" gör att ref_1_1volt verkar OK när den egentligen inte är det.

Har du provat att använda "Sleep Mode Noise Canceler"? Enligt databladet ska resultatet bli bättre, antagligen eftersom att det inte sker lika mycket "aktivitet" inuti kapseln.
Användarvisningsbild
Icecap
Inlägg: 26652
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Mäta spänning & ström med Arduino

Inlägg av Icecap »

Man behöver ofta att ha en kondensator på en AD-ingång då de flesta mikroprocessorer använder kapacitiv spänningsdelare i deras AD-omvandlare. Rekommenderas i databladet...
rolex42
Inlägg: 523
Blev medlem: 11 augusti 2009, 17:12:49
Ort: Uppsala

Re: Mäta spänning & ström med Arduino

Inlägg av rolex42 »

bearing skrev: Vilka är de största och minsta värdena på Vref du mätt upp?
Jag har 2 Duemilanove som har värdena 1060 resp 1068 och en Uno med värdet 1112.
bearing skrev: AD-omvandlaren har ju ungefär 1 promille upplösning, har du funderat på att använda en extern spänningsreferens med bättre än 1 promilles tolerans?
Jag hade tänkt mäta spänning och ström med en decimals nogrannhet. Upplösningen på Arduinons ADC räcker bra för mig.
bearing skrev: Min erfarenhet är att AD-omvandlarens resultat hoppar en del från omvandling till omvandling. Jag brukar summera flera samplingar för att få ett medelvärde (t.ex summera 64 samplingar för att få ett "16bit-resultat"). Det kanske vore en idé att använda medelvärden i ditt kalibreringsprogram, så att inte någon "glitch" gör att ref_1_1volt verkar OK när den egentligen inte är det.
Ja, det har jag sett är ganska vanligt. Ev kommer jag att göra så i mina "slutliga" lösningar men fn vill jag se alla glitchar och fel och försöka rätta till dem. Det får väl bli kondensatorer på ingångarna oxå som Icecap föreslår.
bearing skrev: Har du provat att använda "Sleep Mode Noise Canceler"? Enligt databladet ska resultatet bli bättre, antagligen eftersom att det inte sker lika mycket "aktivitet" inuti kapseln.
Verkar vettigt att kolla på ...

Här är ett exempel på steg två i kalibreringsprogrammet efter att jag fått fram den aktuella Arduinons 1.1 ref (Vint) = 1112

Kod: Markera allt

 calibrated internalVcc: 4744 input ADC: 539 adjusted input volt: 2486 
 calibrated internalVcc: 4744 input ADC: 542 adjusted input volt: 2500 
 calibrated internalVcc: 4744 input ADC: 542 adjusted input volt: 2500 
 calibrated internalVcc: 4744 input ADC: 541 adjusted input volt: 2495 
 calibrated internalVcc: 4744 input ADC: 541 adjusted input volt: 2495 
 calibrated internalVcc: 4744 input ADC: 541 adjusted input volt: 2495 
 calibrated internalVcc: 4744 input ADC: 542 adjusted input volt: 2500 
 calibrated internalVcc: 4744 input ADC: 542 adjusted input volt: 2500 
 calibrated internalVcc: 4764 input ADC: 541 adjusted input volt: 2506 
 calibrated internalVcc: 4724 input ADC: 542 adjusted input volt: 2510 
 calibrated internalVcc: 4724 input ADC: 541 adjusted input volt: 2495 
 calibrated internalVcc: 4724 input ADC: 541 adjusted input volt: 2495 
 calibrated internalVcc: 4744 input ADC: 541 adjusted input volt: 2495 
 calibrated internalVcc: 4744 input ADC: 541 adjusted input volt: 2495 
 calibrated internalVcc: 4744 input ADC: 542 adjusted input volt: 2500 
 calibrated internalVcc: 4744 input ADC: 542 adjusted input volt: 2500 
 calibrated internalVcc: 4744 input ADC: 542 adjusted input volt: 2500 
 calibrated internalVcc: 4744 input ADC: 542 adjusted input volt: 2500 
 calibrated internalVcc: 4744 input ADC: 542 adjusted input volt: 2500 
 calibrated internalVcc: 4744 input ADC: 541 adjusted input volt: 2495 
 calibrated internalVcc: 4744 input ADC: 541 adjusted input volt: 2506 
 calibrated internalVcc: 4744 input ADC: 541 adjusted input volt: 2506 
 calibrated internalVcc: 4724 input ADC: 542 adjusted input volt: 2510 
 calibrated internalVcc: 4724 input ADC: 541 adjusted input volt: 2495 
 calibrated internalVcc: 4724 input ADC: 541 adjusted input volt: 2506 
 calibrated internalVcc: 4744 input ADC: 542 adjusted input volt: 2500 
 calibrated internalVcc: 4744 input ADC: 542 adjusted input volt: 2510 
 calibrated internalVcc: 4744 input ADC: 541 adjusted input volt: 2506 
 calibrated internalVcc: 4724 input ADC: 541 adjusted input volt: 2495 
 calibrated internalVcc: 4724 input ADC: 542 adjusted input volt: 2500 
rolex42
Inlägg: 523
Blev medlem: 11 augusti 2009, 17:12:49
Ort: Uppsala

Re: Mäta spänning & ström med Arduino

Inlägg av rolex42 »

Hittade följande http://www.arduino.cc/cgi-bin/yabb2/YaB ... 478456/8#8 när jag skulle kolla upp "Sleep Mode Noise Canceler". Coding Badly gör lite annorlunda för att få fram interna 1.1 V referensen (Vint).

...
Användarvisningsbild
PHermansson
EF Sponsor
Inlägg: 4340
Blev medlem: 22 december 2004, 00:46:38
Ort: Särestad Grästorp
Kontakt:

Re: Mäta spänning & ström med Arduino

Inlägg av PHermansson »

Det ska väl finnas en induktans också?
21936.png
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
bearing
Inlägg: 11676
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Re: Mäta spänning & ström med Arduino

Inlägg av bearing »

Ja, ifall man använder VCC som referens, och vill jämna ut "bullret" som orsakas av den digitala delen. "Ferrite bead" brukar komponenten kallas. Om extern spänningsreferens på t.ex. 4.096V används, behövs inte någon ferrit.
rolex42 skrev:Jag hade tänkt mäta spänning och ström med en decimals nogrannhet. Upplösningen på Arduinons ADC räcker bra för mig.
Jag menade att när du kalibrerar kan det vara bra att ha en spänningsreferenskrets som har bättre tolerans än 1%, eftersom att 1% motsvarar ca 5 steg på AD-resultatet vid 2,5V och 5V matning. Men om du har en nykalibrerad multimeter går det ju lika bra att knappa in den uppmätta spänningen i programmet, istället för att skaffa en 0,1%-referens.

Bra tråd. Jag har funderat på att använda Attiny25 i en batteriövervakare. Hade tänkt att prova utan kalibrering först, men jag förstår nu att referensen behöver kalibreras för att ge tillräcklig noggrannhet.
rolex42
Inlägg: 523
Blev medlem: 11 augusti 2009, 17:12:49
Ort: Uppsala

Re: Mäta spänning & ström med Arduino

Inlägg av rolex42 »

Vad jag kan se har inte Arduino (http://arduino.cc/it/uploads/Main/ardui ... ematic.pdf, http://arduino.cc/en/uploads/Main/ardui ... ematic.pdf) någon induktor (el ferrite bead). Det verkar finnas kloner däremot som har http://www.olimex.com/dev/DUINO/OLIMEXI ... on%20B.pdf.
Bättre spänningsreferenser verkar dyra (90 kr och uppåt om jag söker på Elfa). Man kan köpa en AD780AN (High accuracy: 2.5 V or 3.0 V ±1 mV max) för ca 40kr som bör duga i mitt fall. Jag får beställa något lämpligt till min kalibrering.

Åter till problemet. Jag har några Arduinos som jag vill använda och jag vill ha så få yttre komponeter som möjligt. Om jag ska använda Arduinons 5V referens (DEFAULT) och justera med interna 1.1V referensen behöver jag en kondensator på Aref. Sen skulle jag behöva använda "Sleep Mode Noise Canceler" och då inser jag att jag kan på tok för lite om Arduino. Jag behöver lägga rätt många timmar å försöka förstå ADMUX, sleep & interrupt mm. Just nu känns det som att det nog är billig med 40kr för en AD780 som Extern ref.
bearing
Inlägg: 11676
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Re: Mäta spänning & ström med Arduino

Inlägg av bearing »

Jag tror inte det är så svårt. Om man skriver direkt till registrena behövs det nog bara 5 rader typ. Sen vet jag inte hur det blir på en Arduino, men jag antar att det går lika bra att skriva direkt till registrena på en sån som i avr-gcc.

Verkar som att att en timer snurrar och ger interrupt på Arduinon, vilket gör att det blir krångligare. Men om det går att stänga av timern så borde det bara vara att: ställa in ADC, ställa in sleepmode, skriva sleep, och sedan är omvandlingen klar när processorn vaknar.
rolex42
Inlägg: 523
Blev medlem: 11 augusti 2009, 17:12:49
Ort: Uppsala

Re: Mäta spänning & ström med Arduino

Inlägg av rolex42 »

Ja det går nog att göra det som behövs även m Arduino, men det är just det jag inte har någon kunskap om.
Jag läste http://www.embedds.com/adc-on-atmega328-part-1/ och blev inte mycket klokare. Annars är det en ganska bra tutorial.
ToPNoTCH
Inlägg: 5152
Blev medlem: 21 december 2009, 17:59:48

Re: Mäta spänning & ström med Arduino

Inlägg av ToPNoTCH »

Du kan väl använda arduinons möjlighet till extern referens ?

Kod: Markera allt

analogReference(EXTERNAL);
rolex42
Inlägg: 523
Blev medlem: 11 augusti 2009, 17:12:49
Ort: Uppsala

Re: Mäta spänning & ström med Arduino

Inlägg av rolex42 »

Ja, jag har beställt AD780AN.
Under tiden jag väntar på leverans tänkte jag försöka mig på "Sleep Mode Noise Canceler" men det går trögt.
rolex42
Inlägg: 523
Blev medlem: 11 augusti 2009, 17:12:49
Ort: Uppsala

Re: Mäta spänning & ström med Arduino

Inlägg av rolex42 »

Jag ska först säga att mätningen ovan (steg 2 i kalibrering) som bla visar "... adjusted input volt: 25xx" är helt OK för mina projekt.

Men eftersom det hela är ganska intressant gjorde jag några ytterligare tester efter att läst (http://www.arduino.cc/cgi-bin/yabb2/YaB ... 1295736263)
In my experimenting, jumping analog readings are caused by...
1. General digital noise. Cured by adding a 0.1 uF capacitor across VCC and GND as close to the processor as possible. Already present on Arduino.
2. General digital noise. Cured by adding a capacitor from AREF to GND and using the appropriate analog reference setting
3. General digital noise. Cured by adding filtering to the analog input.
4. CPU digital noise. Cured by using Noise Reduction Mode.
47 uF kondensator på pinne Aref.

Kod: Markera allt

 calibrated internalVcc: 4744 input ADC: 544 adjusted input volt: 2520 
 calibrated internalVcc: 4744 input ADC: 542 adjusted input volt: 2510 
 calibrated internalVcc: 4744 input ADC: 542 adjusted input volt: 2510 
 calibrated internalVcc: 4744 input ADC: 542 adjusted input volt: 2510 
 calibrated internalVcc: 4744 input ADC: 542 adjusted input volt: 2510 
 calibrated internalVcc: 4744 input ADC: 542 adjusted input volt: 2510 
 calibrated internalVcc: 4744 input ADC: 541 adjusted input volt: 2506 
 calibrated internalVcc: 4744 input ADC: 541 adjusted input volt: 2506 
 calibrated internalVcc: 4744 input ADC: 541 adjusted input volt: 2506 
 calibrated internalVcc: 4744 input ADC: 542 adjusted input volt: 2500 
 calibrated internalVcc: 4744 input ADC: 542 adjusted input volt: 2500 
 calibrated internalVcc: 4744 input ADC: 542 adjusted input volt: 2510 
 calibrated internalVcc: 4744 input ADC: 542 adjusted input volt: 2510 
 calibrated internalVcc: 4744 input ADC: 542 adjusted input volt: 2510 
 calibrated internalVcc: 4744 input ADC: 542 adjusted input volt: 2510 
 calibrated internalVcc: 4744 input ADC: 542 adjusted input volt: 2510 
 calibrated internalVcc: 4744 input ADC: 542 adjusted input volt: 2510 
 calibrated internalVcc: 4744 input ADC: 542 adjusted input volt: 2510 
 calibrated internalVcc: 4744 input ADC: 542 adjusted input volt: 2500 
 calibrated internalVcc: 4744 input ADC: 542 adjusted input volt: 2500 
 calibrated internalVcc: 4744 input ADC: 542 adjusted input volt: 2500 
 calibrated internalVcc: 4744 input ADC: 541 adjusted input volt: 2495 
 calibrated internalVcc: 4744 input ADC: 542 adjusted input volt: 2500 
 calibrated internalVcc: 4744 input ADC: 541 adjusted input volt: 2506 
 calibrated internalVcc: 4744 input ADC: 542 adjusted input volt: 2500 
 calibrated internalVcc: 4744 input ADC: 542 adjusted input volt: 2510 
 calibrated internalVcc: 4744 input ADC: 542 adjusted input volt: 2510 
 calibrated internalVcc: 4744 input ADC: 542 adjusted input volt: 2510 
 calibrated internalVcc: 4764 input ADC: 541 adjusted input volt: 2506 
 calibrated internalVcc: 4744 input ADC: 542 adjusted input volt: 2510 
 calibrated internalVcc: 4744 input ADC: 541 adjusted input volt: 2495 
 calibrated internalVcc: 4744 input ADC: 541 adjusted input volt: 2495 
 calibrated internalVcc: 4744 input ADC: 542 adjusted input volt: 2500 
 calibrated internalVcc: 4744 input ADC: 542 adjusted input volt: 2500 
 calibrated internalVcc: 4744 input ADC: 542 adjusted input volt: 2510 
 calibrated internalVcc: 4744 input ADC: 542 adjusted input volt: 2510 
 calibrated internalVcc: 4744 input ADC: 542 adjusted input volt: 2510 
 calibrated internalVcc: 4744 input ADC: 542 adjusted input volt: 2510 
 calibrated internalVcc: 4744 input ADC: 542 adjusted input volt: 2510 
 calibrated internalVcc: 4744 input ADC: 541 adjusted input volt: 2506 
 calibrated internalVcc: 4744 input ADC: 542 adjusted input volt: 2510 
 calibrated internalVcc: 4744 input ADC: 541 adjusted input volt: 2506 
 calibrated internalVcc: 4744 input ADC: 541 adjusted input volt: 2506 
 calibrated internalVcc: 4744 input ADC: 541 adjusted input volt: 2506 
 calibrated internalVcc: 4744 input ADC: 542 adjusted input volt: 2500 
 calibrated internalVcc: 4744 input ADC: 542 adjusted input volt: 2500 
 calibrated internalVcc: 4744 input ADC: 541 adjusted input volt: 2506 
 calibrated internalVcc: 4744 input ADC: 542 adjusted input volt: 2510 
 calibrated internalVcc: 4744 input ADC: 542 adjusted input volt: 2510 
 calibrated internalVcc: 4744 input ADC: 542 adjusted input volt: 2510 
 calibrated internalVcc: 4744 input ADC: 542 adjusted input volt: 2510 
 calibrated internalVcc: 4744 input ADC: 542 adjusted input volt: 2510 
 calibrated internalVcc: 4744 input ADC: 542 adjusted input volt: 2510 
 calibrated internalVcc: 4744 input ADC: 542 adjusted input volt: 2510 
 calibrated internalVcc: 4744 input ADC: 542 adjusted input volt: 2500 
 calibrated internalVcc: 4744 input ADC: 541 adjusted input volt: 2506 
 calibrated internalVcc: 4744 input ADC: 542 adjusted input volt: 2500 
 calibrated internalVcc: 4744 input ADC: 542 adjusted input volt: 2510 
 calibrated internalVcc: 4744 input ADC: 541 adjusted input volt: 2506 
 calibrated internalVcc: 4744 input ADC: 541 adjusted input volt: 2506 
 calibrated internalVcc: 4744 input ADC: 542 adjusted input volt: 2500 
 calibrated internalVcc: 4744 input ADC: 541 adjusted input volt: 2506 
4.7uF konding på Analog ingång.

Kod: Markera allt

 calibrated internalVcc: 4744 input ADC: 545 adjusted input volt: 2524 
 calibrated internalVcc: 4744 input ADC: 542 adjusted input volt: 2510 
 calibrated internalVcc: 4744 input ADC: 541 adjusted input volt: 2495 
 calibrated internalVcc: 4744 input ADC: 541 adjusted input volt: 2495 
 calibrated internalVcc: 4744 input ADC: 541 adjusted input volt: 2495 
 calibrated internalVcc: 4744 input ADC: 542 adjusted input volt: 2500 
 calibrated internalVcc: 4744 input ADC: 541 adjusted input volt: 2506 
 calibrated internalVcc: 4744 input ADC: 542 adjusted input volt: 2500 
 calibrated internalVcc: 4764 input ADC: 541 adjusted input volt: 2506 
 calibrated internalVcc: 4744 input ADC: 542 adjusted input volt: 2510 
 calibrated internalVcc: 4744 input ADC: 542 adjusted input volt: 2510 
 calibrated internalVcc: 4744 input ADC: 541 adjusted input volt: 2506 
 calibrated internalVcc: 4744 input ADC: 542 adjusted input volt: 2510 
 calibrated internalVcc: 4744 input ADC: 541 adjusted input volt: 2506 
 calibrated internalVcc: 4744 input ADC: 542 adjusted input volt: 2500 
 calibrated internalVcc: 4744 input ADC: 541 adjusted input volt: 2495 
 calibrated internalVcc: 4744 input ADC: 542 adjusted input volt: 2500 
 calibrated internalVcc: 4744 input ADC: 541 adjusted input volt: 2506 
 calibrated internalVcc: 4744 input ADC: 541 adjusted input volt: 2506 
 calibrated internalVcc: 4744 input ADC: 541 adjusted input volt: 2495 
 calibrated internalVcc: 4764 input ADC: 541 adjusted input volt: 2506 
 calibrated internalVcc: 4764 input ADC: 541 adjusted input volt: 2506 
 calibrated internalVcc: 4744 input ADC: 541 adjusted input volt: 2506 
 calibrated internalVcc: 4744 input ADC: 541 adjusted input volt: 2506 
 calibrated internalVcc: 4744 input ADC: 542 adjusted input volt: 2510 
 calibrated internalVcc: 4744 input ADC: 542 adjusted input volt: 2510 
 calibrated internalVcc: 4744 input ADC: 541 adjusted input volt: 2506 
 calibrated internalVcc: 4744 input ADC: 541 adjusted input volt: 2495 
 calibrated internalVcc: 4744 input ADC: 541 adjusted input volt: 2495 
 calibrated internalVcc: 4744 input ADC: 541 adjusted input volt: 2495 
 calibrated internalVcc: 4744 input ADC: 542 adjusted input volt: 2510 
 calibrated internalVcc: 4744 input ADC: 541 adjusted input volt: 2506 
 calibrated internalVcc: 4744 input ADC: 541 adjusted input volt: 2506 
 calibrated internalVcc: 4744 input ADC: 542 adjusted input volt: 2500 
 calibrated internalVcc: 4744 input ADC: 541 adjusted input volt: 2506 
 calibrated internalVcc: 4744 input ADC: 541 adjusted input volt: 2506 
 calibrated internalVcc: 4744 input ADC: 541 adjusted input volt: 2506 
 calibrated internalVcc: 4744 input ADC: 542 adjusted input volt: 2510 
 calibrated internalVcc: 4744 input ADC: 542 adjusted input volt: 2510 
 calibrated internalVcc: 4744 input ADC: 542 adjusted input volt: 2510 
 calibrated internalVcc: 4744 input ADC: 542 adjusted input volt: 2500 
 calibrated internalVcc: 4744 input ADC: 541 adjusted input volt: 2495 
 calibrated internalVcc: 4744 input ADC: 542 adjusted input volt: 2500 
 calibrated internalVcc: 4744 input ADC: 541 adjusted input volt: 2495 
 calibrated internalVcc: 4744 input ADC: 541 adjusted input volt: 2495 
 calibrated internalVcc: 4764 input ADC: 541 adjusted input volt: 2506 
 calibrated internalVcc: 4744 input ADC: 541 adjusted input volt: 2506 
 calibrated internalVcc: 4744 input ADC: 541 adjusted input volt: 2495 
 calibrated internalVcc: 4744 input ADC: 541 adjusted input volt: 2506 
 calibrated internalVcc: 4744 input ADC: 542 adjusted input volt: 2510 
 calibrated internalVcc: 4744 input ADC: 542 adjusted input volt: 2510 
 calibrated internalVcc: 4744 input ADC: 541 adjusted input volt: 2506 
 calibrated internalVcc: 4744 input ADC: 541 adjusted input volt: 2506 
 calibrated internalVcc: 4744 input ADC: 541 adjusted input volt: 2506 
 calibrated internalVcc: 4744 input ADC: 542 adjusted input volt: 2500 
 calibrated internalVcc: 4744 input ADC: 541 adjusted input volt: 2506 
 calibrated internalVcc: 4744 input ADC: 541 adjusted input volt: 2506 
 calibrated internalVcc: 4744 input ADC: 541 adjusted input volt: 2506 
 calibrated internalVcc: 4744 input ADC: 541 adjusted input volt: 2506 
 calibrated internalVcc: 4744 input ADC: 541 adjusted input volt: 2495 
 calibrated internalVcc: 4744 input ADC: 542 adjusted input volt: 2510 
 calibrated internalVcc: 4744 input ADC: 541 adjusted input volt: 2506 
 calibrated internalVcc: 4744 input ADC: 542 adjusted input volt: 2510 
 calibrated internalVcc: 4744 input ADC: 541 adjusted input volt: 2506 
 calibrated internalVcc: 4744 input ADC: 542 adjusted input volt: 2510 
 calibrated internalVcc: 4744 input ADC: 541 adjusted input volt: 2495 
 calibrated internalVcc: 4744 input ADC: 541 adjusted input volt: 2506 
 calibrated internalVcc: 4744 input ADC: 541 adjusted input volt: 2495 
 calibrated internalVcc: 4744 input ADC: 541 adjusted input volt: 2506 
9V batteri ansluts till DC-kontakten

Kod: Markera allt

...
 calibrated internalVcc: 4744 input ADC: 542 adjusted input volt: 2500 
 calibrated internalVcc: 4764 input ADC: 541 adjusted input volt: 2506 
 calibrated internalVcc: 4744 input ADC: 542 adjusted input volt: 2510 
 calibrated internalVcc: 5060 input ADC: 509 adjusted input volt: 2515 
 calibrated internalVcc: 5060 input ADC: 509 adjusted input volt: 2515 
 calibrated internalVcc: 5060 input ADC: 509 adjusted input volt: 2515 
 calibrated internalVcc: 5060 input ADC: 509 adjusted input volt: 2515 
 calibrated internalVcc: 5060 input ADC: 509 adjusted input volt: 2515 
 calibrated internalVcc: 5060 input ADC: 509 adjusted input volt: 2515 
 calibrated internalVcc: 5060 input ADC: 509 adjusted input volt: 2515 
 calibrated internalVcc: 5060 input ADC: 509 adjusted input volt: 2515 
 calibrated internalVcc: 5060 input ADC: 509 adjusted input volt: 2515 
 calibrated internalVcc: 5060 input ADC: 509 adjusted input volt: 2515 
 calibrated internalVcc: 5060 input ADC: 509 adjusted input volt: 2515 
 calibrated internalVcc: 5060 input ADC: 509 adjusted input volt: 2515 
 calibrated internalVcc: 5060 input ADC: 509 adjusted input volt: 2515 
 calibrated internalVcc: 5060 input ADC: 509 adjusted input volt: 2515 
 calibrated internalVcc: 5060 input ADC: 509 adjusted input volt: 2515 
 calibrated internalVcc: 5060 input ADC: 509 adjusted input volt: 2515 
 calibrated internalVcc: 5060 input ADC: 509 adjusted input volt: 2515 
 calibrated internalVcc: 5060 input ADC: 509 adjusted input volt: 2515 
 calibrated internalVcc: 5060 input ADC: 509 adjusted input volt: 2515 
 calibrated internalVcc: 5060 input ADC: 509 adjusted input volt: 2515 
 calibrated internalVcc: 5060 input ADC: 509 adjusted input volt: 2515 
 calibrated internalVcc: 5060 input ADC: 509 adjusted input volt: 2515 
 calibrated internalVcc: 5060 input ADC: 509 adjusted input volt: 2515 
 calibrated internalVcc: 5060 input ADC: 509 adjusted input volt: 2515 
 calibrated internalVcc: 5060 input ADC: 509 adjusted input volt: 2515 
 calibrated internalVcc: 5060 input ADC: 509 adjusted input volt: 2515 
 calibrated internalVcc: 5060 input ADC: 509 adjusted input volt: 2515 
 calibrated internalVcc: 5060 input ADC: 509 adjusted input volt: 2515 
 calibrated internalVcc: 5060 input ADC: 509 adjusted input volt: 2515 
 calibrated internalVcc: 5060 input ADC: 509 adjusted input volt: 2515 
 calibrated internalVcc: 5060 input ADC: 509 adjusted input volt: 2515 
 calibrated internalVcc: 5060 input ADC: 509 adjusted input volt: 2515 
 calibrated internalVcc: 5060 input ADC: 509 adjusted input volt: 2515 
 calibrated internalVcc: 5060 input ADC: 509 adjusted input volt: 2515 
 calibrated internalVcc: 5060 input ADC: 509 adjusted input volt: 2515 
 calibrated internalVcc: 5060 input ADC: 509 adjusted input volt: 2515 
 calibrated internalVcc: 5060 input ADC: 509 adjusted input volt: 2515 
 calibrated internalVcc: 5060 input ADC: 509 adjusted input volt: 2515 
 calibrated internalVcc: 5060 input ADC: 509 adjusted input volt: 2515 
 calibrated internalVcc: 5060 input ADC: 509 adjusted input volt: 2515 
 calibrated internalVcc: 5060 input ADC: 509 adjusted input volt: 2515 
 calibrated internalVcc: 5060 input ADC: 509 adjusted input volt: 2515 
 calibrated internalVcc: 5060 input ADC: 509 adjusted input volt: 2515 
 calibrated internalVcc: 5060 input ADC: 509 adjusted input volt: 2515 
 calibrated internalVcc: 5060 input ADC: 509 adjusted input volt: 2515 
 calibrated internalVcc: 5060 input ADC: 509 adjusted input volt: 2515 
 calibrated internalVcc: 5060 input ADC: 509 adjusted input volt: 2515 
 calibrated internalVcc: 5060 input ADC: 509 adjusted input volt: 2515 
 calibrated internalVcc: 5060 input ADC: 509 adjusted input volt: 2515 
 calibrated internalVcc: 5060 input ADC: 509 adjusted input volt: 2515 
 calibrated internalVcc: 5060 input ADC: 509 adjusted input volt: 2515 
 calibrated internalVcc: 5060 input ADC: 509 adjusted input volt: 2515 
 calibrated internalVcc: 5060 input ADC: 509 adjusted input volt: 2515 
 calibrated internalVcc: 5060 input ADC: 509 adjusted input volt: 2515 
 calibrated internalVcc: 5060 input ADC: 509 adjusted input volt: 2515 
 calibrated internalVcc: 5060 input ADC: 509 adjusted input volt: 2515 
 calibrated internalVcc: 5060 input ADC: 509 adjusted input volt: 2515 
 calibrated internalVcc: 5060 input ADC: 509 adjusted input volt: 2515 
 calibrated internalVcc: 5060 input ADC: 509 adjusted input volt: 2515 
 calibrated internalVcc: 5060 input ADC: 509 adjusted input volt: 2515 
 calibrated internalVcc: 5060 input ADC: 509 adjusted input volt: 2515 
 calibrated internalVcc: 5060 input ADC: 509 adjusted input volt: 2515 
Som sagt är detta bra värden och stabilast blir det om man har en ordentlig spänningskälla, inte bara en "dålig" USB-kabel.
Exakt vilken slutsats man ska dra av detta vet jag inte men den Uno jag testkörde med påverkas tydligen av matnings-spänning.
Jag får lika stabila värden även om jag tar bort kondensatorerna.
bearing
Inlägg: 11676
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Re: Mäta spänning & ström med Arduino

Inlägg av bearing »

Intressant! jag har just fått liknande erfarenhet.

Jag kopplade en extern spänningsreferens på 4.096V till AREF på ATmega168. Gjorde ett program som läser spänningen på interna V_ref och skickar på UART. Har provat både med och utan noise reduction. Jag får exakt samma AD-resultat varje gång, oavsett metod, finns inte en glitch. Jag har aldrig testat med extern AREF tidigare, men nu förstår jag att en sådan förbättrar resultaten betydligt.

Omvandlingen av AD-resultat till spänning är mycket enkelt med 4.096V referens. Det är bara att summera 4 st omvandlingar, sedan är summan lika med spänningen i mV. Jag får AD-resultatet 277 varje gång, d.v.s summan blir 1108mV.

Jag tror inte du behöver bemöda dig med noise reduction, för jag har inte kunnat se någon skillnad med eller utan. Men det var ganska enkelt att ordna. Kortfattat:

Kod: Markera allt

static void init_ADC();
static void init_power_sleep();

//ADC interrupt
volatile uint16_t ADC_result;
ISR (ADC_vect)
{
  //Read result
  ADC_result = ADC; 
}

int main()
{
  init_power_sleep();
  init_ADC();

  sei();  //Enable interrupts

  for(;;)
  {
    //Start conversion
    asm volatile ("sleep"::);
  }
}

static void init_ADC()
{
  //External AREF is reference. Multiplexer set to read 1.1V internal reference.
  ADMUX = 0x0E;

  //Enable ADC with interrupt enabled.  Prescaler 64.
  ADCSRA = (1 << ADEN) | (1 << ADIF) | (1 << ADIE) | 0x6;

  ADCSRB = 0;
}

static void init_power_sleep()
{
  //Turn off every possible periferal, except USART0 and ADC
  PRR = ~((1 << PRUSART0) | (1 << PRADC));

  //Enable ADC Noise Reduction. Enable sleep.
  SMCR = (1 << SM0) | (1 << SE);
}
Dom "verksamma raderna" är alltså följande:

Kod: Markera allt

ADMUX = 0x0E;
ADCSRA = (1 << ADEN) | (1 << ADIF) | (1 << ADIE) | 0x6;
SMCR = (1 << SM0) | (1 << SE);
sei();
asm volatile ("sleep"::);
ADC_result = ADC;
rolex42
Inlägg: 523
Blev medlem: 11 augusti 2009, 17:12:49
Ort: Uppsala

Re: Mäta spänning & ström med Arduino

Inlägg av rolex42 »

Som avslutning på den här tråden tänkte jag visa hur man kan använda den korrigerade 1.1V referensen för att mäta spänning.
I det här fallet vill jag mäta spänning i ett 12VDC system. 2 likadana spänningsdelare ansluts till analog ingångar 4 & 5.
Motstånden är +/-1%.
Om man lyckas hitta ett korrekt värde för den aktuella 1.1V referensen (med kalibrering beskriven ovan) och har 1% motstånd borde dessa värden vara rätt OK.

Kod: Markera allt

// Voltage divider resistor values
#define R1 100L  // 100kohm
#define R2 33L   // 33kohm

int ref_1_1volt;// Calibrated 1.1 V reference in mV
long internalVcc;
long in4; // voltage #1
long in5; // voltage #2

void setup() {
  pinMode(A4, INPUT);  pinMode(A5, INPUT);
}

void loop() {
  // ref_1_1volt is a unique value for each individual Arduino
  ref_1_1volt = 1100; // or read from EEPROM
  in4 = analogRead(A4);
  in5 = analogRead(A5);
  internalVcc = readInternalVcc();
  voltage1 = in4 * internalVcc /1024;
  voltage2 = in5 * internalVcc /1024;
  // Voltage divider:   Vin = Vout*(R1+R2)/R2
  voltage1 = (voltage1*(R1+R2)/R2)/100; // deciVolt
  voltage2 = (voltage2*(R1+R2)/R2)/100; // deciVolt
  ...
}

// Read 1.1V reference against AVcc
long readInternalVcc() {
  long result;
  ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
  delay(2);                         // Wait for Vref to settle
  ADCSRA |= _BV(ADSC);              // Convert
  while (bit_is_set(ADCSRA,ADSC));
  result = ADCL;
  result |= ADCH<<8;
  // Use calibrated value for 1.1 volt ref.
  result = long(ref_1_1volt) * 1024L / result; // Back-calculate AVcc in mV
  return result;
}
Här ett exempel på mätvärden när solpanel laddar 12V batteri.

Kod: Markera allt

Date, Time, Vconsume, Vsun
2012-06-26,13:14:34,133,134
2012-06-26,13:14:36,134,135
2012-06-26,13:14:37,134,135
2012-06-26,13:14:38,134,136
2012-06-26,13:14:39,135,136
2012-06-26,13:14:40,135,136
2012-06-26,13:14:41,135,136
2012-06-26,13:14:42,135,136
2012-06-26,13:14:43,134,135
2012-06-26,13:14:44,134,135
2012-06-26,13:14:45,134,135
2012-06-26,13:14:46,135,136
2012-06-26,13:14:47,135,136
2012-06-26,13:14:48,136,137
2012-06-26,13:14:50,136,137
2012-06-26,13:14:51,136,138
2012-06-26,13:14:52,137,138
Skriv svar