Escolar Documentos
Profissional Documentos
Cultura Documentos
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.
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
Sensor
3
Amplificador Operacional
4
Conversor A/D
6
DLL Aquisio
7
DLL Sensor
8
DLL Visualizao
Hardware
Software
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.
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.
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:
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
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
Sim
Sim
Sim
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:
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.
os arquivos que comearem por v_ e que tenham a extenso .DLL sero includos na lista de plug-ins de Visualizao.
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).
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
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:
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.
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.
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