Você está na página 1de 16

Prottipo de Software e Hardware para Aquisio de Dados.

Lus Augusto Spranger

Universidade Regional de Blumenau FURB bibao@yahoo.com

Novembro / 2002
RESUMO Este artigo descreve a construo de um prottipo para aquisio de dados em IBM-PCs usando a porta paralela, um conversor analgico / digital e um software desenvolvido em Delphi para MSWindows.

PALAVRAS-CHAVE: Aquisio de dados, Conversor A/D, Porta Paralela.

1. Introduo
Nos temos mais recentes com a popularizao de componentes eletrnicos e do uso de tecnologias, tornou-se muito simples criar sistemas de aquisio de dados para computadores pessoais a um custo muito reduzido e com uma confiabilidade muito boa. O objetivo deste artigo descrever a construo de um prottipo desde o hardware onde os dados so coletados ate a parte de software que faz o controle sobre o hardware e faz a interpretao dos valores lidos, optou-se em elaborar um software bastante flexvel para poder ser usado em diversas aplicaes diferentes, usando bibliotecas do sistema operacional MSWindows( DLLs) e um hardware com custo bastante reduzido.

2. Uma viso geral do sistema


O sistema pode ser dividido em blocos, como pode ser visto abaixo:
Fonte de Alimentao Programa de Aquisio de Dados

2
Sensor

3
Amplificador Operacional

4
Conversor A/D

6
DLL Aquisio

7
DLL Sensor

8
DLL Visualizao

Hardware

Software

Figura 1: Blocos do sistema de aquisio de dados

O Hardware composto pelos blocos: 1 Fonte de alimentao, responsvel pela alimentao dos blocos do hardware, fornece todas as tenses necessrias para o funcionamento; 2 Sensor ou um transdutor, este fornece uma medida eltrica de grandeza que desejamos medir, por exemplo temperatura, luminosidade, presso, pH entre outras; 3 O Amplificador Operacional o responsvel por adequar a medida feita pelo sensor para uma faixa de tenso que varia de 0 a 5 Volts; 4 Conversor A/D, transforma a tenso eltrica de 0 a 5 Volts que vem do amplificador operacional em um valor binrio formado por 8 bits onde 0 Volts representado pelo nmero 0 e 5 Volts representado pelo nmero 255, ou seja faz a discretizao do valor, pois o computador no consegue ler diretamente um sinal analgico. O Software composto pelos blocos: 5 O Programa de aquisio de dados, o responsvel por gerenciar os valores entre as DLLs (bibliotecas do sistema) e fazer o gerenciamento de tempo das leituras; 6 DLL de aquisio, responsvel por fazer a comunicao com o hardware, neste caso um conversor A/D ligado a porta paralela do computador;

7 DLL de sensor, a biblioteca responsvel por fazer as transformaes matemticas sobre os valores lidos pela DLL de aquisio, tambm informa o nome das unidades de medida das grandezas medidas nos sensores; 8 DLL de visualizao, a biblioteca que faz a representao grfica dos valores calculados pela DLL de sensor e mostra para o usurio.

3. Hardware
3.1 Conversor A/D (Analgico/Digital)
Existem diversos tipos de conversores A/D, de acordo com a tcnica utilizada para realizar medidas discretas de voltagem ou corrente de um sinal. As duas tcnicas mais comuns so a de aproximaes sucessivas e a das comparaes sucessivas, ou gerador de rampa.

3.1.1 Circuito Integrado usado para fazer a converso (ADC0832)

Neste projeto foi usado um CI (circuito integrado) que j se encarrega de fazer esta converso automaticamente por aproximao sucessiva, o ADC0832 da National Semiconductors, possui 2 canais de entrada que variam de 0 a 5 Volts com uma resoluo de 8 bits e uma interface serial de comunicao, tudo isso em 8 pinos.

Figura 2: Pinagem externa do circuito integrado conversor A/D

Temos os pinos: 1 Chip select, quando este pino est com nvel lgico alto o CI se encontra desativado, quando este mesmo pino passa para o estado lgico baixo o CI ativado, neste mesmo momento feita a converso do valor nas entradas CH0 e CH1;

2 CH0, canal 0 de leitura pode variar entre 0 Volts e Vref (tenso que aplicada no pino 8); 3 CH1, canal 1 de leitura pode variar entre 0 Volts e Vref (tenso que aplicada no pino 8); 4 GND (Ground), terra (pino negativo) do CI; 5 DI, Data In, pino usado para receber sinal do dispositivo que vai controlar o CI (Host), neste caso o computador, usado junto com os pinos 6 (DO) e 7 (CLK) usado para fazer a configurao de qual canal ser lido (ver mais adiante em Software); 6 DO, Data Out, pino que disponibiliza o valor lido de forma serial sincronizado pelo pino 7 (CLK); 7 CLK, Clock, pino usado pelo Host (computador) para sincronizar as leitura e escritas para configurao do CI. 8 Vcc e Vref, tenso de alimentao do CI, tambm serve de referncia para o circuito de converso como sendo o valor mximo, pode variar entre 4,5 e 6,3 Volts, neste prottipo o valor definido foi de 5 Volts.
3.1.2 Porta Paralela do Computador (IBM-PC)

Os computadores padro IBM-PC possuem pelo menos uma ou mais portas paralelas, estas portas seguem um padro, usam conectores DB-25, ou seja possuem 25 pinos, cada porta possui 3 bytes (8 bits) de referencia: um byte DATA, usado para escrever at 8 bits (nas portas mais modernas tambm chamadas de EPP, tambm possvel fazer a leitura destes bits); um byte CONTROL, deste byte mesmo ele possuindo 8 bits so usados apenas 4 bits estes podem ser tanto para leitura como escrita (no entanto no sistema operacional MSWindows 95 e 98 o acesso a esses 4 bits um pouco mais complicado pois o sistema operacional controla esses bits, tornando eles assim mais difceis de usar em aplicaes); um byte STATUS, deste byte so usados 5 bits de entrada, onde o ultimo bit invertido por hardware.

Veja abaixo um breve resumo dos bytes e dos pinos na porta paralela:

Descrio 8 pinos de sada 5 pinos de entrada

4 pinos de sada

Bits Endereo D0 at D7 Endereo Base (378H veja tabela 2) S3, S4, S5, S6, Endereo Base + 1 (379H veja tabela S7 STATUS 2) (1 bit invertido veja figura 3) C0, C1, C2, C3 Endereo Base + 2 (37AH veja tabela CONTROL (3 bits invertidos 2) veja figura 3)
Tabela 1: Os trs bytes da porta paralela

Byte DATA

Endereo 3BCh - 3BFh 378h - 37Fh 278h - 27Fh

Observaes Usado na portas paralelas que acompanham as placas de vdeo (geralmente placas CGA). Endereo para LPT 1 Endereo para LPT 2
Tabela 2: Descrio de endereos mais comuns

Pino no D25 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 - 25

Pino no conector Nome do Sinal Centronics 1 NStrobe 2 Data 0 3 Data 1 4 Data 2 5 Data 3 6 Data 4 7 Data 5 8 Data 6 9 Data 7 10 nAck 11 Busy 12 Paper-Out 13 Select 14 nAuto-Linefeed 32 nError / nFault 31 Ninitialize 36 NSelect-Printer 19-30 Ground

Direo In/Out Out Out Out Out Out Out Out Out In In In In In/Out In In/Out In/Out Gnd

Nome do Byte Control Data Data Data Data Data Data Data Data Status Status Status Status Control Status Control Control

Inverso no Hardware Sim

Sim

Sim

Sim

Tabela 3: Descrio de Pinos

Figura 3: Pinagem da porta paralela

3.1.3 Circuito eltrico do bloco Conversor A/D

Abaixo o circuito eltrico do conversor A/D:

Figura 4: Circuito eltrico do conversor A/D

No circuito eltrico temos o CI ADC0832 (IC1) nele de um lado as entradas analgicas e de alimentao e do outro as entradas/sadas de dados que so D0, D1, D2 e S3 ligadas a porta paralela.

Este circuito pode ser facilmente montado em uma placa de circuito impresso:

Figura 5: Sugesto do desenho do circuito impresso para o bloco do conversor A/D

4. Software
Todo o software foi feito em Delphi, desde o programa principal at as DLLs. Nos prximos tpicos uma descrio detalhada de cada parte do programa.

4.1 Programa de aquisio de dados (DataReader)


Basicamente este programa tem como funo gerenciar as DLLs do sistema, fazer a comunicao de dados entre elas e servir te temporizador para as medidas. Todas as DLLs do sistema devem estar no diretrio plug-in, quando o programa executado ele vai neste diretrio e faz uma busca por arquivos: os arquivos que comearem por a_ e que tenham a extenso .DLL sero includos na lista de plug-ins (bibliotecas, DLLs) de Aquisio; os arquivos que comearem por s_ e que tenham a extenso .DLL sero includos na lista de plug-ins de Sensor;

os arquivos que comearem por v_ e que tenham a extenso .DLL sero includos na lista de plug-ins de Visualizao.

Abaixo uma copia da janela do programa:

Figura 6: Copia da janela principal do programa

Na parte superior da janela temos quatro sees do programa: Plug-in Aquisio, existe uma lista com as DLLs disponveis para fazer a comunicao com o hardware, deve-se escolher o plug-in compatvel com o hardware neste caso o plug-in que compatvel com a placa ADC0832; Plug-in Sensor, DLL responsvel pelo tratamento e converso do valor lido no hardware para valores reais de grandezas fsicas; Plug-in Visualizao, todas as DLL disponveis para visualizar os dados j recalculados pelo plug-in Sensor (nesta lista entram no mximo 50 DLL, todas elas esto carregadas na memria, mas apenas as que forem selecionadas, recebero os dados da leitura); Leitura, seo de controle do intervalo entre as leituras, o tempo mnimo e mximo determinado pelo plug-in de aquisio e depende das limitaes de hardware, tambm possui os comandos Play (inicia a leitura em intervalos definidos pelo usurio) e Stop (para a leitura).

4.2 DLL de aquisio


Funes e procedures que este tipo de DLL deve conter: Start = procedure( pluginpath : ShortString ) - chamada para inicializar a DLL, serve para alocar espao na memria e zerar variveis. O parmetro pluginpath serve para indicar o nome do diretrio onde se encontra a DLL, isso til para gravar arquivos de inicializao (.INI); Terminate = procedure chamada quando ante de descarregar a DLL da memria, deve gravar as ultima configuraes em arquivos (.INI) e desalocar variveis e recursos de hardware (se necessrio); Read = procedure chamada quando deve ser feita uma leitura dos valores do hardware; GetReadMin = function : integer retorna um valor inteiro indicando a velocidade mnima em ms que o hardware capaz de fazer a leitura; GetReadMax = function : integer retorna um valor inteiro indicando a velocidade mxima em ms que o hardware capaz de fazer a leitura; GetValueMin = function : integer retorna um valor inteiro indicando o valor mnimo que o hardware pode retornar de uma leitura (tipicamente 0); GetValueMax = function : integer retorna um valor inteiro indicando o valor mximo que o hardware pode retornar de uma leitura (tipicamente 255 para 8 bits de resoluo no hardware); GetChannels = function : integer retorna um valor inteiro indicando o nmero de canais disponveis no hardware (por exemplo 2 no conversor com o CI ADC0832); GetValue = function(c : integer) : integer retorna um valor inteiro indicando o valor lido no hardware no canal c (c o nmero do canal, a contagem de canais sempre comea em 0); GetInfo = function : ShortString retorna uma string com uma breve descrio do que a DLL faz e com o que compatvel; ShowConfig = procedure procedure chamada quando o boto de configurao clicado, serve para fazer configuraes gerais da DLL (portas de leitura, etc.).

10

4.2.1 a_ADC0832.DLL

DLL responsvel pela comunicao com a placa do conversor A/D com CI ADC0832 visto no tpico 3. Para fazer a comunicao de baixo nivel com o hardware foi criada a seguinte classe: function Tio.ReadPort(PortValue : word): word; var Data: word; Begin asm mov dx, PortValue in ax, dx mov Data, ax end; Result := byte(data); end; procedure Tio.WritePort(PortValue, DataValue: word); begin DataValue := DataVAlue*256+DataValue; Asm mov ax, datavalue; mov dx,portvalue out dx,ax end; end; A classe Tio acessa o hardware atravs da funo ReadPort (faz a leitura do endereo com a instruo IN) e a procedure WritePort (escreve no endereo com a instruo OUT). Para fazer a comunicao com o integrado foi usado o Timing Diagram disponvel no datasheet do CI:

11

Figura 7: Timing diagram do CI conversor A/D (ADC0832)

Os bits SGL/DIF e ODD/SING que so enviados a DI servem para fazer a escolha de qual canal iremos ler (0 ou 1), estes bits obedecem a ordem abaixo:

Tabela 4: Configurao dos bits para fazer a leitura do canal 0 ou do canal 1

Seguindo o esquema eltrico (tpico 3) da placa do conversor A/D temos que Clock = D0; Data In = D1; Chip Select = D2 e Data Out = S3 ento se faz a seguinte seqncia de leitura para obter o valor: CS = 0; DI = 1; CLK = 0; Ativa o conversor (CS baixo) clock inicia baixo e DI alto para fazer o start bit: wIo.WritePort( wPorta, $2 ); // Valor 2 = 00000010

12

CS = 0; DI = 1; CLK = 1; Conversor ativo, clock alto (pulso 1) e DI alto (ainda no start bit): wIo.WritePort( wPorta, $3 ); // Valor 3 = 00000011 CS = 0; DI = 1; CLK = 0 e 1; Mais um pulso de clock mantendo o DI alto (com isso o bit SGL/DIF foi enviado alto seguindo a tabela 4): wIo.WritePort( wPorta, $2 ); // Valor 2 = 00000010 wIo.WritePort( wPorta, $3 ); // Valor 3 = 00000011 CS = 0; DI = ?; CLK = 0 e 1; Mais um pulso de clock, nesse momento se a leitura for do canal 0 ento o bit ODD/SING deve ser baixo (DI = 0) seno ODD/SING deve ser alto abaixo a leitura do canal 0: wIo.WritePort( wPorta, $2 ); wIo.WritePort( wPorta, $3 ); // canal 0 // canal 0

CS = 0; DI = 0; CLK = 0 e 1; Mais um pulso de clock, nesse momento (pulso 4 no Timing Diagram) o multiplexado esta fazendo o chaveamento do canal escolhido: wIo.WritePort( wPorta, $0 ); // Valor 0 = 00000000 wIo.WritePort( wPorta, $1 ); // Valor 1 = 00000001 CS = 0; DI = 0; CLK = 0 e 1; Nos prximos 8 pulsos de clock ser disponibilizado 1 bit do valor convertido, com isso o valor ser montado em 8 passos na varivel v. v := 0; for i:=0 to 7 do begin wIo.WritePort( wPorta, $0 ); // clock baixo para ler S3 v := v or (((wIo.ReadPort( wPorta + 1 ) and $08 ) shl 4 ) shr i ); // monta S3 empurrando o bit 3 todo para esquerda

13

depois um numero i de vezs para direita i corresponde ao numero do bit que esta sendo lido neste instante. wIo.WritePort( wPorta, $1 ); // gera 1 pulso de clock end;

O Timing Diagram indica mais uma seqncia de leitura, esta porem no ser feita pois o CI envia toda a seqncia dos 8 bits novamente mais em ordem inversa isso usado para fins de preveno de erros de leitura, mas estes 8 bits so descartados a partir deste momento podemos desabilitadar o CI novamente. A leitura dos canais feita em duas etapas diferente, primeiro lido o canal 0 depois o canal 1 sempre seguindo a seqncia mostrada acima.
4.2.2 a_RANDOM.DLL

Esta DLL tem como objetivo gerar nmeros randmicos para testes de outras DLLs, no faz nenhuma leitura de hardware, o valor dos nmeros podem ser configurados atravs da janela de configurao.

4.3 DLL de sensor


Funes e procedures que este tipo de DLL deve conter: Start = procedure( pluginpath : ShortString ) - chamada para inicializar a DLL, serve para alocar espao na memria e zerar variveis. O parmetro pluginpath serve para indicar o nome do diretrio onde se encontra a DLL, isso til para gravar arquivos de inicializao (.INI); Terminate = procedure chamada quando ante de descarregar a DLL da memria, deve gravar as ultima configuraes em arquivos (.INI) e desalocar variveis e recursos de hardware (se necessrio); Calculate = function( c: integer; v : integer ) : real faz o calculo e retorna um valor real (c o nmero do canal, sempre comeando em 0 e v o valor lido no hardware);

14

GetUnitName = function( c: integer ) : ShortString retorna o nome da unidade relacionada com a grandeza fsica que depende do sensor ligado no respectivo canal (c o canal comeando em 0, por exemplo para temperatura no canal 0 retorna C);

GetInfo = function : ShortString retorna uma string com uma breve descrio do que a DLL faz e com o que compatvel; ShowConfig = procedure procedure chamada quando o boto de configurao clicado, serve para fazer configuraes gerais da DLL (portas de leitura, etc.).

4.2.1 s_DIRETO.DLL

Esta DLL no faz calculo nenhum sobre o valor lido, apenas retorna o valor que foi lido no hardware atravs da DLL de aquisio, usada para fazer testes e montar as tabelas de relao.

4.2.2 s_Sensores_NTC_LDR.DLL

Converte os valores lidos por um sensor de temperatura e um sensor de luz em pelo conversor A/D em valores de grandeza.

4.4 DLL de visualizao


Funes e procedures que este tipo de DLL deve conter: Start = procedure( pluginpath : ShortString ) - chamada para inicializar a DLL, serve para alocar espao na memria, zerar variveis e criar janelas na memria. O parmetro pluginpath serve para indicar o nome do diretrio onde se encontra a DLL, isso til para gravar arquivos de inicializao (.INI);

15

Terminate = procedure chamada quando ante de descarregar a DLL da memria, deve gravar as ultima configuraes em arquivos (.INI) e desalocar variveis, recursos de hardware e destruir janelas (se necessrio);

SetUnitName = procedure(c : integer; u : ShortString) seta o nome das unidade de acordo com o canal (c o canal comeando em 0 e u o nome da varivel); SetReadSpeed = procedure (rs : integer) seta a velocidade de leitura em ms; SetValueMin = procedure (c : integer; v : real) seta o valor mnimo que ser exibido de acordo com o canal (c o canal comeando em 0); SetValueMax = procedure (c : integer; v : real) seta o valor mximo possvel que ser exibido de acordo com o canal (c o canal comeando em 0); SetChannels = procedure (c : integer) seta o nmero de canais disponveis na DLL de aquisio (c o numero de canais comeando em 1); SetValue = procedure (c : Integer; v : real) seta o valor quando ele lido na DLL de aquisio e transformada pela DLL de sensor (c o canal comeando em 0 e v o valor que vem da DLL de sensor);

Show = procedure deve conter instrues para mostrar (no construir) a janela de visualizao; Hide = procedure deve conter instrues para esconder (no destruir) a janela de visualizao; GetInfo = function : ShortString retorna uma string com uma breve descrio do que a DLL faz e com o que compatvel; ShowConfig = procedure procedure chamada quando o boto de configurao clicado, serve para fazer configuraes gerais da DLL (portas de leitura, etc.).

16

5. Referncias Bibliogrficas
Beyond Logic Legacy PC Ports. Setembro, 2002 http://www.beyondlogic.org

National Semiconductors ADC0831 Datasheet. Julho, 2002 http://www.nationalsemiconductors.com

Você também pode gostar