- O que é ADC?
- ADC em ARM7-LPC2148
- Pinos ADC em ARM7-LPC2148
- Registros ADC em ARM7-LPC2148
- Registro ADxCR em LPC2148
- ADxGDR: Registro de dados global ADC
- Componentes necessários
- Diagrama de circuito
- Programando ARM7-LPC2148 para ADC
No mundo da eletrônica, existem muitas variedades de sensores analógicos no mercado que são usados para medir temperatura, velocidade, deslocamento, pressão, etc. Os sensores analógicos são usados para produzir saídas que mudam continuamente ao longo do tempo. Esses sinais de sensores analógicos tendem a ter valores muito pequenos, de alguns microvolts (uV) a vários milivolt (mV), portanto, alguma forma de amplificação é necessária. Para usar esses sinais analógicos no microcontrolador, precisamos converter o sinal analógico em sinal digital, pois o microcontrolador entende e processa apenas sinais digitais. Portanto, a maior parte do microcontrolador tem um importante recurso embutido chamado ADC (conversor analógico para digital). Nosso microcontrolador ARM7-LPC2148 também possui um recurso ADC.
Neste tutorial, veremos como usar ADC no ARM7-LPC2148 fornecendo uma tensão variável a um pino analógico e exibindo-o na tela LCD 16x2 após a conversão analógica para digital. Então, vamos começar com uma breve introdução sobre ADC.
O que é ADC?
Como dito anteriormente, ADC significa conversão de analógico para digital e é usado para converter valores analógicos do mundo real em valores digitais como 1's e 0's. Então, quais são esses valores analógicos? Estes são os que vemos em nosso dia a dia como temperatura, velocidade, brilho etc. Esses parâmetros são medidos como tensões analógicas pelos respectivos sensores e, em seguida, esses valores analógicos são convertidos em valores digitais para microcontroladores.
Vamos supor que nossa faixa de ADC é de 0 V a 3,3 V e temos um ADC de 10 bits, o que significa que nossa tensão de entrada de 0 a 3,3 V será dividida em 1024 níveis de valores analógicos discretos (2 10 = 1024). O que significa que 1024 é a resolução para um ADC de 10 bits, da mesma forma para uma resolução ADC de 8 bits será 512 (28) e para uma resolução ADC de 16 bits será 65.536 (216). LPC2148 tem o ADC de resolução de 10 bits.
Com isso, se a tensão de entrada real for 0 V, o ADC do MCU irá lê-la como 0 e se for 3,3 V, o MCU irá ler 1024 e se estiver em algum lugar entre 1,65 V, então o MCU irá ler 512. Podemos usar o abaixo fórmulas para calcular o valor digital que será lido pelo MCU com base na resolução do ADC e tensão operacional.
(Resolução ADC / Tensão operacional) = (Valor digital ADC / Valor de tensão real)
Por exemplo, se a tensão de referência for 3v:
Explicamos o ADC em detalhes no artigo anterior.
ADC em ARM7-LPC2148
- O LPC2148 contém dois conversores analógico para digital.
- Esses conversores são conversores analógicos para digitais de aproximação sucessiva única de 10 bits.
- Enquanto ADC0 possui seis canais, ADC1 possui oito canais.
- Portanto, o número total de entradas ADC disponíveis para LPC2148 é 14.
- Ele converte a tensão de entrada na faixa de (0 a 3,3 V) apenas. Não deve exceder 3,3 V da referência de tensão. Pois vai danificar o IC e também fornecer valores incertos.
Algumas características importantes do ADC em LPC2148
- Cada conversor é capaz de realizar mais de 400.000 amostras de 10 bits por segundo.
- Cada entrada analógica tem um registro de resultado dedicado para reduzir a sobrecarga de interrupção.
- Modo de conversão burst para entradas únicas ou múltiplas.
- Conversão opcional na transição no pino de entrada ou sinal de correspondência do temporizador.
- Comando Global Start para ambos os conversores.
Verifique também como usar ADC em outros microcontroladores:
- Como usar ADC no Arduino Uno?
- Interface do ADC0808 com o microcontrolador 8051
- Usando Módulo ADC do Microcontrolador PIC
- Tutorial do Raspberry Pi ADC
- Como usar ADC em MSP430G2 - Medindo Tensão Analógica
- Como usar ADC em STM32F103C8
Pinos ADC em ARM7-LPC2148
Como dito anteriormente, no ARM7-LPC2148 existem dois canais ADC0 com 6 pinos de entrada analógica e ADC1 com 8 pinos de entrada analógica. Portanto, no total, existem 14 pinos para entradas analógicas. O diagrama abaixo mostra os pinos disponíveis para entrada analógica.
Uma vez que os pinos de entrada ADC são multiplexados com outros pinos GPIO. Precisamos habilitá-los configurando o registro PINSEL para selecionar a função ADC.
A tabela abaixo mostra os pinos do ADC e o número do canal ADC respeitado em LPC2148. AD0 é o canal 0 e AD1 é o canal 1
Pin LPC2148 |
Canal ADC Não |
P0,28 |
AD0.1 |
P0,29 |
AD0.2 |
P0.30 |
AD0.3 |
P0.25 |
AD0.4 |
P0.4 |
AD0.6 |
P0.5 |
AD0.7 |
P0.6 |
AD1.0 |
P0.8 |
AD1.1 |
P0.10 |
AD1.2 |
P0,12 |
AD1.3 |
P0.13 |
AD1.4 |
P0.15 |
AD1.5 |
P0,21 |
AD1.6 |
P0.22 |
AD1.7 |
Registros ADC em ARM7-LPC2148
Os registros são usados na programação para usar o recurso de conversão A / D no LPC2148.
Abaixo está uma lista de registros usados no LPC2148 para conversão A / D
1. ADCR: Registro de controle analógico para digital
Uso: Este registro é usado para configurar o conversor A / D no LPC2148
2. ADGDR: Registro de dados global analógico para digital
Uso: Este registro possui o bit DONE para o conversor A / D e o RESULTADO da conversão é armazenado aqui.
3. ADINTERN: Registro de habilitação de interrupção analógica para digital
Uso: Este é um registro de Habilitação de Interrupção.
4. ADDR0 - ADDR7: Registro de dados de canal analógico para digital
Uso: Este registro contém o valor A / D para os respectivos canais.
5. ADSTAT: Registro de status analógico para digital.
Uso: Este registro contém o sinalizador DONE para o respectivo canal ADC e também o sinalizador OVERRUN para o respectivo canal ADC.
Neste tutorial, usaremos apenas os registros ADCR e ADGDR. Vamos ver sobre eles em detalhes
Registro ADxCR em LPC2148
AD0CR e AD1CR para o canal 0 e canal 1, respectivamente. É um registro de 32 bits. A tabela abaixo indica os campos de bits para o registro ADCR.
31:28 |
27 |
26:24 |
23:22 |
21 |
20 |
19:17 |
16 |
15: 8 |
7: 0 |
RESERVADO |
BEIRA |
COMEÇAR |
RESERVADO |
PDN |
RESERVADO |
CLKS |
BURST |
CLCKDIV |
SEL |
Vamos ver como configurar registros individuais
1. SEL: Os bits de (0 a 7) são usados para selecionar o canal para a conversão ADC. Um bit é alocado para cada canal. Por exemplo, definir o Bit-0 fará com que o ADC obtenha a amostra AD0.1 para conversão. E definir o bit -1 fará AD0.1; da mesma forma, definir o bit 7 fará a conversão para AD0.7. Um passo importante é que temos o PINSEL de acordo com a porta que estamos usando, por exemplo PINSEL0 para PORT0 no PLC2148.
2. CLCKDIV: Os bits de (8 a 15) são para Clock Divisor. Aqui, o relógio APB (relógio do barramento periférico ARM) é dividido por este valor mais um para produzir o relógio necessário para o conversor A / D, que deve ser menor ou igual a 4,5 MHz, pois estamos usando o método de aproximação sucessiva no LPC2148.
3. BURST: O bit 16 é usado para o modo de conversão BURST.
Configuração 1: o ADC fará a conversão para todos os canais selecionados em bits SEL.
Configuração 0: Desativará o modo de conversão BURST.
4. CLCKS: Os bits de (17 a 19) três bits são usados para selecionar a resolução e o número de relógios para a conversão A / D no modo burst, pois é o modo de conversão A / D contínua.
Valor para bits (17 a 19) |
Bits (precisão) |
Nº de relógio |
000 |
10 |
11 |
001 |
9 |
10 |
010 |
8 |
9 |
011 |
7 |
8 |
100 |
6 |
7 |
101 |
5 |
6 |
110 |
4 |
5 |
111 |
3 |
4 |
5. PDN: O bit 21 é para selecionar o modo de desligamento do ADC em LPC2148.
- A / D está no modo PDN.
- A / D está em modo operacional
6. START: Os bits de (24 a 26) são para START. Quando o modo de conversão BURST está DESLIGADO pela configuração 0, esses bits de INÍCIO são úteis para quando iniciar a conversão A / D. O START também é usado para conversão controlada por borda. É quando há uma entrada no pino CAP ou MAT do LPC2148 que o A / D começa a converter. Vamos verificar a tabela abaixo
Valor para bits (24 a 26) |
Pin's de LPC2148 |
Função do ADC |
000 |
Usado para definir ADC no modo PDN Sem início |
|
001 |
Iniciar conversão A / D |
|
010 |
CAP0.2 / MAT0.2 |
Inicie a conversão A / D no EDGE selecionado no pino 27 (subindo ou descendo) nos pinos CAP / MAT do LPC2148 |
011 |
CAP0.0 / MAT0.0 |
|
100 |
MAT0.1 |
|
101 |
MAT0.3 |
|
110 |
MAT1.0 |
|
111 |
MAT1.1 |
7. BORDA: A 27 ª bit é para Edge é usado somente quando o bit de Start contém 010-111. Ele inicia a conversão quando há entrada CAP ou MAT, você pode ver a tabela acima para isso.
Configuração : 0 - Na borda decrescente
1 - Na borda ascendente
ADxGDR: Registro de dados global ADC
AD0GDR e AD1GDR para ADC Canal 0 e ADC canal 1, respectivamente.
É um registro de 32 bits que contém o RESULTADO da conversão A / D e também o bit DONE que indica que a conversão A / D foi feita. A tabela abaixo indica os campos de bits para o registro ADGDR.
31 |
30 |
29:27 |
26:24 |
23:16 |
15: 6 |
5: 0 |
FEITO |
OVERRUN |
RESERVADO |
CHN |
RESERVADO |
RESULTADO |
RESERVADO |
1. RESULTADO: Esses bits (6 a 15) contém o resultado da conversão A / D para o canal selecionado no registro ADCR SEL. O valor é lido somente após a conversão A / D ser concluída e isso é indicado pelo bit DONE.
EXEMPLO: Para um resultado ADC de 10 bits, o valor armazenado varia de (0 a 1023).
2. CANAL: Estes bits 24 a 26 contêm o número do canal para o qual a conversão A / D é feita. O valor digital convertido está presente no bit RESULT.
EXEMPLO: 000 é para ADC canal 0 e 001 é para ADC canal 1, etc
3. OVERRUN: A 30 th pouco para OVERRUN é utilizado em modo de rajada. Quando definido como 1, o valor ADC convertido anterior é substituído pelo valor ADC recém-convertido. Quando o registro é lido, ele limpa o bit OVERRUN.
4. FEITO: O 31º bit é para o bit FEITO.
Conjunto 1: quando a conversão A / D for concluída.
Conjunto 0: Quando o registro é lido e o ADCR escrito.
Vimos sobre os registros importantes que são usados no ADC em LPC2148. Agora vamos começar a usar ADC no ARM7.
Componentes necessários
Hardware
- Microcontrolador ARM7-LPC2148
- CI regulador de tensão de 3,3 V
- IC regulador de tensão 5V
- Potenciômetro 10K - 2 n °
- LED (qualquer cor)
- Display LCD (16X2)
- Bateria 9V
- Tábua de pão
- Fios de conexão
Programas
- Keil uVision5
- Ferramenta Magic Flash
Diagrama de circuito
A tabela abaixo mostra as conexões de circuito entre LCD e ARM7-LPC2148.
ARM7-LPC2148 |
LCD (16x2) |
P0.4 |
RS (Seleção de Registro) |
P0.6 |
E (habilitar) |
P0,12 |
D4 (dados pino 4) |
P0.13 |
D5 (pino de dados 5) |
P0.14 |
D6 (pino de dados 6) |
P0.15 |
D7 (dados pino 7) |
Saiba mais sobre como usar o LCD com ARM 7 - LPC2148.
IMPORTANTE: Aqui estamos usando dois CIs reguladores de tensão, um para display LCD de 5 V e outro de 3,3 V para entrada analógica, que pode ser variado por potenciômetro.
Conexões entre o regulador de tensão 5V com LCD e braço ARM7
Regulador de tensão 5V IC |
Função de pino |
LCD e ARM-7 LPC2148 |
1. Pino esquerdo |
+ Ve da entrada de bateria 9V |
NC |
2. Pino central |
- Ve da bateria |
VSS, R / W, K de LCD GND de ARM7 |
3. Pino direito |
Saída regulada de + 5V |
VDD, A de LCD + 5V de ARM7 |
Potenciômetro com LCD
Um potenciômetro é usado para variar o contraste do display LCD. Um potenciômetro tem três pinos, o pino esquerdo (1) é conectado a + 5V e o centro (2) ao VEE ou V0 do módulo LCD e o pino direito (3) é conectado ao GND. Podemos ajustar o contraste girando o botão.
Conexão entre LPC2148 e potenciômetro com regulador de tensão de 3,3 V
IC regulador de tensão de 3,3 V |
Função de pino |
ARM-7 LPC2148 |
1. Pino esquerdo |
- Ve da bateria |
PIN GND |
2. Pino central |
Saída regulada de + 3,3 V |
Para entrada do potenciômetro e saída do potenciômetro para P0.28 |
3. Pino direito |
+ Ve da entrada de bateria 9V |
NC |
Programando ARM7-LPC2148 para ADC
Para programar o ARM7-LPC2148, precisamos da ferramenta Keil uVision e Flash Magic. Estamos usando o cabo USB para programar o ARM7 Stick via porta micro USB. Nós escrevemos código usando Keil e criamos um arquivo hexadecimal e então o arquivo HEX é enviado para o stick ARM7 usando Flash Magic. Para saber mais sobre como instalar keil uVision e Flash Magic e como usá-los, siga o link Getting Started With ARM7 LPC2148 Microcontroller e programe-o usando Keil uVision.
Neste tutorial, convertemos a tensão de entrada analógica (0 a 3,3 V) em valor digital usando ADC no LPC2148 e exibimos a tensão analógica no display LCD (16x2). Um potenciômetro será usado para variar a tensão analógica de entrada.
Para saber mais sobre a interface do LCD com o modo ARM7-LPC2148 de 4 bits, siga este link.
O código completo para usar ADC com ARM 7 é fornecido no final deste tutorial, aqui estamos explicando algumas partes dele.
Etapas envolvidas na programação LPC2148-ADC
1. O registro PINSEL é usado para selecionar o pino da porta de LPC2148 e a função ADC como entrada analógica.
PINSEL1 = 0x01000000; // Selecione P0.28 como AD0.1
2. Selecione a precisão do relógio e do bit para conversão, gravando o valor no ADxCR (registro de controle ADC).
AD0CR = 0x00200402; // Define a operação ADC como 10 bits / 11 CLK para conversão (000)
3. Inicie a conversão escrevendo o valor nos bits START no ADxCR.
Aqui eu ter escrito a 24 ª pouco de AD0CR registo.
AD0CR = AD0CR - (1 << 24);
4. Agora vamos ter verificar o bit CONCLUI (31th) de ADxDRy correspondente (registo de dados ADC) à medida que muda de 0 a 1. Então, nós usamos enquanto loop para verificar constantemente se a conversão é feita no bit 31th de registro de dados.
enquanto (! (AD0DR1 & 0x80000000));
5. Depois que o bit executado é definido como 1, a conversão é bem-sucedida, a seguir lemos o resultado do mesmo registro de dados ADC AD0DR1 e armazenamos o valor em uma variável.
adcvalue = AD0DR1;
Em seguida, usamos uma fórmula para converter o valor digital em tensão e armazená-lo em uma variável chamada tensão .
voltagem = ((valor ad / 1023,0) * 3,3);
5. As linhas a seguir são usadas para exibir os valores digitais (0 a 1023) após a conversão de analógico para digital.
adc = adcvalue; sprintf (displayadc, "adcvalue =% f", adc); LCD_DISPLAY (displayadc); // Exibir valor ADC (0 a 1023)
6. As linhas a seguir são usadas para exibir a tensão analógica de entrada (0 a 3,3 V) após a conversão analógica para digital e após a etapa 5.
LCD_SEND (0xC0); sprintf (valor de voltagem, "Voltagem =%. 2f V", voltagem); LCD_DISPLAY (voltvalue); // Display (tensão analógica de entrada)
7. Agora temos que exibir a tensão de entrada e os valores digitais no display LCD. Antes disso, temos que inicializar o display LCD e usar os comandos apropriados para enviar a mensagem ao display.
O código abaixo é usado para inicializar o LCD
void LCD_INITILIZE (void) // Função para preparar o LCD { IO0DIR = 0x0000FFF0; // Define os pinos P0.12, P0.13, P0.14, P0.15, P0.4, P0.6 como OUTPUT delay_ms (20); LCD_SEND (0x02); // Inicializa o LCD no modo de operação de 4 bits LCD_SEND (0x28); // 2 linhas (16X2) LCD_SEND (0x0C); // Exibe o cursor desligado LCD_SEND (0x06); // Cursor de incremento automático LCD_SEND (0x01); // Mostra limpar LCD_SEND (0x80); // Primeira linha, primeira posição }
O código abaixo é usado para exibir os valores no LCD
LCD_DISPLAY void (char * msg) // função para imprimir os caracteres enviados um a um { uint8_t i = 0; enquanto (msg! = 0) { IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0xF0) << 8)); // Envia o nibble superior IO0SET = 0x00000050; // RS HIGH & ENABLE HIGH para imprimir os dados IO0CLR = 0x00000020; // Modo de gravação RW LOW delay_ms (2); IO0CLR = 0x00000040; // EN = 0, RS e RW inalterados (ou seja, RS = 1, RW = 0) delay_ms (5); IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0x0F) << 12)); // Envia o nibble inferior IO0SET = 0x00000050; // RS & EN HIGH IO0CLR = 0x00000020; delay_ms (2); IO0CLR = 0x00000040; delay_ms (5); i ++; } }
A função abaixo é usada para criar atraso
void delay_ms (uint16_t j) // Função para fazer o atraso em milissegundos { uint16_t x, i; para (i = 0; i
O código completo com vídeo de demonstração é fornecido abaixo.