Como fazer interface serial ADC0831 com microcontrolador AVR (ATmega16) – (Parte 27/46)

ADC é um dispositivo eletrônico que converte os sinais analógicos em números digitais proporcionais à magnitude da tensão. Os chips ADC como ADC0804, ADC0809 etc., fornecem saída digital de 8 bits. O dispositivo controlador precisa de oito pinos para receber os dados de 8 bits (para obter mais detalhes sobre o ADC, consulte Usando o ADC embutido do AVR). Algumas aplicações precisam de ADCs de resolução mais alta (saída de dados digitais de 10 bits ou mais) para precisão dos dados.
O uso de ADCs paralelos é uma opção para tais aplicações. No entanto, o uso de ADC paralelo aumentará o tamanho do hardware, pois um ADC paralelo de 10 bits terá 10 linhas de saída. Além disso, talvez você precise usar um controlador com maior número de pinos. A outra opção é usar ADC serial, que necessita de menor número de pinos. Como os dados são transmitidos serialmente, a taxa de transferência de dados do ADC serial é baixa em comparação com o ADC paralelo. Eles podem servir como uma alternativa muito boa em aplicações onde a velocidade de transferência de dados não é um ponto crítico. Este artigo explora a interface do serial ADC0831 com ATmega16.

O ADC0831 é um ADC serial de canal único de 8 pinos que fornece saída de dados de 8 bits. A entrada pode ser do tipo de terminação única ou diferencial. Usando a opção de entrada diferencial, a conversão A/D pode ser realizada para dois níveis de tensão diferentes. A função de cada pino é descrita no seguinte tabela:

Nome do pino e funções de serialADC0831

Fig. 2: Nome do pino e funções do serialADC0831
1. (Seleção de chip) – Para iniciar a conversão, é fornecido um valor de alto para baixo.
2. Vem (+) (Entrada Analógica Positiva) – Tensão positiva é aplicada neste pino. O intervalo de entrada para isso é de 0 a 5votls.
3. Vem (-) (Entrada analógica negativa) – Tensão negativa é aplicada neste pino.
4. GND (Terra) – Este pino está conectado ao terra do circuito.
5. Vreferência (Voltagem de referência) – Este pino é usado para definir a faixa de tensão de entrada do ADC.
6. CLK (relógio) – O pulso do clock é fornecido no pino CLK para sincronização.
7. DO (saída de dados) – Este pino é um pino de saída do ADC, os dados de saída serial estão disponíveis neste pino.
8. Vcc (fonte de alimentação) – Isso está conectado à fonte de alimentação de +5 volts.
Como funciona o ADC serial:
Diagrama de blocos do ADC serial trabalhando com AVR
Fig. 3: Diagrama de blocos do ADC serial trabalhando com AVR
O diagrama acima mostra um sistema no qual o dispositivo ADC recebe dados analógicos do transdutor. O controlador é usado para controlar o ADC IC e processar os dados digitais convertidos. O sinal analógico é dado no pino Vem(+). No modo diferencial, tensão no pino Vem(+) deve ser maior que Vem(-) caso contrário, os dados de saída não serão gerados pelo ADC. A conversão de dados é iniciada dando um pulso alto para baixo no pino CS. No primeiro ciclo de clock, o ADC envia o bit '0' ao controlador que mostra que os bits seguintes são os bits de dados. O MSB dos dados convertidos é enviado primeiro. O diagrama de temporização do ADC0831 é mostrado abaixo.
Diagrama de temporização do ADC0831 para comunicação serial em AVR
Fig. 4: Diagrama de temporização do ADC0831 para comunicação serial no AVR
Objetivo: Converter a tensão de saída analógica do resistor variável em sinais digitais usando ADC0831 e exibi-la no LCD.
Descrição do circuito:
A conexão do ADC0831 com ATmega16 é mostrada no diagrama de circuito. A saída do resistor variável está conectada a Vem(+) e Vem(-) o pino está aterrado. Os pinos CS, CLK e DO do ADC estão conectados ao microcontrolador.
Etapas de programação:
1. Envie um pulso alto para baixo ao pino CS para inicializar a conversão.
2. Monitore o status do bit D0 até que ele fique baixo.
3. Envie um pulso de clock.
4. Receba os bits de dados do pino DO do ADC 0831.
5. Armazene os bits de dados em uma variável usando operação bit a bit.
6. Quando o byte de dados for recebido do ADC serial, exiba-o no LCD.

Código-fonte do projeto

###


// Programa para interface serial ADC 0831 com microcontrolador AVR (ATMEGA 16)
#incluir #incluir #incluir #define DO PD2 #define CLK PD1 #define CS PD0 #define lcdport PORTA #define rs PB0 #define rw PB1 #define em PB2 vazio lcd_init(vazio); void lcdcmd(caractere não assinado); void lcddata(caractere não assinado); void adc_conversion(caractere não assinado); vazio twi_init ; caractere não assinado adc_read ; int principal { dados de caracteres não assinados (12) = "SAÍDA ADC:"; int i=0; bits de caracteres não assinados = 0; DDRA=0xFF; DDRB=0x07; DDRD=~_BV(DO); //O pino DO é o pino de entrada e o restante dos pinos são os pinos de saída DDRC=0xFF; PORTD=0x07; lcd_init ; enquanto(dados(i)!='�') { dados lcd(dados(i)); _atraso_ms(5); eu++; } enquanto(1) { PORTD =(1< // pulso de alto para baixo é fornecido ao pino CS _atraso_ms(1); PORTD&=~(1< _atraso_ms(1); while(PIND & _BV(DO)) // espera até que o bit 0 seja recebido { PORTD =(1< _atraso_ms(1); PORTD&=~(1< _atraso_ms(1); } PORTD =(1< // um pulso de clock é fornecido _atraso_ms(1); PORTD&=~(1< _atraso_ms(1); para(eu=0;eu<8;eu++) { PORTD =(1< // dados recebidos quando o pulso está alto _atraso_ms(1); bits=bits<<1; //"bits" é variável para armazenar dados. A operação de deslocamento para a esquerda é executada para dar lugar ao próximo bit if(bit_is_set(PIND,DO)) // se 1 for recebido bits =1; // bits são incrementados em 1 PORTD&=~(1< //pulso baixo _atraso_ms(1); } adc_conversion(bits); // } } /* esta função é escrita para converter valores inteiros em seu valor ASCII correspondente*/ void adc_conversion(caractere não assinado adc_out) { não assinado int adc_out1; int i=0; posição do caractere=0xC2; para(i=0;i<=2;i++) { adc_out1=adc_out%10; adc_out=adc_out/10; lcdcmd(posição); lcddata(48+adc_out1); posição--; } } vazio lcd_init //função para inicialização do LCD { lcdcmd(0x38); lcdcmd(0x0C); lcdcmd(0x01); lcdcmd(0x06); lcdcmd(0x80); } void lcdcmd(char unsigned cmdout) { lcdport=cmdout; PORTAB=(0< _atraso_ms(10); PORTAB=(0< } void lcddata (saída de dados de caracteres não assinados) { lcdport=dataout; PORTAB=(1< _atraso_ms(10); PORTAB=(1< }

###

Diagramas de circuito

Diagrama de circuito de como fazer interface serial-ADC0831 com microcontrolador AVR-ATmega16

Componentes do Projeto

  • ATmega16
  • LCD

Vídeo do projeto

Conteúdo Relacionado

Voltar para o blog

Deixe um comentário

Os comentários precisam ser aprovados antes da publicação.