25.2: Sistema ATMega ADC
- Page ID
- 82267
\( \newcommand{\vecs}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \)
\( \newcommand{\vecd}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash {#1}}} \)
\( \newcommand{\id}{\mathrm{id}}\) \( \newcommand{\Span}{\mathrm{span}}\)
( \newcommand{\kernel}{\mathrm{null}\,}\) \( \newcommand{\range}{\mathrm{range}\,}\)
\( \newcommand{\RealPart}{\mathrm{Re}}\) \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\)
\( \newcommand{\Argument}{\mathrm{Arg}}\) \( \newcommand{\norm}[1]{\| #1 \|}\)
\( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\)
\( \newcommand{\Span}{\mathrm{span}}\)
\( \newcommand{\id}{\mathrm{id}}\)
\( \newcommand{\Span}{\mathrm{span}}\)
\( \newcommand{\kernel}{\mathrm{null}\,}\)
\( \newcommand{\range}{\mathrm{range}\,}\)
\( \newcommand{\RealPart}{\mathrm{Re}}\)
\( \newcommand{\ImaginaryPart}{\mathrm{Im}}\)
\( \newcommand{\Argument}{\mathrm{Arg}}\)
\( \newcommand{\norm}[1]{\| #1 \|}\)
\( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\)
\( \newcommand{\Span}{\mathrm{span}}\) \( \newcommand{\AA}{\unicode[.8,0]{x212B}}\)
\( \newcommand{\vectorA}[1]{\vec{#1}} % arrow\)
\( \newcommand{\vectorAt}[1]{\vec{\text{#1}}} % arrow\)
\( \newcommand{\vectorB}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \)
\( \newcommand{\vectorC}[1]{\textbf{#1}} \)
\( \newcommand{\vectorD}[1]{\overrightarrow{#1}} \)
\( \newcommand{\vectorDt}[1]{\overrightarrow{\text{#1}}} \)
\( \newcommand{\vectE}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash{\mathbf {#1}}}} \)
\( \newcommand{\vecs}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \)
\( \newcommand{\vecd}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash {#1}}} \)
\(\newcommand{\avec}{\mathbf a}\) \(\newcommand{\bvec}{\mathbf b}\) \(\newcommand{\cvec}{\mathbf c}\) \(\newcommand{\dvec}{\mathbf d}\) \(\newcommand{\dtil}{\widetilde{\mathbf d}}\) \(\newcommand{\evec}{\mathbf e}\) \(\newcommand{\fvec}{\mathbf f}\) \(\newcommand{\nvec}{\mathbf n}\) \(\newcommand{\pvec}{\mathbf p}\) \(\newcommand{\qvec}{\mathbf q}\) \(\newcommand{\svec}{\mathbf s}\) \(\newcommand{\tvec}{\mathbf t}\) \(\newcommand{\uvec}{\mathbf u}\) \(\newcommand{\vvec}{\mathbf v}\) \(\newcommand{\wvec}{\mathbf w}\) \(\newcommand{\xvec}{\mathbf x}\) \(\newcommand{\yvec}{\mathbf y}\) \(\newcommand{\zvec}{\mathbf z}\) \(\newcommand{\rvec}{\mathbf r}\) \(\newcommand{\mvec}{\mathbf m}\) \(\newcommand{\zerovec}{\mathbf 0}\) \(\newcommand{\onevec}{\mathbf 1}\) \(\newcommand{\real}{\mathbb R}\) \(\newcommand{\twovec}[2]{\left[\begin{array}{r}#1 \\ #2 \end{array}\right]}\) \(\newcommand{\ctwovec}[2]{\left[\begin{array}{c}#1 \\ #2 \end{array}\right]}\) \(\newcommand{\threevec}[3]{\left[\begin{array}{r}#1 \\ #2 \\ #3 \end{array}\right]}\) \(\newcommand{\cthreevec}[3]{\left[\begin{array}{c}#1 \\ #2 \\ #3 \end{array}\right]}\) \(\newcommand{\fourvec}[4]{\left[\begin{array}{r}#1 \\ #2 \\ #3 \\ #4 \end{array}\right]}\) \(\newcommand{\cfourvec}[4]{\left[\begin{array}{c}#1 \\ #2 \\ #3 \\ #4 \end{array}\right]}\) \(\newcommand{\fivevec}[5]{\left[\begin{array}{r}#1 \\ #2 \\ #3 \\ #4 \\ #5 \\ \end{array}\right]}\) \(\newcommand{\cfivevec}[5]{\left[\begin{array}{c}#1 \\ #2 \\ #3 \\ #4 \\ #5 \\ \end{array}\right]}\) \(\newcommand{\mattwo}[4]{\left[\begin{array}{rr}#1 \amp #2 \\ #3 \amp #4 \\ \end{array}\right]}\) \(\newcommand{\laspan}[1]{\text{Span}\{#1\}}\) \(\newcommand{\bcal}{\cal B}\) \(\newcommand{\ccal}{\cal C}\) \(\newcommand{\scal}{\cal S}\) \(\newcommand{\wcal}{\cal W}\) \(\newcommand{\ecal}{\cal E}\) \(\newcommand{\coords}[2]{\left\{#1\right\}_{#2}}\) \(\newcommand{\gray}[1]{\color{gray}{#1}}\) \(\newcommand{\lgray}[1]{\color{lightgray}{#1}}\) \(\newcommand{\rank}{\operatorname{rank}}\) \(\newcommand{\row}{\text{Row}}\) \(\newcommand{\col}{\text{Col}}\) \(\renewcommand{\row}{\text{Row}}\) \(\newcommand{\nul}{\text{Nul}}\) \(\newcommand{\var}{\text{Var}}\) \(\newcommand{\corr}{\text{corr}}\) \(\newcommand{\len}[1]{\left|#1\right|}\) \(\newcommand{\bbar}{\overline{\bvec}}\) \(\newcommand{\bhat}{\widehat{\bvec}}\) \(\newcommand{\bperp}{\bvec^\perp}\) \(\newcommand{\xhat}{\widehat{\xvec}}\) \(\newcommand{\vhat}{\widehat{\vvec}}\) \(\newcommand{\uhat}{\widehat{\uvec}}\) \(\newcommand{\what}{\widehat{\wvec}}\) \(\newcommand{\Sighat}{\widehat{\Sigma}}\) \(\newcommand{\lt}{<}\) \(\newcommand{\gt}{>}\) \(\newcommand{\amp}{&}\) \(\definecolor{fillinmathshade}{gray}{0.9}\)Un diagrama de bloques del sistema ATMega ADC se encuentra en la Figura\(\PageIndex{1}\).

El corazón del sistema es un solo DAC de aproximación sucesiva con resolución de 10 bits. La velocidad máxima de conversión a resolución completa es de aproximadamente 15 k muestras por segundo. Claramente esto es insuficiente para aplicaciones como audio o video con calidad de CD, pero es más que lo suficientemente rápido para la mayoría de monitoreo de sensores e interfaces de usuario. Las especificaciones de rendimiento del convertidor incluyen un error de no linealidad integral de 0.5 LSB y una precisión absoluta de ±2 LSB. Una referencia a bordo está disponible aunque también se puede usar una referencia externa. El convertidor incluye un sistema de muestreo y retención para estabilizar la medición y cambiar rápidamente las señales de entrada. Hay un mux de ocho canales aunque solo seis de estos canales se utilizan en algunos paquetes (el paquete utilizado en la configuración estándar de la placa Arduino Uno usa seis). El circuito de entrada está optimizado para fuentes que tienen una impedancia de salida de 10 KΩ o menos. También es muy importante reconocer que el sistema es unipolar y sólo responderá a voltajes positivos. Si la señal a medir es bipolar, se requerirá algún tipo de cambio de nivel de CC.
Existen varios registros asociados con el sistema ADC. Estos se muestran en la Tabla\(\PageIndex{1}\).
Registrar | Bit 7 | Bit 6 | Bit 5 | Bit 4 | Bit 3 | Bit 2 | Bit 1 | Bit 0 |
---|---|---|---|---|---|---|---|---|
ADCSRA |
ADEN |
ADSC |
ADATE |
ADIF |
ADIE |
ADPS2 |
ADPS1 |
ADPS0 |
ADCSRB |
- | ACME |
- | - | - | ADTS2 |
ADTS1 |
ADTS0 |
ADMUX |
REFS1 |
REFS0 |
ADLAR |
- | MUX3 |
MUX2 |
MUX1 |
MUX0 |
ADCH |
ADC9/- |
ADC8/- |
ADC7/- |
ADC6/- |
ADC5/- |
ADC4/- |
ADC3/9 |
ADC2/8 |
ADCL |
ADC1/7 |
ADC0/6 |
-/ADC5 |
-/ADC4 |
-/ADC3 |
-/ADC2 |
-/ADC1 |
-/ADC0 |
ADCSRA
y ADCSRB
son los registros analógico-digitales de control y estado. Aquí están sus descripciones de bits:
ADEN: ENable
. Establezca en uno para habilitar el sistema analógico-digital.ADSC
: Iniciar conversión. Establezca en uno para iniciar una conversión. Cuando se complete la conversión, el hardware restablecerá este bit a cero. Escribir cero a este bit no tendrá ningún efecto.ADATE
: Activación automática del disparador. Establezca en uno para el modo de disparo automático. Un borde ascendente en la señal de disparo seleccionada iniciará una conversión. La fuente de activación se selecciona a través delos bits ADTS
en el registro ADCSRB
(abajo).ADIF
: Indicador de Interrupción. Esto se usa con el modo de interrupción. Este bit se establece cuando se completa una conversión y se actualizan los registros de datos. Este bit es borrado por el hardware cuando se ejecuta la rutina del controlador de interrupciones. Usar conADIE
.ADIE
: Interrupción Habilitada. Establezca en uno para habilitar la interrupción de conversión ADC. Usar conADIF
.ADPS2-0
: Brocas preescaladoras. Estos bits se utilizan para dividir el reloj del sistema al reloj ADC. 000 y 001 producen la división por dos y los valores crecientes duplican la división del reloj con 111 rindiendo dividir por 128.ACME
: Comparador analógico multiplexor habilitado. Establecer estos bits permite que cualquiera de los ocho pines ADC multiplexados reemplace la entrada negativa al comparador analógico.ADTS2-0
: Fuente de activación. SiADATE
se establece en uno, estos bits determinan la fuente de activación. 000 es el modo de ejecución libre, 001 disparadores del comparador analógico, 010 usa la Solicitud de Interrupción Externa 0, y los valores restantes establecen varias fuentes de temporizador/contador.
ADMUX
es el registro de selección de multiplexores analógico-digitales. También se utiliza para la selección de referencias y justificación de datos. Las descripciones de bits siguen:
REFS 1-0
: Voltajes de referencia. 00 produce el pinAREF
, 01 produceAVCC
, 11 produce una referencia interna de 1.1 voltios y 10 está reservado.ADLAR
: Ajuste Izquierdo Resultado. Establecer este bit justificará a la izquierda los bits de salida en los registrosADCH/ADCL
. Poner a cero a la derecha lo justifica.MUX3-0
: Multiplexor. Estos bits seleccionan el pin de entrada. 000 seleccionaADC0
, 001 seleccionaADC1
y así sucesivamente a 1000 seleccionandoADC8
(el sensor de temperatura). 1110 selecciona la referencia de 1.1 voltios y 1111 selecciona tierra. Todos los demás valores están reservados.
Finalmente tenemos ADCH
y ADCL
, los registros de salida ADC High y Low. Hay dos registros porque este es un convertidor de 10 bits pero los registros solo contienen ocho bits cada uno. Hay dos modos de operación en conjunto con el bit ADLAR
en el registro ADMUX
. Si se establece ADLAR
, los ocho bits superiores se colocarán en ADCH
y los dos bits inferiores se colocarán en la parte superior de ADCL
. Si se borra ADLAR
entonces los ocho bits inferiores se encontrarán en ADCL
y los dos bits superiores se encontrarán en la parte inferior del ADCH
. Simplemente piense en los dos registros como un solo registro de 16 bits con los bits empujados hacia la izquierda o hacia la derecha como se muestra en la Tabla\(\PageIndex{2}\).
ADCH | ADCL | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
ADLAR | Bit 15 | Bit 14 | Bit 13 | Bit 12 | Bit 11 | Bit 10 | Bit 9 | Bit 8 | Bit 7 | Bit 6 | Bit 5 | Bit 4 | Bit 3 | Bit 2 | Bit 1 | Bit 0 |
1 | ADC 9 | ADC 8 | ADC 7 | ADC 6 | ADC 5 | ADC 4 | ADC 3 | ADC 2 | ADC 1 | ADC 0 | - | - | - | - | - | - |
0 | - | - | - | - | - | - | ADC 9 | ADC 8 | ADC 7 | ADC 6 | ADC 5 | ADC 4 | ADC 3 | ADC 2 | ADC 1 | ADC 0 |
Si solo se necesitan ocho bits de resolución, es posible justificar a la izquierda y leer solo ADCH
, ignorando ADCL
.
La operación de conversión única es bastante sencilla. Primero, configura tu sección de inicialización. Esto comienza con la configuración de ADEN
para habilitar el sistema. Después decide el valor adecuado de la preescala. Las especificaciones del chip indican que los sucesivos circuitos de aproximación funcionarán mejor con un reloj ADC en el rango de 50 kHz a 200 kHz. Una conversión típica tomará 13 ciclos de reloj ADC (la primera conversión tomará 25 debido a la sobrecarga de inicialización). Una vez determinado esto, configure ADLAR
para justificación de datos y REFS
para el voltaje de referencia. Luego configure los bits ADMUX
para determinar el canal de entrada. Finalmente, configure ADSC
para iniciar una conversión. Puedes esperar en este bit o volver a él más tarde. Cuando se complete la conversión, el hardware la restablecerá a cero. En ese punto, lea el valor de ADCL
y combine (shift y OR) con el valor leído de ADCH
en un entero de 16 bits. Tenga en cuenta que debe leer ADCL
antes de leer ADCH
. La lectura de ADCL
bloquea los registros ADC evitando que el hardware sobrescriba los registros en una conversión posterior. La lectura de ADCH
los desbloquea.
Vamos a echar un vistazo más de cerca al proceso de software en el próximo capítulo.