Den analoga AREF-referensen | Arduino Shop and Tutorials
Mål
-
- Adc-konverterarnas upplösning.
- De interna jämförelsereferenserna i Arduino.
- Den externa AREF-referensen.
Material krävs.
Spanien | Spanien | Mexico | ||
---|---|---|---|---|
UNO Starter Kit | UNO Starter Kit | |||
MEGA Starter Kit | ||||
MEGA Starter Kit | MEGA Starter Kit | MEGA Starter Kit | MEGA Starter Kit | MEGA Starter Kit |
Analog till digital konvertering
I en tidigare session har vi redan sagt att Arduino har 6 analog till digital konverterare (ADC) som är stift A0 till A5, och vi sa att de kan omvandla spänningsvärden upp till högst 5V, vilket är referensspänningen på Arduino.
Vi sa också att en av de viktigaste egenskaperna hos omvandlaren är antalet bitar, vilket definierar med vilken finess vi kan kvantifiera omvandlingen till digital data. När det gäller Arduino är det 10 bitar som hanteras i de analoga grindarna, vilket innebär att upplösningen är 210 =1024 möjliga värden.
Desto högre upplösning, desto bättre är förmågan att approximera det verkliga värdet vars omvandling vi letar efter.
- Det är viktigt att förstå att en omvandling av en analog signal till digital alltid är en approximation, och även i den osannolika händelsen att det analoga värdet är exakt det som omvandlaren talar om för oss, har vi alltid en osäkerhet.
- På en Arduino-omvandlare med 10-bitars upplösning är varje mätsteg 5V/1024 = 0,0048828125 V, strax under 5mV, vilket innebär att den inte kan skilja mellan spänningsvärden vars skillnad är mindre än så.
Och utan att gå in på alltför många detaljer är det värt att säga att vad en ADC-omvandlare gör är att successivt jämföra den signal som vi vill kvantifiera vid ingången med en referensspänning som den jämför med.
Med andra ord ger en ADC inte absoluta värden, utan ger en kvantifierad jämförelse i förhållande till ett referensvärde. I sessionen med temperatursensorn TMP36 har vi alltså beräknat ingångsspänningen på ett av de analoga stiften som avläsningen multiplicerad med förhållandet mellan det maximala värdet av 5V-ingången och det maximala värdet som uppmätts av 1024-omvandlaren.
Då de signaler som vi normalt hanterar på Arduino ligger runt 5V, är det rimligt att jämföra mot 5V, eftersom branschen också har en hel rad sensorer vars maximala värde returnerar 5V.
Men i allt större utsträckning tillverkar industrin elektronik på 3,3 V, Arduino DUE är ett exempel på detta, och om vi använder våra ADC:er för att digitalisera toppsignaler på 3,3 V förlorar vi noggrannhet och upplösning, eftersom vi slösar bort en del av de möjliga jämförelserna, i själva verket en tredjedel.
I praktiken innebär 3,3 V som är den maximala ingångsspänningen jämfört med 5 V att vi aldrig kommer att få avläsningar som är större än 1 024 * 3,3 /5 = 675 och vi kommer fortfarande att ha ingångssteg på 5 V.
Men om omvandlaren är en spänningskomparator, om vi kan ändra spänningsvärdet vi jämför mot till 3,3 V, skulle stegen vara 3,3 V/1024 = 0,00322265625 eller 3,2 mV. Det innebär att vi har förbättrat upplösningen hos vår omvandlare utan att spendera ett öre.
Så i en idealisk situation bör jämförelsespänningen mot vilken vi utför omvandlingen från analogt till digitalt vara det högsta möjliga värdet av insignalen. För det är då vi får bästa möjliga upplösning med omvandlaren.
Killarna på Arduino var medvetna om det här problemet och det är därför de inkluderade en extern stift, som vi inte har använt hittills, som gör det möjligt att ansluta en extern referensspänning mot vilken signalen som vi läser av på våra A0 till A5-portar kommer att jämföras.
Denna stift är märkt AREF (analog referens) och ligger två stift ovanför det digitala stift 13:
Användning av den externa analoga referensen
Frågan om den analoga referensen som vi jämför proverna i grindarna A0-A6 är så viktig att Arduino tillhandahåller flera interna spänningar att jämföra med som vi kan aktivera för att ändra referens.
För att aktivera en intern referens på 1,1V på en Arduino UNO använder du instruktionen
analogReference(INTERNAL);
Om du använder en MEGA kan du använda uteslutande:
analogReference(INTERNAL1V1);
analogReference(INTERNAL2V56);
som kommer att aktivera referenser på 1,1V respektive 2,56V.
Om du använder DEFAULT-tangenten är du tillbaka till standardreferensen 5V på nästan alla Arduino-modeller.
analogReference(DEFAULT);
- Var försiktig med DEFAULT-referensen, för på DUE betyder det 3,3V eftersom det är dess referensspänning. Kontrollera detta innan du använder den.
När vi ansluter en referensspänning till AREF-stiftet måste vi tala om för Arduino att vi vill använda den. Det gör vi med instruktionen
analogReference(EXTERNAL);
Använd huvudet när du ändrar den analoga referensen, för om du inte är försiktig kommer du att äta Arduino till middag. Det är relativt lätt att ställa till det med vissa åtgärder som verkar oskyldiga:
- Säkerställ att om du använder en extern referens så är Arduinons och referensens GND:er desamma genom att koppla ihop dem. Om du inte gör detta har du en mycket dålig prognos vid den första ändringen.
- Använd inte under några omständigheter mindre än 0V på AREF-stiftet (ELLER en signal som varierar och kan ha negativa transienter) eftersom resultatet är oförutsägbart.
- Om du ansluter en extern referensspänning får du inte anropa analogRead() innan du utför analogReference(EXTERNAL)-instruktionen, eftersom du då kortsluter den interna jämförelsesignalen med den externa spänningen vid AREF och eventuellt tar tillfället i akt att köpa den där nya Arduino som du är så ivrig att köpa.
- Inte ansluta till AREF mindre än 1V eller mer än 5V, du kan inte bara ställa in 12 och förvänta dig att den ska ge dig ett värde.
Testkrets
Vi kommer att sätta upp en testkrets med en I2C-display som vi såg under sessionen… och en potentiometer. Men den här gången kommer vi att ansluta potentiometerns ändar till GND och 3,3V så att den centrala pinnen som vi kommer att läsa av med A1 aldrig kan överstiga 3,3V, vilket simulerar en sensor med det maximala värdet.
När vi vrider på potentiometern kommer vi att läsa av ett spänningsfall mellan 0V och 3,3V. och avläsningen av A1-stiftet kommer att ge värden mellan 0 och 670, eftersom vi befinner oss i det fall som vi definierade lite ovan.
Programmet kommer helt enkelt att avläsa det analoga A1-stiftet och skicka värdet till en I2C-display med 16 tecken på två rader, som vi såg i sessionen….
Här är en minivideo med potentiometeravläsningarna
Om vi nu ansluter Arduinos interna 3,3V-spänning till AREF-stiftet får vi en krets som ser ut så här:
Vi kan se programmet nu:
Här är en video med skillnaden:
Sessionssammanfattning
I den här arduinokursen har vi lärt oss följande:
-
- Vi har insisterat på frågan om analog-till-digital-omvandling och sett att det i grunden är en jämförelse mot ett referensvärde.
- Vi har sett att vi kan använda ett internt eller externt spänningsvärde, förutom den vanliga 5V.
- Vi känner nu till de exakta instruktionerna för att aktivera den externa referensen och de försiktighetsåtgärder som ska vidtas när den används.