Stap 4: Analoog naar digitaal conversie
Als je nieuwsgierig bent, of analoge problemen, of op zoek naar enkele analoge schakelingen ontwerpen, dit nuttig kan zijn.
De ATmega328 heeft zes analoge input pinnen (Zie pin toewijzing). Ik ben ervan uitgaande dat de chip heeft slechts één A/D (van analoog naar digitaal) converter chip erin. Het heet een tien bits converter omdat het gebruik maakt van tien bits, 210 of 1024. De volgende tekening is een vrij goede weergave van de werking van het conversieprogramma. De beschrijving is vrij technisch en niet zo belangrijk is voor de meeste gebruikers van de Arduino. Maar kijk eens naar het analoge signaal vertegenwoordigd door het soepel gebogen signaal op de hoogste linkerzijde. De trap stap foto linksonder is representatief voor de digitale uitgang. U moet er rekening mee dat in plaats van een vloeiend gebogen lijn als het analoge signaal, de digitale uitgang zeer scherpe is, vaak aangeduid als een traptrede. Voor de Arduino gaat de digitale ingang van 0000000000 naar 1111111111 oftewel 1023 stappen in decimale notatie.
Deze digitale uitgang komt niet uit de ATmega direct. Het wordt alleen intern gebruikt door de software.
Voor de standaard Arduino hebt u 5V op de analoge pin, zullen de analogRead() 1023. Aangezien er slechts 1023 verschillende mogelijkheden waardoor elke stap is 0.004888 V. Wat dat betekent is dat hebt u analogRead() van 1023, het 5.000V of 4.996V of ergens tussendoor zou kunnen betekenen. Dus betekent elke traptrede dat de werkelijke spanning uitgeschakeld door 0.004888 V worden kan.
Praktisch gesproken: Dus velen van u zullen zeggen who cares en in de meeste gevallen bent u juist. De nauwkeurigheid van deze lezing is afhankelijk van de nauwkeurigheid van de Vcc. Als de Arduino een 7805 spanningsregelaar gebruikt, dan is de 5V is +/-1,5%, oftewel 0.075V. De werkelijke spanning zou overal voor 5.075V aan de 4.925V die veel groter is dat de tolerantie van een stap. Een andere factor is ruis op Vcc en op het analoge signaal. Met een PC USB, de 5V gehanteerde tolerantie bedraagt meestal erger. Mijne gemeten 4.84V.
Praktisch gesproken met de standaard Arduino, uw analoge nauwkeurigheid is beperkt tot +/-1,5% van de 7805 anyway.
Opmerking: Ik ben niet 100% zeker dat de volgende klopt.
Uitgebreide informatie: De 5V komt overeen met 1023 geldt niet altijd voor de Arduino. De 1023-waarde is de spanning op de pin (pin 20 van de ATmega) van de AVcc onder de meeste omstandigheden. Gewoonlijk AVcc is gebonden aan de Vcc en 5V. Echter, als de schets de functie AnalogReference(INTERNAL) bevat, wordt een interne verwijzing van 1.1V (voor het ATmega-168 en 328) gebruikt. Ik ben er tamelijk zeker wat dit betekent is dat als u een 1.1V signaal op een analoge pin, dan zal de analogRead 1023. Wat dit betekent is elke stap is gelijk aan 0.001075V wat betekent kunt u nauwkeuriger, maar het betekent ook dat uw maximale analoge ingang kan alleen worden 1.1V. AnalogReference() kunnen nu ook worden ingesteld op extern. Wat dit betekent is de analoge verwijzing is gelijk aan de spanning die je op de AREF pin.
WARINING: Wees voorzichtig als u externe en een externe spanningsbron; Dit zou kunnen verstoren en de ATmega beschadigen. Als u een verschillende schets, die niet AnalogReference(EXTERNAL) set heeft, dan gaat de externe referentiespanning vechten de standaard spanning op AVcc. Het is als de twee batterijen van verschillende spanningen aan elkaar koppelen. U hebt een volledige circuit met spanning maar nul weerstand zo veel van de huidige. Ik denk dat er een manier rond dit door het te verbinden door middel van een weerstand, maar ik ben niet zeker.
De reden die ik noemde AVcc en analoge referentie is dat ik was het opzetten van mijn Arduino-kloon tot gebruik de Nokia-LCD. Ik heb gemerkt dat LCD vrij goed werkte wanneer mij watertje using naar de USB-macht, maar het was zeer donker toen ik in een Adafruit 9 volt batterij adapter aangesloten. Dus ik mijn trouwe pakte weinig DMM en deed probleem oplossen. Met de USB-macht waren de Vcc en de Aref pin op de ATmega op 4.84V. Met een 9 volt-batterij aangesloten op de 7805 regulator waren de twee pinnen op 5.03V. Ik had ook een temperatuursensor in bijlage en verder testen geverifieerd dat de temperatuurmeting gevarieerd afhankelijk van wat de spanning van de AVcc was.
Dus als u verbeteren de nauwkeurigheid van de 'standaard' Arduino wilt, zijn er manieren om het te doen.
Als u AnalogReference(INTERNAL) instelt, zal de ATmega 1.1V als referentie te gebruiken, uw berekeningen dienovereenkomstig aan te passen.
TIP: Telkens als u AnalogReference(), gooi de eerste analoge lezing als het zinloos zijn zal.
Als u AnalogReference(EXTERNAL) hebt ingesteld, kunt u bieden u eigen referentie, aangenomen dat er een nauwere tolerantie.
Zie waarschuwing hierboven.
TIP: Telkens als u AnalogReference(), gooi de eerste analoge lezing als het zinloos zijn zal.
Een andere methode die dezelfde zes analoge pinnen gebruiken voor output.
D/A (digitaal naar analoog): De Arduino maakt geen gebruik van een D/A (digitaal naar analoog) converter. In plaats daarvan gebruikt het, iets genaamd:
Pulse Width Modulation (PWM). PWM is niet een analoog signaal. Het is een gepulseerde digitaal signaal. De tekening is van http://arduino.cc/en/Tutorial/PWM.
Wat de Arduino stuurt is een digitaal signaal dat af en aan bij verschillende rentetarieven pulseert.
Instructie Output
analogWrite(0) 0 volt uit
analogWrite(64) zie tekening
analogWrite(127) zie tekening
analogWrite(255) 5 volt uit
De tekening toont de uitvoer gedurende een periode van tijd. Als de tekening toont de waarde van analogWrite gaat verder dan 0, wordt de breedte van de puls in de positieve groter. Met andere woorden, is de tijd dat de uitvoer bij 5 volt blijft langer. Nu dit is moeilijk uit te leggen, maar als je in termen van gemiddelde spanning denken bij analogWrite 0, is dan is de gemiddelde spanning 0 en 255, de gemiddelde spanning is 5V. Nu wanneer er 127, u zien kunt dat er ½ de tijd en uit ½ de tijd, dus de gemiddelde spanning 2,5 volt is. Nu als de waarde groter is dan 127 gaat, zou u moeten zien dat de gemiddelde spanning stijgt.
Voor degenen onder u die graag echte wereld "bewijs", is hier een manier om te laten zien. Een condensator glad uit DC spanning. Dat is waarom u ziet ze altijd op Vcc en voeding uitgangen. Nu neemt u een condensator (I 'm guessing een 1ufd of misschien .5ufd) van een analoge pin op grond. Als u uw schets schrijft voor het instellen van de analoge pin als output en stuurt een analogWrite(127), moet uw DMM de spanning op 2.5V weergeven. By the way, de wiskunde voor PWM is mij een raadsel, maar ik weet dat het wordt in AC circuits die ver is buiten wat deze Lui oude Geek wil geraken.
Simpel gezegd, steekt PWM een signaal dat een analoog signaal voor de meeste doeleinden simuleert.
TIP: Een ding om te onthouden, terwijl de analogRead van 0 tot 1023, de analogWrite alleen gaat van 0 tot 255, een byte door de manier gaat.
Niet-essentiële Info: Meest adequaat ontworpen Arduinos en klonen hebben een 0.01ufd condensator van Vcc met GND en naast de ATmega-chip. De reden is voor het filteren van ruis van de digitale ATmega. Bij het uitvoeren van een schets, allermeest naar de interne circuits wil overschakelen van 0 tot 5 volt vrijwel direct. Dit levert veel lawaai, veel daarvan is hoge frequentie. De condensator zal de meeste van deze absorberen en glad uit, net zoals zij heeft gedaan in onze kleine experiment.