Fork me on GitHub

Microcontrolandos

O Blog está passando por uma fase de mudanças. Todos os posts estão sendo atualizados, códigos, links e imagens estão sendo arrumados. Conteúdos novos ainda estão por vir.

AVR: Conversor AD

Share:

AVR: Conversor AD



O módulo ADC do Atmega328P tem resolução de 10-bits e precisão +/-2LSB. Há 8 canais ADC, disponíveis através dos pinos( ADC0-ADC5 ) e três canais internos: Sensor de temperatura (canal 8), GAP Reference(1.1V) e GND(0V).

O módulo ADC converte um valor de tensão em um valor digital de 10-bits. O valor mínimo é o GND(0V) e o valor máximo é a tensão de referência. Você pode optar por utilizar a tensão de referência: interna (1.1V), AVcc ou AREF, configurando os bits REFS0:1 do registro ADMUX.




Os 8 canais são selecionados através dos bits MUX3:0 do registro ADMUX.



Para habilitar o módulo ADC, deve setar o bit ADEN do registro ADCSRA. Os 10-bits gerados são carregados nos registros ADCH e ADCL. o bit ADLAR do registro ADMUX ajusta o deslocamento para esquerda ou para direita.


ADC = ( Vin * 1024 ) / Vref

Iniciando a Conversão
Para iniciar a conversão, basta setar o bit ADSC do registro ADCSRA. Este bit mantém em nivel logico 1 enquanto a conversão estiver em progresso. Após o fim da conversão o bit é limpo.

Pode-se iniciar uma conversão através de várias fontes de disparos, ativando o bit ADATE do registro ADCSRA. As fontes de dispara é selecionado através do bit ADTS do registro ADCSRB.

Prescaler e Tempo de Conversão
O módulo ADC possui um prescaler para controlar a frequência de clock, para uma frequência aceitável acima de 100KHz. O prescaler é selecionado através dos bits ADPS2:0 do registro ADCSRA. Uma conversão normal leva em torno de 13 ciclos de clock para completar. A primeira conversão, logo após ativar o módulo ADC, leva 25 ciclos de clock para completar.


Obs.:

- O pino AVcc é a entrada de alimentação do módulo ADC.

REGISTROS




EXEMPLO
MikroC PRO AVR
//Função que faz as configurações globais do módulo ADC
void Init_ADC()
{
   //Vref = AREF, deslocado para direita
   ADMUX = ( 0 << REFS1 ) | ( 0 << REFS0 ) | ( 0 << ADLAR );
   
   //Seleciona o prescaler 1:32 e habilita o módulo ADC
   ADCSRA = ( 1 << ADPS2 ) | ( 0 << ADPS1 ) | ( 1 << ADPS0 ) | ( 1 << ADEN );

}

//função que realiza a leitura de um canal do módulo ADC
unsigned Read_ADC( char channel )
{
   //Define o canal
   ADMUX &= 0xF0;
   ADMUX |= channel & 0x0F;
   
   //Desliga a função de porta digital da porta analógica
   DIDR0 = 1 << channel;
   
   //Inicia a conversão
   ADCSRA.ADSC = 1;
   //Aguarda o fim da conversão
   while( ADCSRA.ADSC == 1 );
   //Retorna o valor
   return( *(unsigned*)&ADCL );
}

char resultado[6];

void main()
{
   UART1_Init(9600);
   Init_ADC();
   DDRC = 0; //Define a PORTC como entrada
   
   while(1)
   {
       WordToStr( Read_ADC(0), resultado );
       Uart1_Write_Text( resultado );
       Delay_ms( 1000 );
   }
}

Nenhum comentário