- Què és l'ADC (conversió analògica a digital)
- ADC al microcontrolador AVR Atmega16
- Components necessaris
- Esquema de connexions
- Configuració de registres de control ADC a Atmega16
- Programació Atmega16 per ADC
Una característica comuna que s’utilitza en gairebé totes les aplicacions incrustades és el mòdul ADC (convertidor analògic a digital). Aquests convertidors analògic a digital poden llegir la tensió dels sensors analògics com a sensor de temperatura, sensor d'inclinació, sensor de corrent, flexió de l'sensor, etc. En aquest tutorial anem a aprendre què és ADC i com utilitzar ADC a ATmega16. Aquest tutorial inclou la connexió d’un petit potenciòmetre al pin ADC d’Atmega16 i s’utilitzen 8 LED per mostrar el voltatge canviant del valor de sortida ADC respecte al canvi del valor d’entrada ADC.
Anteriorment vam explicar ADC en altres microcontroladors:
- Com utilitzar ADC a ARM7 LPC2148 - Mesurament de la tensió analògica
- Com s'utilitza ADC a STM32F103C8 - Mesurament de la tensió analògica
- Com s'utilitza ADC a MSP430G2: mesurament de la tensió analògica
- Com utilitzar ADC a Arduino Uno?
- Ús del mòdul ADC del microcontrolador PIC amb MPLAB i XC8
Què és l'ADC (conversió analògica a digital)
ADC significa convertidor analògic a digital. En electrònica, un ADC és un dispositiu que converteix un senyal analògic com el corrent i el voltatge en codi digital (forma binària). Al món real, la majoria dels senyals són analògics i qualsevol microcontrolador o microprocessador entén el llenguatge binari o digital (0 o 1). Per tant, per fer que els microcontroladors entenguin els senyals analògics, hem de convertir aquests senyals analògics en forma digital. ADC ho fa exactament per nosaltres. Hi ha molts tipus d’ADC disponibles per a diferents aplicacions. Pocs ADC populars són flash, aproximació successiva i sigma-delta.
El tipus d’ADC més econòmic és l’aproximació successiva i en aquest tutorial s’utilitzarà l’ADC d’aproximació successiva. En un tipus d'aproximació successiva d'ADC, es generen successivament una sèrie de codis digitals, que corresponen a un nivell analògic fix. S'utilitza un comptador intern per comparar amb el senyal analògic en conversió. La generació s’atura quan el nivell analògic es fa més gran que el senyal analògic. El codi digital correspon al nivell analògic és la representació digital desitjada del senyal analògic. Això acaba la nostra petita explicació sobre aproximació successiva.
Si voleu explorar l'ADC amb molta profunditat, podeu consultar el nostre tutorial anterior sobre l'ADC. Els ADC estan disponibles en forma de CI i també els microcontroladors inclouen ADC incorporats actualment. En aquest tutorial utilitzarem ADC incorporat d'Atmega16. Anem a parlar sobre l'ADC incorporat d'Atmega16.
ADC al microcontrolador AVR Atmega16
Atmega16 té un ADC incorporat de 10 bits i 8 canals. 10 bits correspon a que si la tensió d'entrada és de 0-5V, es dividirà en un valor de 10 bits, és a dir, 1024 nivells de valors analògics discrets (2 10 = 1024). Ara els canals de vuit corresponen als 8 pins ADC dedicats d’Atmega16, on cada pin pot llegir la tensió analògica. PortA complet (GPIO33-GPIO40) està dedicat a l'operació ADC. Per defecte, els pins PORTA són pins IO generals, vol dir que els pins de port estan multiplexats. Per utilitzar aquests pins com a pins ADC haurem de configurar certs registres dedicats al control ADC. És per això que els registres es coneixen com a registres de control ADC. Parlem de com configurar aquests registres per començar a funcionar l'ADC incorporat.
Pins ADC a Atmega16

Components necessaris
- CI de microcontrolador Atmega16
- Oscil·lador de vidre de 16 MHz
- Dos condensadors 100nF
- Dos condensadors de 22pF
- Polsador
- Jumper Wires
- Taula de pa
- USBASP v2.0
- Led (qualsevol color)
Esquema de connexions


Configuració de registres de control ADC a Atmega16
1. Registre ADMUX (registre de selecció de multiplexors ADC) :
El registre ADMUX permet seleccionar el canal ADC i seleccionar la tensió de referència. La imatge següent mostra la visió general del registre ADMUX. La descripció s’explica a continuació.

- Bit 0-4: bits de selecció de canals.
|
MUX4 |
MUX3 |
MUX2 |
MUX1 |
MUX0 |
Canal ADC seleccionat |
|
0 |
0 |
0 |
0 |
0 |
ADC0 |
|
0 |
0 |
0 |
0 |
1 |
ADC1 |
|
0 |
0 |
0 |
1 |
0 |
ADC2 |
|
0 |
0 |
0 |
1 |
1 |
ADC3 |
|
0 |
0 |
1 |
0 |
0 |
ADC4 |
|
0 |
0 |
1 |
0 |
1 |
ADC5 |
|
0 |
0 |
1 |
1 |
0 |
ADC6 |
|
0 |
0 |
1 |
1 |
1 |
ADC7 |
- Bit-5: s’utilitza per ajustar el resultat a la dreta o a l’esquerra.
|
ADLAR |
Descripció |
|
0 |
A la dreta ajustar el resultat |
|
1 |
A l'esquerra, ajusteu el resultat |
- Bit 6-7: s’utilitzen per seleccionar la tensió de referència per a l’ADC.
|
REFS1 |
REFS0 |
Selecció de referència de voltatge |
|
0 |
0 |
AREF, Vref intern desactivat |
|
0 |
1 |
AVcc amb condensador extern al pin AREF |
|
1 |
0 |
Reservat |
|
1 |
1 |
Referència de tensió interna de 2,56 amb condensador extern al pin AREF |
Ara comenceu a configurar aquests bits de registre al programa de manera que aconseguim la lectura i la sortida de l'ADC intern a Tots els pins de PORTC.
Programació Atmega16 per ADC
A continuació es dóna el programa complet. Graveu el programa a Atmega16 mitjançant JTAG i Atmel studio i gireu el potenciòmetre per variar el valor ADC. Aquí, el codi s’explica línia per línia.
Comenceu fent una funció per llegir el valor convertit ADC. A continuació, passeu el valor del canal com a 'chnl' a la funció ADC_read .
unsigned int ADC_read (no signat char chnl)
Els valors dels canals han d’estar entre 0 i 7, ja que només tenim 8 canals ADC.
chnl = chnl & 0b00000111;
En escriure '40', és a dir, '01000000' al registre ADMUX, vam seleccionar PORTA0 com a ADC0 on es connectarà l'entrada analògica per a la conversió digital.
ADMUX = 0x40;
Ara aquest pas implica el procés de conversió ADC, on escrivint ONE a ADSC Bit al registre ADCSRA iniciem la conversió. Després d'això, espereu que el bit ADIF torni el valor quan finalitzi la conversió. Parem la conversió escrivint "1" al bit ADIF al registre ADCSRA. Quan la conversió s'hagi completat, torneu el valor ADC.
ADCSRA - = (1 <
Aquí es selecciona el voltatge de referència ADC intern configurant el bit REFS0. Després, activeu ADC i seleccioneu prescaler com a 128.
ADMUX = (1 <
Ara deseu el valor ADC i envieu-lo a PORTC. A PORTC, es connecten 8 LED que mostraran la sortida digital en format de 8 bits. L'exemple que hem mostrat varia el voltatge entre 0V a 5V mitjançant una olla de 1K.
i = ADC_read (0); PORTC = i;

El multímetre digital s’utilitza per mostrar la tensió d’entrada analògica al pin ADC i s’utilitzen 8 LED per mostrar el valor corresponent de 8 bits de la sortida ADC. Només cal girar el potenciòmetre i veure el resultat corresponent al multímetre i als LED brillants.
A continuació es mostra el codi complet i el vídeo de treball.
