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).
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.
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.
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.
– 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.
- 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.
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.
– 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.
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.
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.
– ADCL
ADCL corresponde ao registrador localizado a direita do principal. Quando ADLAR está setado em 0, temos a seguinte configuração:
Já 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:
Já 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:
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.
Técnico em eletrotécnica e estudante de Engenharia Elétrica pelo IFES.