Girino - snabb Arduino oscilloskop (8 / 26 steg)
Steg 8: Hur fungerar ADC
Successiv Approximation ADC innebär att ADC tar 13 klockcykler att slutföra konvertering (och 25 klockcykler för första konvertering). Det finns en klocksignal för att ADC som "beräknas" från den huvudsakliga klockan av Arduino; Detta beror på att ADC är lite långsam och kan inte hänga med i takten i andra delar av mikrokontroller. Det krävs en ingående klockfrekvens mellan 50 kHz och 200 kHz för att få maximal upplösning. Om en lägre upplösning än 10 bitar behövs, kan ingång klockfrekvens för att ADC vara högre än 200 kHz att få en högre frekvens.
Men hur mycket högre priser kan vi använda? Det finns ett par bra guider om ADC på den öppna musik Labs som jag föreslår för att läsa:
- http://www.openmusiclabs.com/Learning/Digital/ATmega-ADC/
- http://www.openmusiclabs.com/Learning/Digital/ATmega-ADC/in-depth/
Eftersom mitt syfte är att få en snabb oscilloskop beslutat jag att begränsa precisionen till 8-bitar. Detta har flera bonusar:
- Databufferten kan lagra mer data;
- du slösar inte 6-bitar ram per datum;
- ADC kan få snabbare.
Prescaler låter oss dela upp frekvensen, av vissa faktorer, genom att ange ADPS0-1-2 bitar av ADCSRA registret. Att se handlingen i precision från öppna musik Labs artikeln, kan vi se att frekvensen för 8 bitar precision kunde gå upp till 1.5 MHz, bra! Men eftersom förmågan att ändra prescaler faktorn låter oss ändra andelen förvärv, kan vi använda den även till ändra tidsskalan för oscilloskopet.
Det finns en bra funktion om utgång registren: vi kan avgöra justera av konvertering bitar, genom att ange ADLAR bet i ADMUX register. Om det är just 0 de är välanpassade och omvänt (se bilden). Eftersom jag ville ha 8 bitar precision sätta jag den till 1 så jag kunde läsa bara ADCH registret och ignorera ADCL.
Jag bestämde mig att ha bara en inmatningskanal att slippa växla kanal fram och tillbaka på varje konvertering.
En sista sak om ADC, har det rinnande lägen var och en med en annan utlösande källan:
- Free Running-läge
- Analoga komparator
- Externa avbrottsbegäran 0
- Timer/Counter0 jämför Match A
- Timer/Counter0 Overflow
- Timer/Counter1 jämför Match B
- Timer/Counter1 Overflow
- Timer/Counter1 fånga händelsen
Jag var intresserad av det fria kör-läge är ett läge där ADC kontinuerligt omvandlar indata och kastar ett avbrott i slutet av varje konvertering (tillhörande vektor: ADC_vect).