Område 4 · lektion 18
Analogt och digitalt
Varje insignal du läst hittills har varit en etta eller en nolla. Knappen är nere eller uppe, luckan är stängd eller öppen. Men temperaturen i rummet är inte av eller på, och ljuset utanför fönstret är det inte heller. Den här guiden handlar om vad som händer i det ögonblick då kortet ska översätta en storhet som glider mjukt till ett tal med ett bestämt antal steg – och om hur man räknar på vad ett sådant steg är värt.
Mål
- Du kan förklara skillnaden mellan en analog och en digital signal, och säga vilken av de två din kod faktiskt får se.
- Du kan räkna ut hur många steg
analogReadger, hur många volt ett steg är värt, och hur lång tid en omvandling tar. - Du kan härleda spänningsdelarens formel ur att strömmen är densamma genom båda motstånden, i stället för att slå upp den.
- Du kan välja motståndsvärden till en delare så att både strömförbrukningen och omvandlaren blir nöjda.
Genomgång
Världen är analog, kortet är det inte
En analog storhet kan anta vilket värde som helst inom
sitt område, utan hopp. Temperaturen i rummet är 21,4 °C, och på vägen dit
från 21,3 passerade den 21,37 och 21,384 och varje tal däremellan. En
digital signal har ett bestämt antal tillåtna värden.
digitalRead ger två: LOW eller HIGH.
Inget däremellan finns.
Det gör digitalRead odugligt för allt som har en grad. Sätter
du en ljusgivare på en digital ingång får du veta att det är ljust eller
mörkt, med en gräns du inte valt och inte kan flytta. Du får inte veta hur
ljust.
Mellan de två världarna sitter en analog-digital-omvandlare, förkortad ADC. Den finns inbyggd i mikrokontrollern och den gör en enda sak: mäter en spänning och lämnar ett heltal. På Uno-kortet är de sex pinnarna A0 till A5 kopplade till den.
Omvandlingen kastar bort information, alltid Det finns oändligt många spänningar mellan 0 och 5 V och bara 1024 tal att lägga dem i. Två spänningar som ligger tillräckligt nära varandra får därför samma tal, och när talet är taget går skillnaden inte att få tillbaka. Det är inte ett fel i kortet utan vad omvandling betyder. Frågan är aldrig om information går förlorad utan om det som går förlorat är mindre än det du bryr dig om.
analogRead: tio bitar, 1024 steg
analogRead(A0) lämnar ett heltal. Omvandlaren i ATmega328P
har tio bitars upplösning, vilket betyder att talet byggs
av tio ettor och nollor. Antalet möjliga tal blir
2¹⁰ = 1024 olika värden, alltså 0 … 1023
Precis som med millis() i förra området är det översta värdet
ett mindre än antalet, eftersom räkningen börjar på noll. 1023 är
taket, inte 1024.
Vad de talen betyder i volt bestäms av omvandlarens referensspänning. Som kortet levereras är referensen kortets egen 5 V-matning, kallad AVcc. Talet 0 svarar mot 0 V och hela skalan mot referensen. Ett steg är alltså värt
5,0 V / 1024 = 0,00488 V = 4,9 mV
Knappt fem millivolt. Det är omvandlarens finaste upplösning, och det är en gräns du inte kan komma under hur mycket du än räknar i efterhand.
För att gå från ett råvärde till volt skriver Arduino-exemplen genomgående
U = rå · 5,0 / 1023
Räknat på ett råvärde mitt på skalan:
U = 512 · 5,0 / 1023 = 2560 / 1023 = 2,50 V
1023 eller 1024 i nämnaren?
Steget är 5/1024, men omräkningen ovan delar med 1023. Båda
förekommer, och skillnaden är som mest ett enda steg – knappt 5 mV vid
toppen av skalan. Delar du med 1024 blir det största råvärdet 1023 lika
med 4,995 V; delar du med 1023 blir det jämnt 5,000 V. Använd 1023
som resten av Arduino-världen gör, och lägg inte tid på skillnaden: den är
mindre än det fel din matningsspänning ändå har. Det senare tar vi hand om
i guiden om kalibrering.
Hur lång tid en avläsning tar
Omvandlaren har en egen klocka, som kortet delar ned från sina 16 MHz. Som Arduino-miljön ställer in den blir den
16 000 000 Hz / 128 = 125 000 Hz
En omvandling tar 13 av den klockans cykler, alltså
13 / 125 000 = 0,000104 s = 104 µs
Drygt en tiondels millisekund. Det innebär ett tak på ungefär
1 s / 104 µs = 1 / 0,000104 = 9 615 avläsningar i sekunden
Knappt tiotusen i sekunden, alltså. Vi rundar av till 9 600 i det som följer.
Två saker följer av det. Ett analogRead är inte
gratis – det tar ett par tiotal gånger längre tid än ett
digitalRead, som ligger på några få mikrosekunder, och sexton
avläsningar i rad kostar 16 · 104 µs ≈ 1,7 ms. Men det är inte heller dyrt jämfört med ett
delay(). En loop som gör en handfull avläsningar per varv går
fortfarande hundratals varv i sekunden.
Spänningsdelaren, härledd
Omvandlaren mäter spänning. En givare som ändrar sin resistans lämnar ingen spänning alls – ett motstånd ensamt gör ingenting. Konstruktionen som gör om det ena till det andra heter spänningsdelare, och den är område 1:s seriekoppling en gång till.
- R1 och R2 sitter i serie mellan 5 V och jord. Det finns bara en väg för strömmen, alltså går samma ström genom båda.
- Uttaget sitter mellan dem. Spänningen där, räknad mot jord, är spänningen över R2 – och det är den A0 mäter.
- A0 tar nästan ingen ström. Grenen åt höger stör därför inte delningen nämnvärt. Villkoret för att det ska stämma står längre ned.
Nu härleder vi formeln i stället för att slå upp den. Kalla matningen
Uin. Två motstånd i serie har den sammanlagda resistansen
R = R1 + R2
Ohms lag ger strömmen genom slingan:
I = Uin / (R1 + R2)
Den strömmen går genom båda motstånden, eftersom det inte finns någon annan väg. Spänningen över R2 blir därför, återigen med Ohms lag:
Uut = I · R2 = Uin · R2 / (R1 + R2)
Det är hela formeln, och den är ingenting annat än Ohms lag två gånger. Läs den sista raden som ett bråk: R2:s andel av den totala resistansen är också R2:s andel av spänningen. Sitter halva resistansen i R2 hamnar halva spänningen där.
Två räknade exempel
Exempel 1: två lika stora motstånd. R1 = R2 = 10 kΩ över 5,0 V.
Uut = 5,0 · 10 000 / (10 000 + 10 000) = 5,0 · 0,5 = 2,50 V
Vilket råvärde ger det? Vänd på omräkningen från förra avsnittet:
rå = 2,50 · 1023 / 5,0 = 511,5 ≈ 512
Mitt på skalan, som väntat.
Exempel 2: en givare som just nu har 4,7 kΩ. R1 = 10 kΩ fast, R2 = 4,7 kΩ.
Uut = 5,0 · 4 700 / (10 000 + 4 700) = 5,0 · 4 700 / 14 700 = 5,0 · 0,3197 = 1,60 V
rå = 1,60 · 1023 / 5,0 = 327
Kontrollera rimligheten innan du går vidare: R2 är mindre än R1, alltså ska mindre än halva spänningen hamna över R2, alltså ska råvärdet ligga under 512. Det gör 327. Den kontrollen tar två sekunder och fångar de flesta räknefel.
Att välja motståndsvärden
Två krav drar åt olika håll, och det är därför valet inte är godtyckligt.
För små motstånd slösar ström. Delaren i exempel 2 drar
I = 5,0 / 14 700 = 0,00034 A = 0,34 mA
och gör av med
P = U · I = 5,0 · 0,00034 = 0,0017 W = 1,7 mW
Det är försumbart mot ett kvarts watts motstånd, som klarar 250 mW. Hade du valt 100 Ω i stället för 10 kΩ hade strömmen blivit hundra gånger större och effekten likaså – fortfarande hanterbart på ett kort med nätsladd, men slöseri på ett batteridrivet bygge.
För stora motstånd stör omvandlaren. ADC:n mäter genom att först ladda upp en liten kondensator inuti kortet till den spänning som ligger på pinnen. Laddningen tar tid, och tiden växer med hur trögflytande källan är – alltså med resistansen. Databladet för ATmega328P rekommenderar därför att källan har en resistans på högst 10 kΩ. Blir den större hinner kondensatorn inte laddas färdigt, och råvärdet dras mot det du mätte förra gången.
Källans resistans, sedd från pinnen, är R1 och R2 parallellt:
10 000 · 4 700 / 14 700 = 47 000 000 / 14 700 = 3 200 Ω
3,2 kΩ, alltså med god marginal under gränsen. Motstånd i storleksordningen några kΩ upp till 10 kΩ träffar båda kraven, och det är därför nästan varje givarkoppling du ser på nätet använder just 10 kΩ. Nu vet du varför, i stället för att bara veta att den gör det.
I industrin och i vardagen
I industrin: en frekvensomriktare som styr en motors varvtal tar ofta sitt börvärde som en analog spänning 0–10 V på en ingång. Är omriktaren inställd på 0–50 Hz motsvarar en volt
50 Hz / 10 V = 5 Hz per volt
Inuti omriktaren sitter samma sorts omvandlare som i ditt kort, men med fler bitar. Med tolv bitar blir stegen
2¹² = 4096 steg, alltså 10 V / 4096 = 0,00244 V = 2,4 mV per steg
vilket i varvtal betyder
50 Hz / 4096 = 0,012 Hz per steg
Finare än någon process behöver, och det är själva poängen: upplösningen väljs så att omvandlingens fel hamnar under allt annat fel i kedjan. Signalen är dessutom bara en av två vanliga – den andra, strömslingan på 4–20 mA, mötte du i område 1:s guide om spänning, ström och resistans. Skillnaden mellan dem är att en spänningssignal är billig men känslig för långa kablar, medan en strömsignal kostar mer och tål dem.
I vardagen: ljudet i dina hörlurar har gått genom exakt den här omvandlingen två gånger. En mikrofon lämnar en analog spänning som följer lufttrycket. Den mäts, på cd-skivans standard, med 16 bitars upplösning
2¹⁶ = 65 536 steg
vilket är
65 536 / 1024 = 64 gånger finare än ditt kort
och 44 100 gånger i sekunden, alltså
44 100 / 9 600 = 4,6 gånger snabbare än ditt korts tak
Sedan går talen tillbaka till en spänning i en omvandlare åt andra hållet innan de når högtalarelementet. Att skivan låter som musik och inte som trappsteg beror på att stegen är mindre än örat kan höra – samma resonemang som med frekvensomriktaren, med en annan sorts mottagare. Ditt korts 1024 steg är för grova för musik och gott och väl tillräckliga för att läsa av ett rums temperatur.
Prova själv
- Koppla en potentiometer som spänningsdelare: ytterbenen till 5 V och
GND, mittbenet till A0. Skriv ett program som gör
Serial.println(analogRead(A0));fyra gånger i sekunden med tidsstämpelmönstret från förra området. Vrid långsamt och kontrollera att du kommer åt både 0 och 1023. - Skriv ut både råvärdet och den omräknade spänningen på samma rad. Ställ potentiometern så att seriemonitorn visar ungefär 2,50 V och mät sedan med multimetern mellan A0 och GND. Anteckna båda talen.
- Bygg exempel 2 ovan med två fasta motstånd, 10 kΩ och 4,7 kΩ. Räkna ut det väntade råvärdet innan du laddar upp, skriv ned det, och jämför sedan. Skiljer det mer än tio steg: mät motstånden med multimetern och räkna om med de uppmätta värdena.
- Byt plats på de två motstånden så att 4,7 kΩ hamnar överst. Förutsäg det nya råvärdet först. Kontrollera sedan.
- Låt A0 hänga löst, utan någonting inkopplat, och skriv ut råvärdet. Håll handen nära pinnen. Notera vad som händer – det är inget fel, och det förklaras i Vanliga fel nedan.
Kontrollfrågor
Hur många olika värden kan analogRead ge, och
varför är det största 1023?
Tio bitar ger 2¹⁰ = 1024 olika värden. Räkningen börjar på 0, så värdena är 0 till 1023 – precis som åtta bitar ger 0 till 255 och inte 1 till 256.
Hur många millivolt är ett steg värt med standardreferensen, och vad följer av det?
5,0 / 1024 = 0,00488 V, alltså 4,9 mV. Det följer att en
spänningsändring på två millivolt inte alltid syns i råvärdet, och att
det är meningslöst att skriva ut fler decimaler än det. En avläsning
som redovisas som 2,5024 V påstår en noggrannhet omvandlaren inte
har.
R1 = 22 kΩ och R2 = 10 kΩ över 5,0 V. Vad blir
Uut och vilket råvärde väntar du dig?
Uut = 5,0 · 10 000 / 32 000 = 5,0 · 0,3125 = 1,56 V och
rå = 1,5625 · 1023 / 5,0 = 319,7 ≈ 320. Rimlighetskontrollen: R2 är
mindre än R1, alltså under halva spänningen och under 512. Stämmer.
Varför spelar det roll om delarens motstånd är 1 MΩ i stället för 10 kΩ?
Omvandlaren laddar en liten kondensator till pinnens spänning innan den mäter. Ju större källans resistans är, desto långsammare går laddningen. Databladet rekommenderar högst 10 kΩ. Med 1 MΩ hinner kondensatorn inte laddas färdigt under de 104 mikrosekunderna, och råvärdet blir en blandning av den här mätningen och den förra – ett fel som ser ut som en tröghet i givaren.
Du har en delare med R1 = R2. Hur ändras Uut om du
byter båda mot dubbelt så stora motstånd?
Inte alls. Formeln innehåller bara förhållandet
R2 / (R1 + R2), och det är oförändrat. Det som ändras är
strömmen, som halveras, och källans resistans sett från pinnen, som
fördubblas. Delningen är densamma, priset och tröghetsrisken är det
inte.
Vad blir analogRead om du kopplar A0 direkt till
5 V-pinnen, och vad blir den om du kopplar den till GND?
1023 respektive 0. Referensen är kortets 5 V, så hela skalan motsvarar hela matningen. Det är också det billigaste sättet att kontrollera att en analog ingång fungerar innan du misstänker givaren.
Vanliga fel
- Råvärdet ligger och hoppar fast ingenting är inkopplat. En analog ingång utan något anslutet är ingen nolla utan en antenn. Den plockar upp nätbrum och statisk elektricitet, och siffrorna vandrar när du för handen närmare. Det är väntat. En analog ingång ska alltid ha någonting kopplat till sig.
pinModeanvänds på den analoga pinnen.analogReadbehöver ingenpinMode. Skriver dupinMode(A0, OUTPUT)av gammal vana blir pinnen en utgång, och avläsningen ger då bara det du själv skrev dit.- Delaren är kopplad utan väg till jord. Ett motstånd mellan 5 V och A0, utan R2, ger ingen delning. Pinnen dras mot 5 V och råvärdet står nära 1023 oavsett vad givaren gör. Följ ledningen hela vägen ned till GND innan du felsöker koden.
- Råvärdet står stilla på 0 eller 1023. Antingen är givaren långt utanför det område delaren klarar, eller så är en av de två grenarna avbruten. Mät spänningen på pinnen med multimetern – det skiljer de två fallen åt på tio sekunder.
- Spänningen räknas om med 5,00 V fast matningen inte är det. Ett kort som matas över USB ligger ofta på 4,7–4,9 V. Alla omräknade volttal blir då några procent fel, systematiskt, åt samma håll. Måttet i råvärden är rätt; det är översättningen som är fel. Det tar kalibreringsguiden hand om.
- Motstånden är valda på känsla. Ett par hundra ohm drar onödig ström, ett par megaohm gör omvandlaren trög. Ligger du inom några kΩ upp till 10 kΩ har du inget av problemen.
- Fler decimaler skrivs ut än som finns.
Serial.println(spanning, 4)ser noggrant ut och är det inte. Ett steg är 4,9 mV, så tre decimaler är redan mer än omvandlaren kan lova.
Vidare
Inget nytt i språket den här gången – analogRead är ett
anrop som ser ut som alla andra. Kapitlet
Typer och variabler i
språkreferensen är ändå värt en repetition innan nästa guide: råvärdet är
en int, den omräknade spänningen är en float,
och att blanda dem är områdets första riktiga fallgrop.
Nästa guide är Motståndsgivare. Delaren du just härlett får då ett motstånd som ändrar sig av sig självt – och först där blir den en givare i stället för ett räkneexempel.