- O que é ADC (Conversão Analógico para Digital)
- ADC no Microcontrolador AVR Atmega16
- Componentes necessários
- Diagrama de circuito
- Configurando Registros de Controle ADC no Atmega16
- Programando Atmega16 para ADC
Um recurso comum usado em quase todas as aplicações embarcadas é o módulo ADC (conversor analógico para digital). Esses conversores analógico para digital podem ler a tensão de sensores analógicos como sensor de temperatura, sensor de inclinação, sensor de corrente, sensor Flex, etc. Neste tutorial aprenderemos o que é ADC e como usar o ADC no Atmega16. Este tutorial inclui a conexão de um pequeno potenciômetro ao pino ADC do Atmega16 e 8 LEDs são usados para exibir a alteração da tensão do valor de saída do ADC em relação à alteração no valor de entrada do ADC.
Anteriormente, explicamos o ADC em outros microcontroladores:
- Como usar ADC em ARM7 LPC2148 - Medindo Tensão Analógica
- Como usar ADC em STM32F103C8 - Medindo Tensão Analógica
- Como usar ADC em MSP430G2 - Medindo Tensão Analógica
- Como usar ADC no Arduino Uno?
- Usando Módulo ADC de Microcontrolador PIC com MPLAB e XC8
O que é ADC (Conversão Analógico para Digital)
ADC significa Conversor Analógico para Digital. Em eletrônica, um ADC é um dispositivo que converte um sinal analógico como corrente e tensão em código digital (forma binária). No mundo real, a maioria dos sinais são analógicos e qualquer microcontrolador ou microprocessador entende a linguagem binária ou digital (0 ou 1). Então, para fazer os microcontroladores entenderem os sinais analógicos, temos que converter esses sinais analógicos em forma digital. ADC faz exatamente isso por nós. Existem muitos tipos de ADC disponíveis para diferentes aplicações. Poucos ADC's populares são flash, aproximação sucessiva e sigma-delta.
O tipo mais barato de ADC é o de aproximação sucessiva e neste tutorial o ADC de aproximação sucessiva será usado. Em um tipo de ADC de aproximação sucessiva, uma série de códigos digitais, cada um correspondendo a um nível analógico fixo, são gerados sucessivamente. Um contador interno é usado para comparar com o sinal analógico em conversão. A geração é interrompida quando o nível analógico torna-se um pouco maior do que o sinal analógico. O código digital corresponde ao nível analógico é a representação digital desejada do sinal analógico. Isso conclui nossa pequena explicação sobre as aproximações sucessivas.
Se você deseja explorar o ADC em muito mais profundidade, pode consultar nosso tutorial anterior sobre ADC. ADCs estão disponíveis na forma de ICs e também microcontroladores vêm com ADC embutidos hoje em dia. Neste tutorial, usaremos o ADC embutido do Atmega16. Vamos discutir sobre o ADC embutido do Atmega16.
ADC no Microcontrolador AVR Atmega16
O Atmega16 possui um ADC embutido de 10 bits e 8 canais. 10 bits correspondem a isso, se a tensão de entrada for 0-5 V, então ela será dividida em um valor de 10 bits, ou seja, 1024 níveis de valores analógicos discretos (2 10 = 1024). Agora, 8 canais correspondem aos 8 pinos ADC dedicados no Atmega16, onde cada pino pode ler a tensão analógica. A PortA completa (GPIO33-GPIO40) é dedicada à operação ADC. Por padrão, os pinos PORTA são pinos IO gerais, isso significa que os pinos da porta são multiplexados. Para usar esses pinos como pinos ADC, teremos que configurar certos registros dedicados ao controle ADC. É por isso que os registradores são conhecidos como registradores de controle ADC. Vamos discutir como configurar esses registros para começar a funcionar o ADC embutido.
Pins ADC em Atmega16
Componentes necessários
- Atmega16 Microcontrolador IC
- Oscilador de cristal de 16 MHz
- Dois capacitores 100nF
- Dois capacitores 22pF
- Botão de apertar
- Jumper Wires
- Tábua de pão
- USBASP v2.0
- Led (qualquer cor)
Diagrama de circuito
Configurando Registros de Controle ADC no Atmega16
1. Registro ADMUX (Registro de seleção de multiplexador ADC) :
O registro ADMUX é para a seleção do canal ADC e a seleção da tensão de referência. A imagem abaixo mostra a visão geral do registro ADMUX. A descrição é explicada a seguir.
- Bit 0-4: bits de seleção de canal.
MUX4 |
MUX3 |
MUX2 |
MUX1 |
MUX0 |
Canal ADC selecionado |
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: É usado para ajustar o resultado à direita ou à esquerda.
ADLAR |
Descrição |
0 |
Ajuste direito o resultado |
1 |
Ajuste o resultado à esquerda |
- Bit 6-7: Eles são usados para selecionar a tensão de referência para ADC.
REFS1 |
REFS0 |
Seleção de referência de tensão |
0 |
0 |
AREF, Vref interno desligado |
0 |
1 |
AVcc com capacitor externo no pino AREF |
1 |
0 |
Reservado |
1 |
1 |
Referência de tensão interna 2,56 com capacitor externo no pino AREF |
Agora comece a configurar esses bits de registro no programa de forma que obtenhamos a leitura do ADC interno e a saída para todos os pinos do PORTC.
Programando Atmega16 para ADC
O programa completo é fornecido abaixo. Grave o programa em Atmega16 usando JTAG e Atmel Studio e gire o potenciômetro para variar o valor ADC. Aqui, o código é explicado linha por linha.
Comece criando uma função para ler o valor convertido ADC. Em seguida, passe o valor do canal como 'chnl' na função ADC_read .
unsigned int ADC_read (unsigned char chnl)
Os valores do canal devem estar entre 0 e 7, pois temos apenas 8 canais ADC.
chnl = chnl & 0b00000111;
Escrevendo '40' ou seja, '01000000' no registro ADMUX, selecionamos PORTA0 como ADC0, onde a entrada analógica será conectada para conversão digital.
ADMUX = 0x40;
Agora, esta etapa envolve o processo de conversão ADC, onde ao gravar UM no bit ADSC no registro ADCSRA, iniciamos a conversão. Depois disso, espere o bit ADIF retornar o valor quando a conversão for concluída. Paramos a conversão escrevendo '1' no bit ADIF no registro ADCSRA. Quando a conversão for concluída, retorne o valor ADC.
ADCSRA - = (1 <
Aqui, a tensão de referência ADC interna é selecionada definindo o bit REFS0. Depois disso, ative o ADC e selecione o prescaler como 128.
ADMUX = (1 <
Agora salve o valor ADC e envie para PORTC. No PORTC, 8 LEDs são conectados, o que mostra a saída digital no formato de 8 bits. O exemplo que mostramos varia a tensão entre 0V a 5V usando um potenciômetro de 1K.
i = ADC_read (0); PORTC = i;
O multímetro digital é usado para exibir a tensão de entrada analógica no pino ADC e 8 LEDs são usados para mostrar o valor de 8 bits correspondente da saída ADC. Basta girar o potenciômetro e ver o resultado correspondente no multímetro, bem como nos LEDs brilhantes.
O código completo e o vídeo de trabalho são fornecidos abaixo.