Codificação compatível com Arduino 07: Entrada analógica usando Arduino

Codificação compatível com Arduino 07: Entrada analógica usando Arduino

No tutorial anterior, discutimos a saída analógica na forma de sinais PWM ao usar Arduíno. Geramos uma onda PWM do Arduino empregando a função analogWrite que se aproxima de uma onda senoidal retificada. Ele, então, usa essa saída analógica para atenuar um LIDERADO.

Um controlador pode fazer interface e interagir com componentes e dispositivos eletrônicos externos de cinco maneiras possíveis: saída digital, entrada digital, saída analógica, entrada analógica e comunicação serial.

Neste tutorial, discutiremos a entrada analógica. A maioria dos sensores emite tensão analógica proporcional a uma quantidade física (como temperatura, umidade, pressão, intensidade de luz, etc.).

Um controlador pode interpretar o valor da quantidade física detectando a magnitude desta tensão analógica. Além disso, a maioria dos controladores possui canais de conversor analógico-digital (ADC) integrados que detectam a tensão analógica dos sensores e os convertem em uma leitura digitalizada. Os valores digitalizados são comparados com a curva de sensibilidade do sensor por programas definidos pelo usuário para derivar o valor da quantidade física.

Detecção de tensões unipolares vs. bipolares
Para a entrada analógica, os controladores possuem um periférico integrado, denominado conversor analógico-digital (ADC). A maioria dos microcontroladores pode detectar apenas tensões unipolares e não tensões bipolares. O mesmo acontece com as placas Arduino.

Os microcontroladores AVR integrados do Arduino também podem detectar apenas tensões unipolares. Essas tensões analógicas normalmente variam do terra (0V) até sua tensão operacional (5/3,3V). A razão pela qual o Arduino e a maioria dos outros microcontroladores possuem ADCs que só podem detectar tensões unipolares é que os recursos do ADC são construídos apenas para interface de sensores. Os sensores geralmente emitem tensões unipolares não periódicas.

No entanto, a conversão analógico-digital é usada em diversas aplicações diferentes, como gravação de música, processamento de sinal digital, codificação digital, imagem digital e muito mais (além de sensores e instrumentação).

Muitas dessas aplicações requerem conversão analógico-digital de sinais periódicos ou sinais que podem ser de natureza bipolar. Nesses casos, o Arduino (e muitos outros microcontroladores) pode precisar fazer interface com conversores bipolares para unipolares externos.

Conversão analógico para digital
Os sinais analógicos são de natureza contínua e não possuem faixa fixa de valores. Para medir tensões analógicas, estes sinais devem ser convertidos em sinais digitais. O sinal digital obtido após a conversão é um número binário de resolução pré-definida (como 8/10/12/14/16 bits), que é proporcional à magnitude da tensão analógica.

O valor deste número binário depende da tensão de referência com a qual o sinal analógico é comparado e da resolução do valor. Isto significa que quanto maior a resolução, menor será a tensão de referência. E, para ser mais preciso, a tensão analógica será medida em qualquer instante do sinal.

O periférico – que converte a tensão analógica em um valor digital – é chamado de conversor analógico-digital. Os ADCs são construídos para usar diferentes tipos de técnicas de modulação para realizar essa conversão, como Modulação por Código de Pulso (PCM), Modulação Delta, Modulação Delta Adaptativa, Aproximação Sucessiva e assim por diante.

Diferentes técnicas de modulação variam em seu funcionamento, embora o resultado seja sempre uma quantização do sinal analógico. É, então, codificado em um número binário.

Existem muitas arquiteturas (construção) populares para projetar ADCs. As arquiteturas ADC mais populares são conversão direta/flash, aproximação sucessiva (SAR), pipeline, sigma-delta, comparação de rampa, Wilkinson, inclinação dupla e arquitetura intercalada no tempo. Os ADCs integrados nos controladores AVR usados ​​nas placas Arduino normalmente possuem ADCs SAR.

Outro fator importante a considerar na conversão analógico-digital é a taxa de amostragem. A taxa de amostragem é a taxa de tempo na qual a tensão do sinal analógico é amostrada. Por exemplo, se um sinal analógico for amostrado a uma taxa de 50 kHz, isso significa que a tensão do sinal analógico é medida a cada 20 microssegundos. Entretanto, se o sinal for plotado após a conversão, a taxa de amostragem será maior e o sinal amostrado ficará muito mais próximo do sinal analógico real.

Entrada analógica usando Arduino
Placas Arduino use diferentes microcontroladores AVR/SAMD/SAM. A maioria desses microcontroladores possui pelo menos seis canais ADC que normalmente são multiplexados para um ADC SAR. A resolução de um ADC integrado pode variar de uma placa para outra, embora o ADC na maioria das placas tenha uma resolução de pelo menos 10 bits.

A referência de tensão padrão é sempre a tensão de operação da placa, portanto as placas podem “sentir” as tensões unipolares do terra (0V) a 5 ou 3,3V. Também é possível definir a referência de tensão para tensões internas predefinidas ou para uma fonte de tensão externa.

Em algumas placas Arduino, a referência de tensão para a conversão analógico-digital pode ser definida individualmente para cada canal.

A taxa de amostragem do sinal analógico é definida pré-escalando o clock usado pelo controlador integrado. A frequência de amostragem é sempre um fator da frequência do clock do controlador, onde o fator é determinado pelo pré-escalador integrado.

Para resolução mais baixa (como 8 bits), o ADC pode usar uma frequência mais alta para maximizar a taxa de amostragem.

Os recursos ADC de diferentes placas Arduino estão resumidos aqui.

Entrada analógica usando Arduino UNO
Arduino UNO possui seis canais de entrada analógica. O controlador ATmega328P no UNO possui um ADC de aproximação sucessiva de 10 bits, que é conectado a um multiplexador analógico de 8 canais. Este multiplexador analógico permite oito entradas de tensão de terminação única nos pinos da porta A do controlador. A entrada de tensão de terminação única refere-se ao terra (0V).

No SAR ADC, o comparador compara essencialmente a tensão de entrada com a faixa sucessivamente estreita de tensões. Em cada etapa, a tensão de entrada é comparada com uma tensão de um DAC interno (conversor digital para analógico), onde a saída do DAC é o ponto médio da faixa de tensão selecionada.

A cada passo, a aproximação é armazenada em um registro de aproximação sucessiva (SAR). Então, vamos supor que uma tensão de 3,2 V seja amostrada de um sinal analógico. É o primeiro comparado com 2,5 V (ponto médio de 0 e 5V).

  • Como 3,2 V é maior que 2,5 V, ele será comparado a seguir com 3,75 V (o ponto médio de 2,5 e 5 V).
  • Como 3,2 V é menor que 3,75 V, ele será comparado a seguir com 3,125 V (o ponto médio de 2,5 e 3,75 V) e assim por diante.

Como o SAR ADC no ATmega328P tem resolução de 10 bits, a tensão de entrada é aproximada sucessivamente 10 vezes para obter uma leitura digital de 10 bits. No entanto, se fosse um ADC SAR de 8 bits, seriam necessárias oito aproximações sucessivas para obter o valor digital de 8 bits e assim por diante.

Em cada aproximação sucessiva obtém-se um bit do valor digital partindo de MSB para LSB (isto significa que na primeira aproximação obtém-se o MSB do valor digital e na próxima aproximação obtém-se o bit próximo ao MSB ). Se em uma aproximação sucessiva a tensão de entrada for maior que o ponto médio da faixa de tensão selecionada, o bit obtido será 1. Se a tensão de entrada for menor que o ponto médio da faixa de tensão selecionada, o bit obtido será 0.

Como o ADC possui resolução de 10 bits, a leitura digital de saída pode variar de 0 a 1023 (2 ^ 10).

Tomando o exemplo de 3,2 V, com referência de 5 V em um SAR ADC de 10 bits, as sucessivas aproximações podem ser resumidas aqui.

Se compararmos isso com a equação de uma conversão ADC padrão de terminação única, os resultados são:

ADC = (VEM/VREFERÊNCIA) * 1024
CA = (3,2 V/5 V) * 1024
= 655,36 = 655 ou (b1010001111)

O ADC possui um pré-escalador de 7 bits e pode usar 1/2, 1/4, 1/8, 1/16, 1/32, 1/64 ou 1/128 da frequência do clock do controlador. O circuito de aproximação sucessiva requer uma frequência de clock de 50 a 200 kHz. Como o controlador tem clock de um cristal de 16 MHz, mesmo que uma pré-escala de 1/128 seja usada para a tensão de entrada de amostragem, a frequência de clock do ADC é de 125 kHz.

A partir dos diagramas de temporização do ADC, é possível ver que o ADC leva 25 ciclos de clock do ADC para a primeira conversão e 13 ciclos de clock do ADC para as conversões normais de terminação única. Isso significa que se a pré-escala 1/128 for selecionada, serão necessários 200 microssegundos (1/125KHz *25) para a primeira amostra e 104 microssegundos (1/125KHz *13) para as outras leituras.

Para as conversões acionadas automaticamente, o ADC leva 13,5 ciclos de clock (108 microssegundos para uma conversão). Para o outro pré-scaler, este tempo de conversão deve ser ainda mais baixo. Normalmente, esse ADC leva de 65 a 260 microssegundos para conversão, com amostragem de entradas analógicas a uma taxa de até 15k SPS (amostras por segundo).

A referência de tensão padrão é 5V. Outras referências de tensão disponíveis nas placas Arduino estão listadas nesta tabela.

O ATmega328P possui os seguintes registros internos, que estão associados ao funcionamento do ADC.

Antes de iniciar uma conversão, a primeira referência de tensão e o canal analógico devem ser selecionados configurando um registro ADMUX. Para habilitar o ADC, o bit ADEN do registro ADCSRA deve ser definido.

Para iniciar as conversões, após o ADC ser habilitado, o bit ADSC do registrador ADCSRA também deve ser setado. A primeira conversão leva 25 ciclos de clock ADC, enquanto as conversões normais levam 13 ciclos de clock ADC. Quando a conversão é concluída, o bit ADIF do registro ADCSRA é definido (verifique o diagrama de temporização do ADC) e o bit ADSC é apagado.

Quando o ADIF é definido, os registros de dados do ADC – e tanto o ADCL quanto o ADCH são atualizados. O valor desses registros deve ser recuperado quando o ADIF estiver configurado para obter a leitura digital do sinal analógico.

Os bits ADPS2:0 do registro ADCSRA são usados ​​para selecionar o pré-escalador e determinam o fator de divisão entre a frequência do clock do sistema e o clock de entrada do ADC. O bit ADLAR do registro ADMUX determina como os registros de dados ADC (ADCL e ADCH) são preenchidos.

Se o bit ADATE do registro ADCSRA estiver definido, o disparo automático do ADC será habilitado. Neste caso, a fonte que aciona a conversão ADC é determinada pelos bits ADTS2:0 do registrador ADCSRB. A fonte do trigger pode ser um temporizador/contador, interrupção externa ou comparador analógico.

A função analogRead
Para detectar a tensão analógica de um sensor (ou qualquer fonte), a função analogRead é usada.

Esta função possui o seguinte código fonte:

Na função analogRead o primeiro canal de entrada analógica deve ser selecionado de acordo com o argumento passado para a função. Em seguida, os registros ADMUX e ADCSRB recebem valores. A função rastreia o bit ADSC do registro ADCSRA em um loop. Sempre que o bit é energizado, ele lê os valores que são atualizados nos registradores ADCL e ADCH.

A função retorna o valor dos registros ADCL e ADCH como um número inteiro. A função tem esta sintaxe:

leitura analógica (pino)

Leva apenas um argumento, que é um número de pino válido onde a entrada analógica é esperada. Ele retorna a leitura analógica que pode variar de 0 a 1023 para uma resolução de 10 bits, ou de 0 a 4095 para uma resolução de 12 bits. Portanto, deve ser atribuído a uma variável que possa armazenar a leitura analógica recuperada. O valor obtido na variável pode então ser utilizado para traçar o sinal analógico ou para tomar uma decisão de acordo com um programa definido pelo usuário.

A função analogReference
É possível definir uma referência de tensão diferente para ADC ao usar o Arduino. Por padrão, a referência de tensão é sempre a tensão de operação da placa. A referência de tensão pode ser alterada ou definida usando a função analogReference .

Esta função possui o seguinte código fonte:

A função possui a seguinte sintaxe:

analogReference(tipo)

Esta função utiliza um único argumento, que é uma opção para a referência de tensão. As opções que podem ser passadas para esta função para diferentes placas Arduino já estão mencionadas na tabela de referência de tensão acima. Esta função não retorna nada.

As primeiras leituras de analogRead podem não ser precisas ao alterar a referência analógica. Portanto, se a função analogReference for chamada, as primeiras leituras retornadas pela função analogRead deverão ser ignoradas no programa definido pelo usuário.

Se a tensão externa for definida como referência analógica, ela nunca deve ser inferior a 0V (tensões bipolares não são permitidas nos pinos analógicos) e não deve ser superior a 5V (sobretensão pode danificar o pino ou mesmo o controlador integrado).

Um resistor interno de 32K está conectado ao pino AREF. Para definir uma tensão externa como referência, ela deve ser fornecida através de um resistor externo. O resistor externo formará um divisor de tensão com o resistor interno no pino AREF e a referência de tensão pode ser definida com segurança sem a preocupação de danificar o pino ou o controlador.

A função analogReadResolution
As placas MKR, Due e Zero possuem múltiplas opções de resolução para conversão analógico-digital. A resolução padrão é de 10 bits. Entretanto, resoluções mais baixas ou mais altas (até 32) podem ser usadas nessas placas. A resolução do ADC pode ser alterada pela função analogReadResolution .

Esta função possui a seguinte sintaxe:

resolução de leitura analógica (bits)

O argumento pedaços determine a resolução da leitura analógica retornada pela função analogRead . Pode assumir qualquer valor de 1 a 32. Deve-se observar que ao definir a resolução acima de 12, as aproximações podem ser prejudicadas. O ideal é usar resoluções de 8, 10 ou 12 bits, a menos que haja uma demanda estrita para escolher uma resolução mais alta.

Se for definida uma resolução que a placa não é capaz, o analogRead retornará uma leitura com a resolução mais alta possível naquela placa, com zeros preenchidos para a resolução extra. Da mesma forma, se for definida uma resolução mais baixa que esteja além da capacidade da placa, o analogRead retornará uma leitura com a resolução mais baixa possível naquela placa – com os bits LSB descartados para corresponder à resolução selecionada.

Receita de taxa de intermitência do LED controlada por potenciômetro
Nesta receita, detectaremos a tensão analógica com a ajuda de um potenciômetro e usaremos a variação da tensão analógica para alterar a duração do piscar de um LED.

Componentes necessários
1. Arduino UNO x1
2. LEDx1
3. Resistor de 330 Ohms x1
4. Pote 10K/100K x1
5. Tábua de ensaio x1
6. Fios de ligação macho-macho ou fios de conexão

Conexões de circuito
Primeiro, conecte o pino 5 de E/S digital do Arduino UNO ao ânodo do LED. Em seguida, conecte o cátodo do LED com um resistor em série de 330 Ohms e aterre o outro terminal do resistor.

Pegue o potenciômetro e conecte seus terminais fixos 1 e 3 ao terra e 5V, respectivamente. Conecte o terminal variável 2 do potenciômetro à entrada analógica A5 do Arduino UNO. A tensão de alimentação DC e o aterramento podem ser fornecidos ao circuito a partir do pino de alimentação de 5V e um dos pinos de aterramento do Arduino UNO.

Diagrama de circuito

Esboço do Arduino

int sensorPin = A5;
int ledPin = 5;
int valor analógico = 0;

configuração vazia {
pinMode(ledPin, SAÍDA);
}

loop vazio {
analogVal = analogRead(sensorPin);
digitalWrite(ledPin, ALTO);
atraso(analógicoVal);
digitalWrite(ledPin, LOW);
atraso(analógicoVal);
}

Como funciona o projeto
O circuito é projetado para alterar a taxa de intermitência do LED, detectando a tensão de um potenciômetro trimmer. A extremidade variável do trimmer é conectada ao pino A5 do UNO, enquanto suas extremidades fixas são conectadas ao terra e VCC (5V DC).

A tensão analógica na extremidade variável do trimmer pode variar entre 0 e 5V girando o botão do trimmer. Esta tensão é aplicada na entrada analógica A5 do Arduino UNO.

A tensão analógica do trimmer é lida usando a função analogRead , que retorna um valor entre 0 e 1023. A leitura analógica é usada como um intervalo de atraso em milissegundos entre ligar e desligar o LED. Quando o botão do potenciômetro está próximo ao terminal fixo conectado ao terra, a baixa tensão analógica é aplicada ao pino analógico A5 e a leitura analógica baixa é registrada.

Assim, o intervalo de atraso entre ligar/desligar o LED permanece entre 40 a 70 milissegundos e o LED pisca em uma frequência maior. Quando o botão é girado próximo ao terminal fixo conectado ao VCC, a alta tensão analógica é aplicada ao pino A5 e a alta leitura analógica é registrada. O intervalo de atraso entre ligar/desligar o LED permanece entre 800 e 1000 milissegundos, e o LED pisca em uma frequência menor.

Guia de programação
As três variáveis ​​globais são definidas por:

  • O sensorPin para indicar o pino de entrada analógica
  • O ledPin para indicar o pino digital onde o LED está conectado
  • O analogVal para armazenar a leitura analógica

Ao sensorPin é atribuído um valor de A5 onde o trimmer está conectado, e ao ledPin é atribuído um valor de 5 onde o LED está conectado.

Na função setup , o pino onde o LED faz interface é configurado como saída usando a função pinMode . No função loop a leitura analógica no pino A5 é obtida através da função analogRead e é armazenada na variável analogVal.

O LED é interligado de forma que o pino 5 sirva como fonte de corrente para ele. O pino 5 é definido como HIGH usando o escrita digital função para que o LED comece a brilhar. Um atraso igual à leitura analógica é fornecido chamando a função delay , com analogVal como argumento. O LED é então desligado configurando o pino 5 para LOW usando a função digitalWrite .

Novamente, um atraso igual à leitura analógica é fornecido chamando a função delay com analogVal como argumento.

Receita de desvanecimento de LED controlado por potenciômetro

Nesta receita, detectaremos a tensão analógica usando um potenciômetro e a mudança da tensão analógica para atenuar um LED.

Requisitos

Aqui, os componentes necessários, as conexões do circuito e o diagrama do circuito são todos iguais aos mencionados acima, “Receita de taxa de intermitência do LED controlada por potenciômetro”.

Esboço do Arduino

int sensorPin = A5;
int ledPin = 5;
int valor analógico = 0;

configuração vazia {
pinMode(ledPin, SAÍDA);
}

loop vazio {
analogVal = analogRead(sensorPin);
analogWrite(ledPin, analogVal/4);
}

Como funciona o projeto
Este circuito foi projetado para desvanecer um LED usando um potenciômetro. A tensão analógica é aplicada no pino A5 do Arduino por meio de um potenciômetro trimmer. Esta tensão analógica é lida usando a função analogRead .

Esta função retorna um valor entre 0 e 1023. Este valor é dividido por quatro para obter um valor entre 0 e 255 e, em seguida, é passado como argumento do ciclo de trabalho na função analogWrite . A função analogWrite produz um sinal PWM no pino 5 onde o LED está conectado.

  • Quando a entrada analógica no pino A5 está baixa, a leitura analógica permanece entre 40 e 50. Quando esta leitura (após um fator de quatro) é passada como ciclo de trabalho, uma onda PWM do ciclo de trabalho baixo é gerada no pino 5 do UNO e o LED permanece apagado.
  • Quando a entrada analógica no pino A5 é alta, a leitura analógica permanece entre 800 e 1000. Quando esta leitura (após um fator de quatro) é passada como ciclo de trabalho, uma onda PWM do ciclo de trabalho alto é gerada no pino 5 do UNO e o LED acende.

Guia de programação
As três variáveis ​​globais são definidas da seguinte forma:

  • O sensorPin para indicar o pino de entrada analógica
  • O ledPin para indicar o pino digital onde o LED está conectado
  • O analogVal para armazenar a leitura analógica.

Ao sensorPin é atribuído um valor de A5 onde o trimmer está conectado e ao ledPin é atribuído um valor de 5 onde o LED está conectado.

Na função setup , o pino onde o LED faz interface é configurado como saída usando a função pinMode . Na função loop , a leitura analógica no pino A5 é obtida através da função analogRead e é armazenada na variável analogVal.

O LED é interligado de forma que o pino 5 sirva como fonte de corrente para ele. Uma onda PWM é gerada no pino 5 chamando a função analogWrite na qual o ciclo de trabalho é definido para a leitura analógica (fatorado por quatro).

A leitura analógica é fatorada por quatro e o valor do ciclo de trabalho deve estar entre 0 e 255, enquanto a leitura analógica pode estar entre 0 e 1023.

À medida que a tensão analógica no pino A5 do UNO aumenta, o ciclo de trabalho aumenta e o LED fica mais iluminado. À medida que a tensão analógica no pino A5 do UNO diminui, o ciclo de trabalho diminui e o LED apaga.

No próximo tutorial, discutiremos a interface de um LED RGB usando Arduino.

(tagsParaTraduzir)Arduino

Powrót do blogu

Zostaw komentarz

Pamiętaj, że komentarze muszą zostać zatwierdzone przed ich opublikowaniem.