Leitura Analógica utilizando Registradores

Dentro dos mais variados tipos de projetos que podem ser desenvolvidos utilizando a plataforma arduino, surgem casos em que há necessidade de manipular os registradores presentes no ATmega328p (microcontrolador do arduino) com o objetivo de melhorar a velocidade de leitura dos terminais analógicos, conseguindo obter mais informações em menor tempo, sendo assim mais eficiente do que o método tradicional de leitura analógica “analogRead()”.

Neste tutorial lhe ensinaremos a como manipular diretamente os registradores presentes no ATmega328p afim de otimizar a leitura analógica de um dos terminais do arduino.

Antes de prosseguirmos, temos que esclarecer algumas dúvidas que podem surgir no decorrer do caminho, por exemplo: o que são registradores? Como funcionam? Quais os tipos existentes? Todas essas perguntas serão respondidas logo abaixo.

É necessário manipular diretamente os registradores no void setup() pois desse modo o arduino conseguirá fazer um maior número de leituras durante o tempo de 16,66 ms (equivalente a um período da frequência de 60 Hz da rede elétrica).

kit robotica educacional com Arduino ESP ou Microbit

O que são Registradores?

Registrador corresponde a uma memória capaz de armazenar um número limitado de bits, além de poder transferir esses bits para outros registradores. Um registrador é constituído por um conjunto de flip-flops, como pode ser visto logo abaixo.

Registrador paralelo

Além disso, existem dois tipos de registrador: paralelo e de deslocamento.

Registrador paralelo

Possui a configuração mostrada na imagem logo acima. Consiste em um registrador capa de armazenar dados a partir de um único barramento, no qual a cada pulso do clock o bit presente na entrada dos flip-flops são memorizados e colocados na saída. Abaixo vemos como funciona esse tipo de registrador.

(gif proteus)

Registrador de deslocamento

Consiste em uma configuração de flip-flops que permite a conversão de dados: série-paralelo e paralelo-série. Tanto sua entrada quanto sua saída podem ser serial ou paralela. Abaixo podemos ver a configuração dos flip-flops de modo que seja um registrador de deslocamento, assim como vemos seu funcionamento. Caso deseja saber mais a respeito de Registradores de Deslocamento, visite o post Registrador de Deslocamento clicando aqui.

Registrador de deslocamento

Quais registradores vamos utilizar e o que eles fazem?

 

Como se configura um registrador?

Dica: um conceito não tão normal é explicar que se configura o os registradores com 1’s e 0’s através de sequências de bits

 

Mãos à obra

 

Entendendo a fundo

 

Hardware

Para compreender melhor cada linha de programação, visto que atuamos diretamente nos registradores do Arduino, é necessário conhecer melhor cada registrador, assim como suas determinadas funções.

Abaixo está o diagrama geral informando como ocorre o processo de conversão dos valores analógicos para digitais, visto que ele será necessário para a explicação dos registradores. Durante as explicações, serão apresentados partes específicas desse diagrama. Ele também poderá ser consultado indo diretamente ao datasheet do microcontrolador ATmega328p.

Diagrama de blocos representando a operação de conversão analógica para digital

– ADMUX

ADMUX é um registrador composto por 8 bits no qual ele contém a tensão de referência a ser utilizada para a leitura dos terminais analógicos e qual terminal será utilizado para as leituras. Abaixo está a tabela que informa os bits correspondentes a cada informação do registrador.

Tabela geral das informações que compõem o byte ADMUX
  • MUX3…0

Os primeiros 4 bits correspondem ao pino responsável pela leitura analógica. Abaixo está a tabela com as informações referentes para setar o pino desejado.

Tabela referente aos pinos e sua representação binária no registrador ADMUX

Pelo diagrama abaixo vemos que os bits relacionados a seleção dos pinos de entrada são conectados a um decodificador, no qual sua saída é conectada ao multiplexador, onde os terminais A0…A5 estão conectados nas entradas desse multiplexador.

Diagrama relacionado aos pinos de leitura analógica

– REFS1 e REFS0

Os dois bits mais significativos (7º e o 6º bit) corresponde a tensão de referência que deverá ser utilizada para a leitura do valor analógico. Assim como anteriormente, o datasheet do ATmega328p apresenta uma tabela para auxiliar a configuração desta informação.

Tabela referente a seleção da tensão de referência

O padrão é utilizar AREF, no qual não conectamos nada ao terminal.

Pelo diagrama abaixo podemos entender melhor o funcionamento a respeito do 6º e 7º bit do ADMUX, para a seleção da tensão de referência.

Diagrama relacionado ao 6º e 7º bit

O bit REFS1 é conectado ao multiplexador, no qual esse bit definirá qual entrada será direcionada a saída. Se o REFS1 seja 0, a saída será o AVCC, mas  se o bit for 1, será a tensão interna de referência 1,1V. Já o bit REFS0 é responsável por controlar a conexão entre a saída do multiplexador acima e o AREF, onde caso seja esse bit seja 0, não haverá conexão, mas caso seja 1, haverá conexão entre eles.

– ADLAR

O bit referente ao ADLAR é responsável pela configuração da forma de exibição dos resultados (/da conversão feita pelo ADC) no Registrador de Dados ADC. Setando ele em 1, o resultado será alinhado a esquerda, e setando 0, se alinhará a direita. Ele é composto por dois registradores, chamados: Registrador de Dados ADC Low e High. Abaixo está o diagrama com sua localização na operação de conversão. Veja que abaixo do nome principal do registrador está entre parênteses os nomes ADCH e ADCL, que correspondem a siglas correspondentes de Low (ADCL) e High (ADCH).

obs: o registrador principal do Registrador de Dados ADC possui 16 bits, pois se trata da união dos dois registradores.

Diagrama referente ao registrador ADC Data Register

– ADCL

ADCL corresponde ao registrador localizado a direita do principal. Quando ADLAR está setado em 0, temos a seguinte configuração:

Tabela referente ao ADCL quando setado em 0

Já quando setado em 1:

Tabela referente ao ADCL quando setado em 1

– ADCH

ADCH corresponde ao registrador localizado a esquerda do principal. Quando ADLAR está setado em 0, temos a seguinte configuração:

Tabela referente ao ADCH quando setado em 0

Já quando setado em 1:

Tabela referente ao ADCH quando setado em 1

Os valores ADC9…ADC0 equivalem aos bits resultantes da conversão AD realizada anteriormente.

Processo de conversão

O ADC irá gerar um resultado de 10 bits que será apresentado nos Registradores de Dados ADC, ADCH e ADCL. Dependendo do valor de ADLAR, o resultado será apresentado a esquerda ou a direita. Caso o resultado seja ajustado a direita e apresente 8 bits, basta ler o valor presente no registrador ADCH. Caso contrário, o ADCL deverá ser lido primeiro, e logo após o ADCH, pois após a sua leitura, não será possível modificar os valores desses registradores. Já quando é efetuada a leitura no registrador ADCH, o acesso para modificação é reativado. Com isso, pode ocorrer as seguinte situações:

  • Efetuar a leitura do ADCL, e ocorrer uma conversão antes do registrador ADCH ser lido, tanto os dados desse registrador quanto os novos valores que foram convertidos serão perdidos;
  • Caso seja feita uma inversão na ordem de leitura dos registradores (ler ADCH antes de ADCL), após efetuar a leitura de ADCL, o acesso aos valores serão bloqueados e nenhuma alteração poderá ser feita, perdendo com isso os dados de conversões futuras.

ADCSRA e ADCSRB

Os registradores ADCSRA e ADCSRB são responsáveis pelo processo de conversão analógica para digital no arduino. ADCSR é a sigla do termo inglês ADC (Analog Digital Converter) Control and Status Register (Registrador de Status e Controle ADC), no qual o microcontrolador do arduino apresenta dois, A e B.

O ADCSRA é composto pelos seguintes bits:

Byte referente ao registrador ADCSRA

Os bits que compõem o byte do registrador ADCSRA são:

  • ADEN: ativa o sistema ADC. É necessário estar setado em 1 para que o processo de conversão ocorra. Quando o processo se encerra, ele retornará ao valor 0.
  • ADSC: quando 1 ele inicia o processo de conversão, já quando for 0, encerra-se o processo.
  • ADATE: é utilizado para configurar o trigger do arduino. Caso seja setado em 1, o auto trigger do conversor AD é habilitado.
  • ADIF: Este bit é definido quando uma conversão de ADC é concluída e os registros de dados são atualizados.
  • ADIE:Quando esse bit é gravado em um e o bit 1 em SREG é definido, a interrupção completa de conversão do ADC é ativada.
  • ADPS2…0:Esses bits determinam o fator de divisão entre a freqüência do clock do sistema e o clock de entrada para o ADC.

Software

 

 

Esse diagrama aqui está bem complexo para que não conhece o assunto. Você não detalhou ele e tem muita coisa. Seria legal vc resumir o que se vÊ nele. Talvez com setas ou com um texto explicando isso.

tópicos que acho que faltam aqui:

  • Porque usar manipulação de registradores?
  • O que são Registradores?
  • Como eles funcionam?
  • Quais registradores vamos mexer e o que eles fazem?
  • Como se configura o registradores (um conceito não tão normal é explicar que se configura o os registradores com 1’s e 0’s através de sequências de bits
  • ai depois vc começa a explicar o Admux

Não é para ser grande. Mas tem que ser didático. Se for colocar essas imagens, tem que explicar o que elas significam melhor ou fazer uma no paint que seja mais didática.

OBS: Será que não seria melhor você fazer um conteúdo só sobre esse assunto e apontar ele aqui? Assim você deixa esse tutorial mais fluido e aproveita esse assunto importante. Te um tutorial no portal sobre isso mais ele está ruim. Você poderia usar ele como base para melhorá-lo.

Nesse tutorial você poderia resumir bastante esse assunto.