0% acharam este documento útil (0 voto)
8 visualizações11 páginas

Programação do ADC LPC1768: Guia Completo

Este documento fornece um tutorial sobre a programação do conversor analógico-digital (ADC) no microcontrolador ARM Cortex-M3 LPC1768. Ele discute o módulo ADC, os registradores utilizados para programação e os modos de operação. Os modos controlados por software e em burst são descritos, juntamente com exemplos de código para inicializar e ler os resultados de conversão em cada modo.

Traduzido por

ScribdTranslations
Direitos autorais
© All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd
0% acharam este documento útil (0 voto)
8 visualizações11 páginas

Programação do ADC LPC1768: Guia Completo

Este documento fornece um tutorial sobre a programação do conversor analógico-digital (ADC) no microcontrolador ARM Cortex-M3 LPC1768. Ele discute o módulo ADC, os registradores utilizados para programação e os modos de operação. Os modos controlados por software e em burst são descritos, juntamente com exemplos de código para inicializar e ler os resultados de conversão em cada modo.

Traduzido por

ScribdTranslations
Direitos autorais
© All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd

Tutorial de Programação do ADC LPC1768

Postado PorUmang GajeraPosted date: October 14, 2017in: IncorporadoSem comentários


Olá pessoal, neste tutorial vamos passar pelo tutorial de programação do ADC ARM Cortex-M3 LPC1768.
Basicamente, convertemos um sinal analógico para a sua versão digital. Também veremos o ADC LPC176x.
Exemplo de Interfacing. Isso também se aplica ao Microcontrolador LPC1769.

Índice

1. ADC no ARM LPC176x


[Link] ADC LPC176x
[Link] e Programação do ADC LPC1768
[Link] de ADC LPC1768/LPC1769
ADCnoARMLPC176x
A conversão de analógico para digital é usada quando se deseja interligar um sinal analógico externo ou quando
interfacing sensores analógicos, como por exemplo um sensor de temperatura. O bloco ADC no ARM Cortex-
O microcontrolador M3 LPC1768 é baseado emAproximação Sucessiva (SAR)método de conversão.
O módulo ADC LPC1768 usa SAR de 12 bits com uma taxa de conversão de 200 kHz. A Medição
faixa se de VREFNpara VREFP, ou comumente de 0V a ~3V. Máximo de 8 entradas multiplexadas pode ser
usado para ADC.

Pinos relacionados ao Módulo ADC do LPC1768/LPC1769:

Pino Description
AD0.0 para Pinos de entrada analógica.
AD0.7(P0.23/24/25/26, Nota da Ficha Técnica: “Se o ADC for utilizado, os níveis de sinal no analógico
P1.30/31, P0.3/2) os pinos de entrada não devem estar acima do nível de VDDAa qualquer momento.
Caso contrário, as leituras do conversor A/D serão inválidas. Se o A/D
o conversor não é usado em uma aplicação, então os pinos associados
com entradas A/D podem ser usadas como pinos de IO digitais tolerantes a 5V.

VREFP, VREFN Esses pinos de tensão de referência são usados para ADC e DAC.

VDDA, VSSA VDDAé o pino de Potência Analógica e VSSAo pino de aterramento é usado para alimentar o
ADC module.
estar adequadamente isolado/desacoplado de VCC, no mínimo usando um
Pino de Potência Analógica ou seja VDDAdeve
bico de ferrite e um capacitor de desacoplamento, para suprimir o ruído presente em VCCferro e também para suprimir
O ruído de comutação do MCU que pode ser induzido no VCCtrilho.

RegistrosADCLPC176x
Vamos ver os registradores que são usados para programação de ADC.

1)ADCR– Registro de Controle A/D: Este é o registro de controle principal para AD0.

[Link][7:0] – SEL:Bit 'x' (neste grupo) é usado para selecionar o pino A0.x no caso de AD0.
2. Bits[15:8] – CLKDIV: O clock do periférico ADC, ou seja, PCLK_ADC0 é dividido por CLKDIV+1 para obter
o clock do ADC. Note que a velocidade do clock do ADC deve ser <= 13Mhz! Conforme o manual do usuário deve
programar o menor valor neste campo que resulta em uma velocidade de clock de 4,5 MHz ou um pouco menos.
[Link][16] – BURST: Definido como 1 para realizar conversões repetidas, caso contrário 0 para controle de software
conversões. Nota: os bits START devem ser definidos como 000 quando BURST=1 ou as conversões não ocorrerão.
começar. Consulte o manual do usuário para informações detalhadas.

[Link][21] – PDN : Defina como 1 para energizar o ADC e torná-lo operacional. Defina como 0 para
colocando no modo de desligamento.
[Link][26:24] – INÍCIO: Esses bits são usados para controlar o início da conversão ADC quando
BURST (bit 16) está definido como 0. 000 = Nenhum início, 001 = Iniciar a conversão agora, para outros valores
consulte o Manual do Usuário LPC17xx.

[Link][27] – EDGE:Set this bit to 1 to start the conversion on falling edge of the selected
Sinal CAP/MAT e defina este bit como 0 para iniciar a conversão na borda de subida do selecionado
sinal. (Nota: Este bit é usado apenas no caso em que o INÍCIO contém um valor entre
010 a 111 como mostrado acima.)
7. Outras partes estão reservadas.
2)ADGDR– Registro Global de Dados A/D: Contém os flags do ADC e o resultado do mais recente
Conversão A/D.

[Link][15:4] – RESULT: Quando o bit DONE = 1, esses bits fornecem uma fração binária que
representa a tensão no pino AD0.x, na faixa VREFP & VREFNO valor de 0x0 indica que
a tensão no pino dado era menor, igual ou maior que VREFN. E um valor de 0xFFF
significa que a tensão de entrada estava próxima, igual ou superior ao VREFP.
[Link][26:24] – CHN: Representa o canal do qual os bits RESULT foram convertidos. 000=
canal 0, 001 = canal 1 e assim por diante.
[Link][30] – EXCESSO: No modo de burst, este bit é 1 em caso de um excesso, ou seja, o resultado de
a conversão anterior sendo perdida (sobrescrita). Esta parte será limpa após a leitura do ADGDR.
[Link][31] – CONCLUÍDO: Quando a conversão ADC é concluída, este bit é 1. Quando este registrador (ADGDR)
é lido e ADCR é escrito, este bit é limpo, ou seja, definido como 0. Se ADCR for escrito enquanto um
a conversão está em andamento, então este bit é definido e uma nova conversão é iniciada.
5. Outras partes estão reservadas.
4)ADDR0 a ADDR7 – Registros de dados A/D: Este registro contém o resultado do mais recente
a conversão foi concluída no canal correspondente [0 a 7]. Sua estrutura é a mesma do ADGDR, exceto
Os bits[26:24] não são utilizados/reservados.

5) ADSTAT - Registro de Status A/D: Este registro contém as bandeiras DONE e OVERRUN para todos os
Canais A/D junto com a bandeira de interrupção A/D.

[Link][7:0] – DONE[7 a 0]: Aqui o bit x reflete a bandeira de status DONEx do registro de resultado para
Canal A/D x.
[Link][15:8] – OVERRUN[7 a 0]: Mesmo aqui o bit x espelha o flag de status OVERRUNx de
o registro de resultado para o canal A/D x
[Link] 16 – ADINT: Este bit representa a flag de interrupção A/D. Está em 1 quando qualquer um dos individuais
Os sinais de conclusão do canal A/D estão afirmados e habilitados para contribuir para a interrupção A/D via o
Registro ADINTEN (dado abaixo).
4. Outras partes estão reservadas.

ModosdeADCLPC1768,ConfiguraçãoeProgramação
Modos de ADC no LPC1768 e LPC1769:
1. Modo controlado por software: No modo software, apenas uma conversão será realizada por vez.
Para realizar outra conversão, você precisará reiniciar o processo. No modo de software,
apenas 1 bit no campo SEL do ADCR pode ser 1, ou seja, apenas 1 Canal (ou seja, Pino) pode ser selecionado para
conversão de cada vez. Portanto, as conversões podem ser feitas apenas em qualquer canal, mas uma de cada vez.
2. Modo de Hardware ou Modo de Explosão: No modo de Hardware ou Modo de Explosão, as conversões são realizadas
continuamente nos canais selecionados de forma round-robin. Como as conversões não podem
ser controlado por software, O excesso pode ocorrer neste modo. O excesso é o caso quando um
o resultado da conversão anterior é substituído pelo novo resultado da conversão sem que o resultado anterior seja
leia, ou seja, a conversão é perdida. Normalmente, uma interrupção é usada no modo Burst para obter o mais recente
resultados da conversão. Esta interrupção é acionada quando a conversão em um dos canais selecionados
termina.
1A. Configurando e configurando o Módulo ADC para modo controlado por software
Primeiro, vamos definir alguns valores que nos ajudarão a configurar e inicializar o registro ADCR.
Bloco ADC.

#define ADC_CLK_EN (1<<12)

#define SEL_AD0_0 (1<<0) //Selecionar Canal AD0.0

#define CLKDIV 1 // Divisor do clock ADC (ADC_CLOCK=PCLK/CLKDIV+1)

#define PWRUP (1<<21) //configurá-lo como 0 irá desligá-lo

#define START_CNV (1<<24) //001 para iniciar a conversão imediatamente

#define ADC_DONE (1U<<31) //defina como um valor sem sinal ou o compilador irá gerar erro
#61-D aviso

#define ADCR_SETUP_SCM ((CLKDIV<<8) | PowerUP)


//SCM = Modo Controlado por Software
Agora atribuirmos ADCR_SETUP ao ADCR junto com informações de seleção de canal para selecionar canais
conforme necessário. Finalmente, atribuímos (por OR) START_NOW a ADCR para iniciar o processo de conversão como
mostrado:

LPC_SC->PCONP |= ADC_CLK_EN;//Habilitar relógio do ADC


LPC_ADC->ADCR = ADCR_SETUP_SCM | SEL_AD0_0;
LPC_ADC->ADCR |= INICIAR_CONVERSÃO;

//==OU==
LPC_SC->PCONP |= ADC_CLK_EN; //Habilitar o clock do ADC
LPC_ADC->ADCR = ADCR_SETUP | SEL_AD0_0 | START_CNV;

1B. Obtendo o resultado da conversão em modo controlado por software :


No modo controlado por software, monitoramos continuamente o bit 31 nos dados do canal correspondente.
registre ADDR. Se o bit 31 mudar de 0 para 1, significa que a conversão atual foi concluída
e o resultado está pronto. Por exemplo, se estivermos usando o canal 0 do AD0, então monitoramos por mudanças
em bit 31 da seguinte forma:
enquanto((LPC_ADC->ADDR0 & ADC_DONE) ==0);//este loop vai terminar quando o bit 31 de
AD0DR6 muda para 1.
Após isso, extraímos o resultado que está armazenado nos bits ADDR de 4 a 15. Aqui, deslocamos ADDR para a direita em 6.
locais e forçar todos os outros bits não relacionados a 0 usando um valor de máscara de 12 bits de 0xFFF. 0xFFF é um
máscara contendo 1's nas localizações de bits de 0 a 11 e o resto 0's. No nosso caso, com a ADDR0 sendo usada, pode
ser feito da seguinte forma:

result = (LPC_ADC->ADDR0>>4) &0xFFF;

2A. Configurando e configurando o Módulo ADC para Modo Burst


Configurar o módulo ADC é semelhante ao que foi feito no modo controlado por software, exceto que aqui nós
use os bits CLKS e não use os bits START no ADCR. ADC_DONE também não é aplicável, uma vez que
we are using an ISR which gets triggered when a conversion completes on any of the enabled
canais. Além disso, definimos as seguintes constantes:

#define SEL_AD0_1 (0x2)//Selecionar Canal AD0.1

#define BURST_ON (1<<16) // 1 para ligado e 0 para desligado

#define ADCR_SETUP_BURST ((CLKDIV<<8) | BURST_ON | PWRUP)


Configuramos e configuramos o módulo ADC de maneira semelhante (conforme mostrado acima) da seguinte forma:

LPC_SC->PCONP |= ADC_CLK_EN;//Ativar o clock do ADC


LPC_ADC->ADCR = ADCR_SETUP_BURST | SEL_AD0_0 | SEL_AD0_1;
Observe que, neste caso, podemos selecionar múltiplos canais para conversão ao configurar o AD0CR.
Os bits START não são aplicáveis aqui, uma vez que as conversões começam assim que configuramos o registro AD0CR.

2B. Obtendo o resultado da conversão no modo Burst:


No modo Burst, usamos um ISR que é acionado na conclusão de uma conversão em qualquer um dos
canal. Agora, só precisamos encontrar o canal para o qual a conversão foi realizada. Para isso, buscamos
o número do canal do ADGDR que também armazena o resultado da conversão. Bits [26:24] em ADGDR
contém o número do canal. Portanto, deslocamos 24 posições e usamos um valor de máscara de 3 bits de 0x7 como
mostrado abaixo:

não assinado long ADGDR_Read = LPC_ADC->ADGDR;


int canal = (ADGDR_Read>>24) &0x7;//Extrair Número do Canal
Depois de saber o número do canal, temos 2 opções para obter o resultado da conversão. Ou nós
pode buscá-lo do ADGDR ou do ADDRx do canal correspondente. Vamos usar o ADGDR para
extraindo o resultado da conversão da seguinte forma:

int resultadoAtual = (ADGDR_Leitura>>4) &0xFFF;//Extrair Resultado da Conversão


ExemplodeADCARMCortex-M3LPC1768/LPC1769
Observe que neste caso nenhuma proteção ou filtragem de entrada era necessária. Mas, ao interagir com externos
para sinais analógicos, é recomendável usar alguma forma de proteção de entrada.

Interfacing Potenciômetro usando ADC no LPC176x


Este exemplo realiza a conversão de Analógico para Digital em Modo Controlado por Software. Aqui usamos
P0.23 como entrada analógica para medir a tensão. P0.23 corresponde ao Canal 0 de AD0, ou seja, AD0.0.
Para teste, eu usei um potenciômetro de 10K para a interface ADC e conectei a perna do meio a
P0.23 da minha placa de desenvolvimento LPC1768. Você também pode usar um potenciômetro de 5K para este ADC
Exemplo. Certifique-se de que seu painel VREFP, VREFN, VDDA& VSSAconnections. These connections will be
geralmente presente na maioria das placas de desenvolvimento LPC176x. Se não, você pode conectá-lo ao VCCe GND
respectivamente usando capacitores de desacoplamento e indutores de ferrite para reduzir o ruído. Esquema para isso
o exemplo é conforme mostrado abaixo:

C/C++ Source Code :

(C) Umang Gajera -[Link]


Exemplo 1 de Interfacing ADC LPC1768/LPC1769 Código Fonte usando KEIL ARM
Mais tutoriais de Embedded @[Link]/cat/embutido/
License : GPL.*/

#include<lpc17xx.h>
#include<stdio.h>
#include"ocf_lpc176x_lib.h" //contém uart, timer e fputc para redirecionar printf

#define VREF 3.3 //Tensão de Referência no pino VREFP, dado que VREFN = 0V(GND)
#define ADC_CLK_EN (1<<12)
#define SEL_AD0_0 (1<<0) //Selecionar Canal AD0.0
#define CLKDIV 1 //Divisor do relógio ADC (ADC_CLOCK=PCLK/CLKDIV+1) = 12.5Mhz @
PCLK de 25MHz
#define PWRUP (1<<21) //configurá-lo para 0 irá desligá-lo
#define START_CNV (1<<24) //001 para iniciar a conversão imediatamente
#define ADC_DONE (1U<<31) //defina como um valor unsigned ou o compilador irá gerar um erro
#61-D aviso
#define ADCR_SETUP_SCM ((CLKDIV<<8) | PWRUP)

int principal(void)
{
//SystemInit(); //Chamado pelo código de inicialização, configura CCLK=100Mhz,
PCLK=25Mhz
initUART0();//Inicializa UART0 para uart_printf() - ambos definidos em
tmr_uart_printf.cpp
initTimer0();//Para delayMS() - ambos definidos em tmr_uart_printf.cpp

LPC_SC->PCONP |= ADC_CLK_EN;//Ativar relógio do ADC


LPC_ADC->ADCR = ADCR_SETUP_SCM | SEL_AD0_0;
LPC_PINCON->PINSEL1 |= (1<<14); //seleciona AD0.0 para P0.23
int resultado =0;
float volts = 0;

printf("[Link] 1 do Tutorial de ADC LPC176x. Controlado por Software


Modo ADC no canal AD0.0.

enquanto(1)
{
LPC_ADC->ADCR |= START_CNV;//Iniciar nova Conversão

enquanto((LPC_ADC->ADDR0 & ADC_DONE) ==0);//Aguarde até a conversão


está terminado

resultado = (LPC_ADC->ADDR0>>4) & 0xFFF; // Máscara de 12 bits para extrair


result

volts = (resultado*VREF)/4096.0;//Converter resultado para Voltagem

printf("AD0.0 = %dmV\n" , (int)(volts*1000));//Exibir milivolt


volts

delayMS(500);//Atrasando atualizações para 2 atualizações por segundo


}

//return 0; //Isto não será executado

Saída Serial :
ocf_lpc176x_lib.ho cabeçalho usado na fonte também contém código para retargeting printf().
redirecionar printf() usando tutorial UARTpara mais.
Verifiquecomo
LPC1768: Programação de ADC
Neste tutorial, vamos discutir como usar o ADC embutido LPC1768.
Aqui discutiremos o registro associado ao ADC e, principalmente, nos concentraremos no básico.
registros necessários para ADC.
Os outros recursos, como Conversão em Burstable, acesso a diferentes registradores para cada canal, ADC
A conversão dependendo de temporizadores, interrupções ADC etc. estará fora do escopo deste tutorial.
Mais tarde, veremos como interagir com um POT, LDR e Sensor de Temperatura (LM35).
Finalmente, veremos como usar as bibliotecas ExploreEmbedded para ADC.

Bloco ADC LPC1768


O LPC1768 possui um ADC de Aproximação Sucessiva de 12 bits embutido que é multiplexado entre 8.
pinos de entrada.
A tensão de referência do ADC é medida entre VREFN e VREFP, o que significa que pode fazer o
conversão dentro deste intervalo. Normalmente, o VREFP está conectado ao VDD e o VREFN está conectado
para GND.
Como o LPC1768 funciona com 3,3 volts, essa será a tensão de referência do ADC.
Agora a $$resolução do ADC = 3,3/(2^{12}) = 3,3/4096 = 0,000805 = 0,8mV$$
O diagrama de blocos abaixo mostra os pinos de entrada do ADC multiplexados com outros pinos GPIO.
O pino ADC pode ser habilitado configurando o registro PINSEL correspondente para selecionar ADC
função.
Quando a função ADC é selecionada para esse pino no registro de Seleção de Pino, outros sinais digitais são
desconectado dos pinos de entrada do ADC.

Adc Channel Porto Pin Funções de Pinos PINSEL R Associado

AD0 P0.23 0-GPIO, 1-AD0[0], 2-I2SRX_CLK, 3-CAP3[0] 14,15 bits de PINSEL1

AD1 P0.24 0-GPIO, 1-AD0[1], 2-I2SRX_WS, 3-CAP3[1] 16,17 bits de PINSEL1

AD2 P0,25 0-GPIO, 1-AD0[2], 2-I2SRX_SDA, 3-TXD3 18,19 bits de PINSEL1

AD3 P0.26 0-GPIO, 1-AD0[3], 2-AOUT, 3-RXD3 20,21 bits de PINSEL1

AD4 P1.30 0-GPIO, 1-VBUS, 2- , 3-AD0[4] 28,29 bits de PINSEL3


AD5 P1.31 0-GPIO, 1-SCK1, 2- , 3-AD0[5] 30,31 bits de PINSEL3

AD6 P0.3 0-GPIO, 1-RXD0, 2-AD0[6], 3- 6,7 bits de PINSEL0

AD7 P0.2 0-GPIO, 1-TXD0, 2-AD0[7], 3- 4,5 bits de PINSEL0

Registros ADC
A tabela abaixo mostra os registradores associados ao ADC LPC1768.
Nós vamos nos concentrar apenas no ADCR e no ADGDR, pois estes são suficientes para um simples A/D.
conversão.
No entanto, uma vez que você esteja familiarizado com o ADC LPC1768, pode explorar os outros recursos e o
registros associados.

Registrar Descripton

ADCR Registro de Controle A/D: Usado para Configurar o ADC

ADGDR Registrador de Dados Global A/D: Este registrador contém o bit DONE do ADC e o resultado da A mais recente

ADINTEN Registro de Habilitação de Interrupção A/D

ADDR0 - ADDR7 Registro de Dados do Canal A/D: Contém o valor recente do ADC para o respectivo canal

ADSTAT Registro de Status A/D: Contém a bandeira DONE e OVERRUN para todos os canais do ADC

Configuração do Registrador ADC


Agora vamos ver como configurar os registros individuais para a conversão ADC.
ADCR

31:28 27 26:24 23:22 21 20:17 16 15:8 7:0

Reservado BORDAS INÍCIO Reservado PDN Reservado EXPLODIRCLCKDIV SEL

Bit 7:0 – SEL : Seleção de Canal


Esses bits são usados para selecionar um canal específico para conversão ADC. Um bit é atribuído para cada
canal. Definir o Bit-0 fará com que o ADC amostre AD0[0] para conversão. Da mesma forma, definir
bit-7 fará a conversão para AD0[7].

Bit 15:8 – CLCKDIV : Divisor do relógio


O clock APB (PCLK_ADC0) é dividido por (este valor mais um) para produzir o clock para o
Conversor A/D, que deve ser inferior ou igual a 13 MHz.

Bit 16 – BURST
Este bit é usado para conversão BURST. Se este bit estiver definido, o módulo ADC realizará a conversão.
para todos os canais que estão selecionados (SET) nos bits SEL.
Limpar esta parte desativará a conversão BURST.

Bit 21 – PDN : Power Down Mode


Ativar este bit tira o ADC do modo de desligamento e o torna operacional.
Limpar este trecho desligará o ADC.

Bit 24:26 – INÍCIO


Quando o bit BURST é 0, esses bits controlam se e quando uma conversão A/D é iniciada:
000 - Conversão Parada
001- Comece a Conversão Agora

Os casos restantes (010 a 111) tratam de iniciar a conversão na ocorrência de uma borda em um
pino CAP ou MAT particular.

Bit 27 - BORDA
Este bit é significativo apenas quando o campo START contém 010-111. Ele inicia a conversão em
entrada CAP ou MAT selecionada.
0 - Na Borda de Queda
1 - Na Borda de Subida
ADGDR ( Registrador Global de Dados ADC )

ADGDR

31 27 26:24 23:16 15:4 3:0

FEITO EXCEDER CHN Reservado RESULT Rese

Bit 15:4 - RESULT


Este campo contém o valor de conversão A/D de 12 bits para o canal selecionado em [Link]
O valor para este registro deve ser lido uma vez que a conversão esteja concluída, ou seja, o bit DONE está definido.

Bit 26:24 - CHN : Canal


Esses bits contêm o número do canal para o qual a conversão A/D é feita e o convertido
o valor está disponível nos bits do RESULT (por exemplo, 000 identifica o canal 0, 011 o canal 3...).

Bit 27 - TRANSCURSO
Este trecho é definido durante o modo BURST, onde os dados de conversão anteriores são sobrescritos por
novo valor de conversão A/D.

Bit 31 - DONE
Este bit é definido como 1 quando uma conversão A/D é concluída. Ele é limpo quando este registrador é lido e
quando o ADCR é escrito. Se o ADCR é escrito enquanto uma conversão ainda está em andamento, esse bit
está definido e uma nova conversão é iniciada.

Some other registers


Embora haja mais registros, estamos nos restringindo a usar apenas esses registros como
isso será mais conveniente.
Além do registro de dados global do ADC, existem mais 8 registros de dados do ADC (um registro de dados)
por canal ADC). Os bits DONE e OVERRUN para cada canal podem ser monitorados separadamente
a partir dos bits presentes no registro de Status do ADC.

Pode-se usar o Registro de Dados Global A/D para ler todos os dados do ADC ou usar o A/D
Registros de Dados do Canal. É importante usar um método de forma consistente porque o FEITO e
OVERRUN flags can otherwise get out of synch between the AD0GDR and the A/D Channel
Registros de Dados, potencialmente causando interrupções ou atividades de DMA errôneas.

Você também pode gostar