Stap 8: Hoe de ADC werkt
Opeenvolgende onderlinge aanpassing ADC betekent dat de ADC 13 klokcycli duurt te voltooien de conversie (en 25 klokcycli voor de eerste conversie). Er is een kloksignaal gewijd aan de ADC die is "berekend" van de belangrijkste klok van de Arduino; Dit komt doordat het ADC een beetje traag is en niet met het tempo van de andere delen van de microcontroller houden kan. Het vereist een input klokfrequentie tussen 50 kHz en 200 kHz om maximale resolutie. Als een lagere resolutie dan 10 bits nodig is, kan de input klokfrequentie naar de ADC hoger zijn dan 200 kHz om een hogere sample-rate.
Maar hoeveel hogere tarieven kunnen we gebruiken? Er zijn een paar goede gidsen over het ADC op de Open Labs van de muziek die ik stel voor om te lezen:
- http://www.openmusiclabs.com/learning/Digital/ATMega-ADC/
- http://www.openmusiclabs.com/learning/Digital/ATMega-ADC/in-Depth/
Aangezien mijn doel is om een snelle oscilloscoop besloten heb ik te beperken van de precisie van 8 bits. Dit heeft verschillende bonussen:
- de buffer van gegevens kunt opslaan meer gegevens;
- u verspil niet 6 bits van RAM per datum;
- de ADC kan sneller verwerven.
De prescaler laat ons verdelen de frequentie, door sommige factoren, door het instellen van de bits van de ADPS0-1-2 van het ADCSRA-register. Het zien van de plot van de precisie van de Open Labs-artikel van muziek, kunnen we zien dat voor 8-bits precisie de frequentie kon gaan tot 1.5 MHz, goed! Maar omdat de mogelijkheid van het wijzigen van de prescaler factor ons de snelheid van de overname wijzigen laat, kunnen we gebruiken ook overstappen op de tijdschaal van de oscilloscoop.
Er is een goede eigenschap over de uitvoer-registers: we kunnen besluiten dat de aanpassing van conversie bits, door het instellen van de ADLAR bit in het ADMUX-register. Als er rechts 0 die ze zijn aangepast en viceversa (Zie de afbeelding). Omdat ik 8-bits precisie wilde ik het ingesteld op 1 zodat ik kon gewoon het ADCH-register gelezen en de ADCL negeren.
Heb ik besloten om slechts één invoerkanaal vermijden moetend kanaal heen en weer schakelen bij elke omzetting.
Een laatste ding over de ADC, heeft verschillende lopende modi elkaar met een andere trigger bron:
- Gratis Running mode
- Analoge Comparator
- Externe Interrupt Request 0
- Timer/Counter0 vergelijken wedstrijd A
- Timer/Counter0 overloop
- Timer/Counter1 vergelijken wedstrijd B
- Timer/Counter1 overloop
- Timer/Counter1 vastleggen gebeurtenis
Ik was geïnteresseerd in het gratis Loopmodus thats een modus waarin de ADC voortdurend converteert de input en slaat en gooit een Interrupt aan het einde van elke omzetting (bijbehorende vector: ADC_vect).