Arduino: Nokia LCD & sensorer (4 / 4 steg)
Steg 4: Analog till Digital konvertering
Om du är nyfiken, eller har analoga problem, eller funderar du på att konstruera några analoga kretsar, detta kan vara till hjälp.
ATmega328 har sex analog ingång stift (se pin mappning). Jag antar att chipet har endast en (analog till digital) A/D-omvandlare chip i den. Det kallas en tio bitars omvandlare eftersom den använder tio bitar, 210 eller 1024. Nästa ritningen är en ganska bra bild av hur omvandlaren fungerar. Beskrivningen är ganska tekniskt och inte så viktigt för de flesta Arduino användare. Men titta på den analoga signalen representeras av mjukt svängda signalen på övre vänstra. Trappa steg bilden på nederst vänstra är representativt för den digitala utgången. Observera att i stället för en smidigt böjd linje som den analoga signalen, den digitala utgången är mycket ojämn, kallas ofta ett trappsteg. För Arduino går den digitala ingången från 0000000000 1111111111 som ligger 1023 steg i decimal.
Denna digital utgång kommer inte ur ATmega direkt. Det används endast internt av programvaran.
För den vanliga Arduino om du har 5V på analoga stift, blir analogRead() 1023. Eftersom det finns bara 1023 olika möjligheter som innebär att varje steg är 0.004888 V. Det betyder om du har analogRead() av 1023, kan det betyda 5.000V eller 4.996V eller någonstans däremellan. Så innebär varje trappsteg att den faktiska spänningen kan vara av 0.004888 V.
Praktiskt taget: Så många av er kommer att säga vem bryr sig och i de flesta fall har du rätt. Riktigheten av denna behandling är beroende Vcc är korrekta. Om Arduino använder en spänningsregulator 7805, då är 5V +/-1,5% som är 0.075V. Den faktiska spänningen kan vara var som helst för 5.075V till 4.925V som är mycket större att toleransen för ett steg. En annan faktor är buller på Vcc och på den analoga signalen. Med en PC USB är 5V toleransen oftast värre. Mina uppmätta 4.84V.
Praktiskt sett med standard Arduino din analoga noggrannhet är begränsad till +/-1,5% av 7805 ändå.
Obs: Jag är inte 100% säker på att följande är korrekt.
Avancerad information: 5V lika med 1023 är inte alltid sant för Arduino. 1023 värdet är spänningen på den AVcc pin (stift 20 av ATmega) under de flesta förhållanden. Vanligt AVcc är knuten till Vcc och är 5V. Dock om skissen innehåller funktionen AnalogReference(INTERNAL), används en intern referens av 1.1v (för ATmega 168 och 328). Jag är ganska säker på vad detta betyder är att om du har en 1.1v signal på en analog stift, då analogRead blir 1023. Vad detta betyder är varje steg är lika med 0.001075V vilket innebär att du kan få mer noggrannhet men det innebär också att din maximala analog ingång kan 1.1v. Nu kan AnalogReference() också anges till externa. Vad detta innebär är analog referens är lika med spänningen du sätta på AREF PIN-koden.
WARINING: var försiktig om du använder externa och en yttre spänningskälla; Detta kan störa och skada ATmega. Om du kör en annan skiss, som inte har AnalogReference(EXTERNAL) set, sedan ska yttre spänning hänvisningen vara bekämpa standard spänningen på AVcc. Det är som ansluter två batterier av olika spänningar tillsammans. Du har en komplett krets med spänning men noll motstånd så massor av strömmen. Jag tror det finns en väg runt detta genom att ansluta den via ett motstånd men jag är inte säker.
Anledningen till att jag nämnde AVcc och analog referens är att jag att min Arduino-klon upp till använda Nokia LCD. Jag märkte att LCD fungerat ganska bra när jag var användande USB makt men det var mycket mörkt när jag pluggade i ett Adafruit 9 volts batteri adapter. Så jag tog min trogna lilla DMM och gjorde några felsökning. Med USB-kraften var Vcc och Aref stiftet på ATmega på 4.84V. Med ett 9 volts batteri ansluten till 7805 regulatorn var två stiften på 5.03V. Jag hade också en temperaturgivare kopplade och ytterligare tester kontrolleras att den temperatur behandlingen varierade beroende på vad den AVcc spänningen var.
Så om du vill förbättra noggrannheten i "standard" Arduino, finns det sätt att göra det.
Om du anger AnalogReference(INTERNAL), kommer ATmega använda 1.1v som referens, justera dina beräkningar.
Tips: Varje gång du ändrar AnalogReference(), kasta den första analoga behandlingen eftersom det är meningslöst.
Om du anger AnalogReference(EXTERNAL), kan du ge dig egen referens, antog att den har en snävare tolerans.
Se varningen ovan.
Tips: Varje gång du ändrar AnalogReference(), kasta den första analoga behandlingen eftersom det är meningslöst.
Dessa samma sex analoga pinnar använder en annan metod för utdata.
D/A (Digital till Analog): Arduino använder inte en D/A (Digital till Analog) omvandlare. Istället använder, något som kallas:
Pulse bredd Modulation (PWM). PWM är inte en analog signal. Det är en pulsad digital signal. Ritningen är från http://arduino.cc/en/Tutorial/PWM.
Vad Arduino skickar ut är en digital signal som pulserar av och på i olika takt.
Instruktion utgång
analogWrite(0) 0 volt ut
analogWrite(64) se ritning
analogWrite(127) se ritning
analogWrite(255) 5 volt ut
Ritningen föreställer produktionen under en viss tidsperiod. Som visas i ritningen som analogWrite värdet går längre över 0, blir bredden på positiva pulsen bredare. Alltså är tiden produktionen stannar vid 5 volt längre. Nu detta är svårt att förklara men om du tänker i termer av genomsnittliga spänning när analogWrite är 0 då den genomsnittliga spänningen är 0 och när det är 255, då den genomsnittliga spänningen är 5V. Nu när det är 127, kan du se att det är på ½ tid och av ½ tiden så den genomsnittliga spänningen är 2,5 volt. Nu värdet går större än 127, bör du se att den genomsnittliga spänningen går upp.
För er som gillar verkliga världen "proof", är här ett sätt att visa detta. En kondensator jämnar ut DC-spänningar. Det är därför du alltid ser dem på Vcc och strömförsörjning utgångar. Nu om du tar en kondensator (jag gissar en 1ufd eller kanske .5ufd) från en analog stift till marken. Om du skriver din skiss för att ställa upp den analoga stiftet som produktion och skicka ett analogWrite(127), bör din DMM visar spänningen på 2.5V. Förresten, matematik av PWM är för mig obegripligt men jag vet att det blir till AC kretsar som är långt utöver vad detta Lata gamla Geek vill komma in.
För att uttrycka det enkelt, sätter PWM ut en signal som simulerar en analog signal för de flesta ändamål.
Tips: En sak att komma ihåg, medan analogRead går från 0 till 1023, analogWrite bara går från 0 till 255, en byte förresten.
Icke-väsentliga information: Mest adekvat utformade Arduinos och kloner har en 0.01ufd kondensator från Vcc till GND och bredvid ATmega chip. Anledningen är att filtrera ljud från den digitala ATmega. När du kör en skiss, de flesta av inre kretsen försöker växla från 0 till 5 volt nästan omedelbart. Detta producerar en massa oväsen, en hel del som är högfrekventa. Kondensatorn kommer att absorbera det mesta av detta och jämna ut den, precis som det gjorde i vårt lilla experiment.