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