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.
//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