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