You are on page 1of 28

UNIVERSIDADE FEDERAL DE

UBERLÂNDIA
FACULDADE DE ENGENHARIA
ELÉTRICA - FEELT

LASEC
CONVERSOR A/D
FEELT

Última Atualização 07/04/2016


1° Edição 11/2014

Sumário

BeagleBone Black ....................................................................................................... 3 


Conversor Analógico Digital ........................................................................................ 3 
Código C/C++ para Configurar e Utilizar o ADC ......................................................... 5 
Criar Conexão com a BeagleBone Black .................................................................... 6 
Exemplo 01 - Utilização do A/D ................................................................................... 7 
Passo 3: Para compilar e executar o programa AD execute: ................................ 11 
Exemplo 02 - Utilização do A/D ................................................................................. 12 
Passo 3: Para compilar e executar o programa AD execute: ................................ 15 
Lendo o A/D no Prompt ............................................................................................. 15 
Arduíno ...................................................................................................................... 16 
Conversor Analógico Digital ...................................................................................... 16 
24.9.1 ADMUX – ADC Multiplexer Selection Register (Pag. 248) .......................... 16 
24.9.2 ADCSRA – ADC Control and Status Register A ......................................... 18 
Programando o Arduíno com o Software Arduíno no Windows ............................. 20 
Programando o Arduíno com o Software Ino no Linux (Debian) ............................ 25 
Programa Exemplo do AD ......................................................................................... 27 

Disciplina de Sistemas Embarcados ‐ Faculdade de Engenharia Elétrica – UFU Página 2


1° Edição 11/2014

BeagleBone Black

Conversor Analógico Digital

O Microprocessador ARM Cortex-A8 AM335x possui um conversor analógico digital do tipo


aproximações sucessivas. Este tipo de conversor possui o tempo de conversão fixo, isto é, o
tempo de conversão não depende do valor da entrada analógica. Para exemplificar, segue
exemplo de conversão analógica digital extraída do livro Sistemas Digitais Princípios e
Aplicações - Tocci 7a ed.

No início do processo de conversão o shift register e o holding register são zerados. Na primeira
etapa de conversão o MSB do holding register é colocado em nível alto ( 1 ) e os demais
mantidos em nível baixo ( 0 ). Na sequência, o resultado de saída do conversor DAC (VAX) é
comparado com o sinal de entrada (VA). Se VAX < VA, o nível “1” é mantido para o MSB, caso
contrário é substituído por ( 0 ). A etapa seguinte repete o mesmo processo para o próximo bit
menos significativo. A decisão de manter o nível lógico ( 1 ) ou substituir por ( 0 ) é realizada
pelo comparador e pela lógica de controle até que todos os N bits tenham sido verificados.

Vx Conversão
concluída
12
11
10
9
8

Volts

0
t0 t1 t2 t3 t4 t5 t6 Tempo

Disciplina de Sistemas Embarcados ‐ Faculdade de Engenharia Elétrica – UFU Página 3


1° Edição 11/2014

INÍCIO

Reseta todos os bits

Inicia o bit mais significativo

Faz bit = 1

Sim Reseta o bit


VAX > VA? para 0
Não

Não Todos os
Vá para o próximo bits foram
bit menos significativo verificados?

Sim

A conversão
está completa
e o resultado está
no REGISTRADOR

FIM

Disciplina de Sistemas Embarcados ‐ Faculdade de Engenharia Elétrica – UFU Página 4


1° Edição 11/2014

Código C/C++ para Configurar e Utilizar o ADC

O conector P9 da BeagleBone Black disponibiliza 7 entradas analógicas, conforme


descriminado a seguir:

Entrada Pino no Conector P9


AIN0 P9_39
AIN1 P9_40
AIN2 P9_37
AIN3 P9_38
AIN4 P9_33
AIN5 P9_36
AIN6 P9_35

Disciplina de Sistemas Embarcados ‐ Faculdade de Engenharia Elétrica – UFU Página 5


1° Edição 11/2014

Criar Conexão com a BeagleBone Black

Criar uma conexão utilizando o PuTTY ou com o comando ssh, como mostrado a seguir:

ufu@SE:~$ ssh -X root@192.168.7.2

Caso a seguinte mensagem apareça:

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.

Disciplina de Sistemas Embarcados ‐ Faculdade de Engenharia Elétrica – UFU Página 6


1° Edição 11/2014

The fingerprint for the RSA key sent by the remote host is
45:79:10:4a:2c:3c:ff:be:92:d5:18:f7:e2:41:80:8e.
Please contact your system administrator.
Add correct host key in /home/ufu/.ssh/known_hosts to get rid of this message.
Offending RSA key in /home/ufu/.ssh/known_hosts:1
remove with: ssh-keygen -f "/home/ufu/.ssh/known_hosts" -R 192.168.7.2
RSA host key for 192.168.7.2 has changed and you have requested strict checking.
Host key verification failed.
Execute o comando proposto:

ufu@SE:~$ ssh-keygen -f "/home/ufu/.ssh/known_hosts" -R 192.168.7.2


# Host 192.168.7.2 found: line 1 type RSA
/home/ufu/.ssh/known_hosts updated.
Original contents retained as /home/ufu/.ssh/known_hosts.old
ufu@se:~$

Então, tente a conexão novamente:

ufu@SE:~$ ssh -X root@192.168.7.2

The authenticity of host '192.168.7.2 (192.168.7.2)' can't be established.


RSA key fingerprint is 45:79:10:4a:2c:3c:ff:be:92:d5:18:f7:e2:41:80:8e.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.7.2' (RSA) to the list of known hosts.
root@192.168.7.2's password:
root@beaglebone:~#

OBS: Responda yes e pressione <Enter> e pressione <Enter> novamente quando a


password for solicitada

Exemplo 01 - Utilização do A/D

Este exemplo tem como objetivo mostrar como configurar e utilizar o conversor analógico
digital do microprocessador am3359. Um potenciômetro de 4k7 foi ligado nos pinos P9.32
(VDD_ADC de 1.8V), P9.34 (GNDA_ADC) e P9.39 (AIN0) para que a tensão no pino P9_39
possa variar de 0 a 1,8V.

Disciplina de Sistemas Embarcados ‐ Faculdade de Engenharia Elétrica – UFU Página 7


1° Edição 11/2014

5V

1 2 1 2
P9 P8

eMMC

am3359

5k
P9 .3 2
P9 .3 4
HDMI
A IN0
P9 .3 9

45 46
USB 45 46

Criando um diretório para o projeto:

ufu@SE:~$ ssh -X root@192.168.7.2


root@192.168.7.2's password:
root@beaglebone:~# mkdir AD
root@beaglebone:~# cd AD
root@beaglebone:~/AD# gedit AD.c

OBS: Na distribuição do Debian para BeagleBone Black, o editor gedit não vem instalado.
Sendo assim, utilize o editor nano ou tea

Execute o editor gedit, copie (Ctrl + C) o código do arquivo AD.c e cole-o no editor. Em
seguida, salve-o e saia do editor. Se preferir, copie o código a partir do arquivo AD.c
disponibilizado junto com esta apostila em:

https://mega.nz/#F!44kgjIgR!ivdR7Yta0sSRxZolNAeoMA

AD.c

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>

Disciplina de Sistemas Embarcados ‐ Faculdade de Engenharia Elétrica – UFU Página 8


1° Edição 11/2014

#define SYSFS_ADC_DIR "/sys/bus/iio/devices/iio:device0"


#define MAX_BUF 64

int main()
{

int fd;
char buf[MAX_BUF];
char ch0[5];

while(1)
{
snprintf(buf, sizeof(buf), SYSFS_ADC_DIR "/in_voltage%d_raw", 0);
fd = open(buf, O_RDONLY);
read(fd, ch0, 4);
printf("Valor do AD é: %d\n", atoi(ch0));
close(fd);
usleep(1000000);
}

return 0;
}

Disciplina de Sistemas Embarcados ‐ Faculdade de Engenharia Elétrica – UFU Página 9


1° Edição 11/2014

Execute o editor gedit, copie (Ctrl + C) o código do arquivo Makefile e cole-o no editor. Em
seguida, salve-o e saia do editor. Se preferir, copie o código a partir do arquivo Makefile.txt
disponibilizado junto com esta apostila.

Makefile

comp:
gcc AD.c -o AD

clean:
rm -rf AD

run:
./AD

all: clean comp run

Para que o pino P9_39 possa ser utilizado como entrada analógica AIN0, é necessário carregar
o Device Tree com as devidas configurações. Para que estas configurações sejam carregadas
durante a inicialização, localize a pasta BEAGLEBONE, edite o arquivo uEnv.txt (para editar
dê um duplo clique sobre o arquivo) e acrescente os seguintes comandos:

optargs=quiet drm.debug=7 capemgr.enable_partno=BB-ADC

Disciplina de Sistemas Embarcados ‐ Faculdade de Engenharia Elétrica – UFU Página 10


1° Edição 11/2014

Na sequência, salve o arquivo e ejete a BeagleBone Black, como mostrado na figura abaixo:

OBS: Quando a BeagleBone não é ejetada as modificações salvas poderão ser perdidas...

Em seguida, reinicialize o kit e aguarde que a conexão se reestabeleça.

Passo 3: Para compilar e executar o programa AD execute:

Disciplina de Sistemas Embarcados ‐ Faculdade de Engenharia Elétrica – UFU Página 11


1° Edição 11/2014

Exemplo 02 - Utilização do A/D

Neste exemplo, o conversor analógico digital é lido por meio de uma função denominada

Criando um diretório para o projeto:

ufu@SE:~$ ssh -X root@192.168.7.2


root@192.168.7.2's password:
root@beaglebone:~# mkdir AD2
root@beaglebone:~# cd AD2
root@beaglebone:~/AD# gedit AD2.c

Execute o editor gedit, copie (Ctrl + C) o código do arquivo AD2.c e cole-o no editor. Em
seguida, salve-o e saia do editor. Se preferir, copie o código a partir do arquivo AD2.c
disponibilizado junto com esta apostila em:
https://mega.nz/#F!44kgjIgR!ivdR7Yta0sSRxZolNAeoMA

AD2.c
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>

#define SYSFS_ADC_DIR "/sys/bus/iio/devices/iio:device0"


#define MAX_BUF 64

int adc_read(unsigned int pin)


{
int fd;
char buf[MAX_BUF];
char ch[5];

snprintf(buf, sizeof(buf), SYSFS_ADC_DIR "/in_voltage%d_raw", pin);


fd = open(buf, O_RDONLY);
if (fd < 0)
{
perror("adc/get-value");
}
read(fd, ch, 5);

Disciplina de Sistemas Embarcados ‐ Faculdade de Engenharia Elétrica – UFU Página 12


1° Edição 11/2014

close(fd);
return atoi(ch);
}

//--------------------------------------------------------------------------
int main()
{
int valorAD=0;

while (1)
{
valorAD = adc_read(0);
printf("Valor do AD é: %d\n", valorAD);
usleep(1000000);
}

return 0;

Disciplina de Sistemas Embarcados ‐ Faculdade de Engenharia Elétrica – UFU Página 13


1° Edição 11/2014

Execute o editor gedit, copie (Ctrl + C) o código do arquivo Makefile e cole-o no editor. Em
seguida, salve-o e saia do editor. Se preferir, copie o código a partir do arquivo Makefile.txt
disponibilizado junto com esta apostila.

Makefile

comp:
gcc AD2.c -o AD2

clean:
rm -rf AD2

run:
./AD2

all: clean comp run

Disciplina de Sistemas Embarcados ‐ Faculdade de Engenharia Elétrica – UFU Página 14


1° Edição 11/2014

Passo 3: Para compilar e executar o programa AD execute:

Lendo o A/D no Prompt


De acordo com os programas apresentados, os arquivos que representam as entradas analógicas
são denominados in_voltage0_raw, in_voltage1_raw, conforme mostrado na figura a seguir:

Estes arquivos estão localizados na pasta iio:device0, cujo caminho completo é:


/sys/bus/iio/devices/iio:device0.

Assim, o valor da entrada analógica AIN0 pode ser obtida utilizando-se o comando cat, como
indicado a seguir:

Disciplina de Sistemas Embarcados ‐ Faculdade de Engenharia Elétrica – UFU Página 15


1° Edição 11/2014

Arduíno

Conversor Analógico Digital


O microcontrolador ATmega328 possui um conversor A/D de aproximação sucessivas de 10
bits com precisão de ± 2 LSBs e até 8 canais de entradas multiplexados, dependendo do
encapsulamento.

O diagrama de blocos do conversor A/D é exibido pode ser encontrado na página 238 do manual
disponibilizado junto com as apostilas.

A seguir serão apresentados os registradores de configuração do conversor A/D do


ATmega328:

24.9.1 ADMUX – ADC Multiplexer Selection Register (Pag. 248)

Este registrador possui a função de selecionar a referência de tensão do A/D, a apresentação


do resultado da conversão e a seleção do canal a ser lido.

Bit 7:6 – REFS[1:0]: Reference Selection Bits

Disciplina de Sistemas Embarcados ‐ Faculdade de Engenharia Elétrica – UFU Página 16


1° Edição 11/2014

Bit 5 – ADLAR: ADC Left Adjust Result

OBS: De acordo com o manual do fabricante, o registrador ADCL deve ser lido primeiro, para
que o acesso aos registradores de dados do ADC não seja bloqueado antes da leitura do
registrador ADCH.

Texto retirado da página 238 do manual Atmel-8-bit-AVR-Microcontroller-ATmega328.pdf

Disciplina de Sistemas Embarcados ‐ Faculdade de Engenharia Elétrica – UFU Página 17


1° Edição 11/2014

Bits 3:0 – MUX[3:0]: Analog Channel Selection Bits

24.9.2 ADCSRA – ADC Control and Status Register A

Bit 7 – ADEN: ADC Enable: Liga o Conversor.

Bit 6 – ADSC: ADC Start Conversion: Inicia a conversão.

Bit 5 – ADATE: ADC Auto Trigger Enable: Habilita a converão automática.

Bit 4 – ADIF: ADC Interrupt Flag: Este bit assume nível lógico 1 quando a conversão termina
e o registrador de dados é atualizado.

Bit 3 – ADIE: ADC Interrupt Enable: Habilita a interrupção.

Bits 2:0 – ADPS[2:0]: ADC Prescaler Select Bits: Seleciona o “prescaler”.

Disciplina de Sistemas Embarcados ‐ Faculdade de Engenharia Elétrica – UFU Página 18


1° Edição 11/2014

A frequência de clock recomendada para o conversor A/D de 10 bits do Atmega328 é entre


50KHz e 200 KHz.
Deste modo, o único valor de “prescaler” que atende, de acordo com os cálculos a seguir é 128:
16 MHz / 2 = 8 MHz
16 MHz / 4 = 4 MHz
16 MHz / 8 = 2 MHz
16 MHz / 16 = 1 MHz
16 MHz / 32 = 500 kHz
16 MHz / 64 = 250 kHz
16 MHz / 128 = 125 kHz

24.9.4 ADCSRB – ADC Control and Status Register B

Bit 2:0 – ADTS[2:0]: ADC Auto Trigger Source

Se o bit ADATE no registrador ADCSRA estiver selecionado, os bits ADTS2, ADTS1 e


ADTS0 selecionam o recurso que irá acionar o ADC, de acordo com a Tabela 24-6.

Disciplina de Sistemas Embarcados ‐ Faculdade de Engenharia Elétrica – UFU Página 19


1° Edição 11/2014

24.9.5 DIDR0 – Digital Input Disable Register 0

Quando os bits deste registrador são colocados em nível lógico 1, o buffer digital de entrada
correspondente a um determinado pino do A/D é desabilitado.

Programando o Arduíno com o Software Arduíno no Windows

Ligue a saída variável de um potenciômetro de 5kΩ na entrada analógica A0 e alimente as


extremidades na alimentação de 5V e GND, como mostrado a seguir:

Disciplina de Sistemas Embarcados ‐ Faculdade de Engenharia Elétrica – UFU Página 20


1° Edição 11/2014

Execute o Software Arduíno, por meio de um clique sobre o ícone

Copie o código do AD e cole-o na IDE do Software Arduíno, como mostrado na sequência:

A/D

#include <avr/io.h>
#include <stdio.h>
#include <util/delay.h>

//---- constante para configuração do prescaler -----------------------------


const unsigned char PS_16 = (1 << ADPS2);
const unsigned char PS_32 = (1 << ADPS2) | (1 << ADPS0);
const unsigned char PS_64 = (1 << ADPS2) | (1 << ADPS1);
const unsigned char PS_128 = (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0);

int ad = 0;
int temp = 0;
char snum[10];

//---- Direcionando o fluxo de dados de printf para a Serial (UART) -------


static int uart_putchar (char c, FILE *stream){ Serial.write(c); return 0;}

void ad_init(void)
{
// The recommended clock for the Atmega328 10 bits A/D converter is between 50KHz and 200 KHz.
// So, the only possible value is 128.
// 16 MHz / 2 = 8 MHz
// 16 MHz / 4 = 4 MHz
// 16 MHz / 8 = 2 MHz
// 16 MHz / 16 = 1 MHz
// 16 MHz / 32 = 500 kHz
// 16 MHz / 64 = 250 kHz
// 16 MHz / 128 = 125 kHz

// ADCSRA register ( Pag. 263 )


// configura o preescaler do ADC
ADCSRA |= PS_128; // 128 prescaler
// ADCSRA |= PS_64; // 64 prescaler
// ADCSRA |= PS_32; // 32 prescaler
// ADCSRA |= PS_16; // 16 prescaler

// No Kit Arduíno, o pino 21 AREF não é conectado, por isso,


// ADMUX |= ( 1 << REFS1 ); // REFS1 = 0 e REFS0 = 1 (Pag. 262) (AVCC with external capacitor at
AREF pin)
ADMUX |= ( 1 << REFS0 );

ADCSRA |= ( 1 << ADATE ); // Auto Trigger Enable (Pag. 263)


ADCSRA |= ( 1 << ADEN ); // Turn ON A/D converter
ADCSRA |= ( 1 << ADSC ); // Start Convertion
}

Disciplina de Sistemas Embarcados ‐ Faculdade de Engenharia Elétrica – UFU Página 21


1° Edição 11/2014

int main(void)
{

//---- Direcionando o fluxo de dados de printf para a Serial (UART) -------


static FILE uartout = {0} ;
fdev_setup_stream (&uartout, uart_putchar, NULL, _FDEV_SETUP_WRITE);
stdout = &uartout;

int i = 0; // Loop variable


ad_init();
Serial.begin(9600);

while (1)
{
ad = ADCL; // ADCL must be read first, then ADCH
ad = (ADCH << 8) + ad;
printf("O valor do A/D %c: %d\r\n", 233, ad);
_delay_ms(1000);
}

return 0;
}

Disciplina de Sistemas Embarcados ‐ Faculdade de Engenharia Elétrica – UFU Página 22


1° Edição 11/2014

Com o kit Arduíno conectado ao Notebook ou PC, verifique se em Ferramentas -> Placa: o
kit adequado está selecionado.

Em Ferramentas -> Porta: verifique se a porta adequada está selecionada, como mostrado
abaixo:

Para salvar, compilar e realizar o upload do código para o kit Arduíno, clique em

Disciplina de Sistemas Embarcados ‐ Faculdade de Engenharia Elétrica – UFU Página 23


1° Edição 11/2014

Disciplina de Sistemas Embarcados ‐ Faculdade de Engenharia Elétrica – UFU Página 24


1° Edição 11/2014

Programando o Arduíno com o Software Ino no Linux (Debian)

Faça download do arquivo AD.zip e em seguida descompacte-o dentro da pasta


/home/ufu/Arduino

O arquivo AD.zip e muitos outros estão disponibilizados em:

Apostilas: https://mega.nz/#F!44kgjIgR!ivdR7Yta0sSRxZolNAeoMA

Disciplina de Sistemas Embarcados ‐ Faculdade de Engenharia Elétrica – UFU Página 25


1° Edição 11/2014

Em seguida realize os seguintes passos:


1) Verifique se o kit está conectado ao PC;
2) Acesse o terminal
3) Utilize os comandos a seguir para compilar e realizar o upload do programa:

ufu@SE:~$ cd Arduino/
ufu@SE:~/Arduino$ cd AD
ufu@SE:~/Arduino/AD$ ino build
ufu@SE:~/Arduino/AD$ ino upload

Em seguida, abra outro terminal e execute o comando arduino, como mostrado a seguir:

ufu@SE:~$ arduino

Disciplina de Sistemas Embarcados ‐ Faculdade de Engenharia Elétrica – UFU Página 26


1° Edição 11/2014

Para abrir a janela do Serial Monitor, pressione (Ctrl + Shift + M) ou utilize o menu, como
indicado a seguir:

O resultado esperado é:

Programa Exemplo do AD
AD.c

#include <avr/io.h>
#include <stdio.h>
#include <util/delay.h>

#include "uart.h"

// constante para configuração do prescaler


const unsigned char PS_16 = (1 << ADPS2);
const unsigned char PS_32 = (1 << ADPS2) | (1 << ADPS0);

Disciplina de Sistemas Embarcados ‐ Faculdade de Engenharia Elétrica – UFU Página 27


1° Edição 11/2014

const unsigned char PS_64 = (1 << ADPS2) | (1 << ADPS1);


const unsigned char PS_128 = (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0);

int ad = 0;
int temp = 0;
char snum[10];

void ad_init(void) {

// The recommended clock for the Atmega328 10 bits A/D converter is between 50KHz and 200 KHz.
// So, the only possible value is 128.
// 16 MHz / 2 = 8 MHz
// 16 MHz / 4 = 4 MHz
// 16 MHz / 8 = 2 MHz
// 16 MHz / 16 = 1 MHz
// 16 MHz / 32 = 500 kHz
// 16 MHz / 64 = 250 kHz
// 16 MHz / 128 = 125 kHz

// ADCSRA register ( Pag. 263 )


// configura o preescaler do ADC
ADCSRA |= PS_128; // 128 prescaler
// ADCSRA |= PS_64; // 64 prescaler
// ADCSRA |= PS_32; // 32 prescaler
// ADCSRA |= PS_16; // 16 prescaler

// No Kit Arduíno, o pino 21 AREF não é conetado, por isso,


// ADMUX |= ( 1 << REFS1 ); // REFS1 = 0 e REFS0 = 1 (Pag. 248) (AVCC with external capacitor at AREF pin)
ADMUX |= ( 1 << REFS0 );

ADCSRA |= ( 1 << ADATE ); // Auto Trigger Enable (Pag. 249)


ADCSRA |= ( 1 << ADEN ); // Turn ON A/D converter
ADCSRA |= ( 1 << ADSC ); // Start Convertion
}

int main(void) {

int i = 0; // Loop variable


uart_init();
stdout = &uart_output;
stdin = &uart_input;
ad_init();

while(1) {
ad = ADCL; // ADCL must be read first, then ADCH
ad = (ADCH << 8) + ad;
printf("O valor do A/D %c: %d\r\n", 233, ad);
_delay_ms(1000);
}

return 0;
}

Universidade Federal de Uberlândia


Faculdade de Engenharia Elétrica
Disciplina de Sistemas Embarcados

www.omegaflix.com

Prof. Fábio V. R. da Silva

Disciplina de Sistemas Embarcados ‐ Faculdade de Engenharia Elétrica – UFU Página 28

You might also like