Post on 14-Mar-2018
UNIVERSIDADE FEDERAL DO PARANÁ
KLEITON CHOCHI ZEMBOVICI
MARCELO GONÇALVES FRANCO
DISPOSITIVO PARA AQUISIÇÃO DE SINAIS E CONTROLE DIGITAL VIA USB
Curitiba – PR 2009
UNIVERSIDADE FEDERAL DO PARANÁ
KLEITON CHOCHI ZEMBOVICI
MARCELO GONÇALVES FRANCO
DISPOSITIVO PARA AQUISIÇÃO DE SINAIS E CONTROLE DIGITAL VIA USB
Projeto de Graduação na área de Engenharia
Elétrica apresentado à Universidade Federal do
Paraná, como requisito parcial para a obtenção do
título de Engenheiro Eletricista.
Orientador: Eduardo Parente Ribeiro.
Curitiba – PR 2009
1
AGRADECIMENTOS
Agradecemos a todos que nos incentivaram a fazer este trabalho,
trazendo-nos força e confiança para que não desanimássemos em nenhum
instante durante a execução deste trabalho.
Agradecemos ao profo. Dr. Eduardo Parente Ribeiro do Departamento de
Engenharia Elétrica da Universidade Federal do Paraná pela sugestão do tema
e pelo apoio dado sempre que precisamos, orientando o projeto e indicando
fontes de pesquisas para o desenvolvimento deste.
Agradecemos também ao profo. M.Sc. Ademar Luiz Pastro e ao profo. Dr.
Gideon Villar Leandro do Departamento de Engenharia Elétrica da
Universidade Federal do Paraná pelas críticas e sugestões dadas na
apresentação parcial do projeto.
Agradecemos ao nosso grande amigo Luis pela força e ajuda durante o
desenvolvimento do software, e ao Eng. Jefferson da Henry pelo empréstimo
dos microcontroladores.
Também agradecemos aos fabricantes de componentes MAXIM e
MICROCHIP por terem nos disponibilizado amostras dos componentes, sem os
quais não conseguiríamos realizar este projeto.
Não poderíamos esquecer de agradecer às nossas famílias e amigos,
que estiveram sempre ao nosso lado e que compreenderam nossa ausência
em alguns momentos, com a certeza de que tudo isso era preciso para o
sucesso deste trabalho.
Acima de tudo, agradecemos um ao outro pelo empenho e dedicação
dados a este trabalho, na certeza de que estaríamos fazendo o possível para o
sucesso deste projeto.
2
RESUMO
O dispositivo para aquisição de sinais e controle digital apresentado neste
trabalho é um protótipo que se assemelha a um osciloscópio digital, utilizado
para captar sinais, digitalizá-los e enviá-los para o computador através da
comunicação USB. O dispositivo possui dois canais de 8 bits independentes,
taxa de amostragem variável, oito escalas de amplitude e controle digital para
dois dispositivos externos. O hardware consiste de um estágio amplificador de
dois canais e com ganho variável, dois multiplexadores para seleção deste
ganho e um microcontrolador, responsável pelo tratamento do sinal, pela
seleção do ganho do AmpOp através do controle do MUX, e pela comunicação
com o computador. O firmware do microcontrolador foi elaborado em
linguagem C. O software da interface gráfica foi elaborado em Delphi,
apresentando uma tela que lembra a de um osciloscópio convencional.
Palavras-ChaveOsciloscópio USB
PIC18F2550
Comunicação USB
3
ABSTRACT
The device for signal acquisition and digital control presented in this work is a
prototype that resembles a digital oscilloscope,used to capture signals, scan
them and send them to your computer through the USB communication. The
device has two independent channels of 8 bits, variable sample rate, eight
amplitude scales and digital control for two external devices. The hardware
consists of a stage and two-channel amplifier with variable gain, two
multiplexers to select the gain and a microcontroller, which is the responsible for
the signal treatment, for the selection of the AmpOp gain through MUX control,
and also for the communication with the computer. The microcontroller´s
firmware was developed in language C. The software's graphical interface was
developed in Delphi, displaying a screen that resembles that of a conventional
oscilloscope.
Key wordsUSB oscilloscope
PIC18F2550
4
USB communication
5
LISTA DE ABREVIATURAS E SIGLAS
AMPOP - Amplificador Operacional
BNC - Conector Naval Britânico (British Naval Connector)
CAD - Conversor Analógico Digital
CI’s - Circuitos Integrados
CMOS - semicondutor metal-óxido complementar (complementary
metal oxide semiconductor)
EEPROM - Memória Programável e Apagável Eletricamente
(Electrically Erasable Programmable Read Only Memory)
GPR - Registrador de Propósito Geral (General Purpose Register)
HID - Dispositivo de Interface Humana (Human Interface Device)
ICSP - Programação Serial no Circuito (In-Circuit Serial
Programming™)
kbps - Kilo-bits por Segundo (Kilo-bits per second)
kSPS - Kilo-amostras por Segundo (Kilo-Samples per Second)
LSB - Bit menos significativo (Least significant Bit)
LVP - Programação em Baixa Tensão (Low Voltage
Programming)
MAC - Controle de Acesso ao Meio (Media Access Control)
Mbps - Megabits por Segundo (Mega bits per Second)
MMC - Comando de Gerenciamento Microescalonado (Micro-
scheduled Management Command)
MSB - Bit mais significativo (Most Significant Bit)
SCLK - Relógio da Serial (Serial Clock)
MSPS - Mega-amostras por Segundo (Mega-Samples per Second )
PIC - Controlador de Interface Programável (Programmable
Interface Controller)
ROM - Memória Somente de Leitura (Read Only Memory)
SFR - Registrador de Função Especial (Special Function Register)
SMD - Componente de Montagem em Superfície (Superficial
Monting Device)
6
SRAM - Memória Estática de Acesso Randônico (Static Random
Access Memory)
TDM - Multiplexação por Divisão de Tempo (Time division
Multiplexing)
TTL - Lógica Transístor-Transístor (Transistor-Transistor Logic)USB - Barramento Serial Universal (Universal Serial Bus)
WUSB - Wireless USB
7
LISTA DE FIGURAS
Figura 1 – Topologia USB.......................................................................19
Figura 2 – Topologia do Wireless USB...................................................20
Figura 3 – Tipos de Conectores USB.....................................................20
Figura 4 – Tipos de Conectores USB.....................................................21
Figura 5 – Tipos de Conectores USB.....................................................21
Figura 6 – Tipos de Adaptadores USB...................................................22
Figura 7 – Tipos de Adaptadores USB...................................................22
Figura 8 – Tipos de Adaptadores USB...................................................23
Figura 9 – Corte Transversal do Cabo USB...........................................23
Figura 10 – Modelo de Hub USB............................................................31
Figura 11 – Conversor Analógico Digital................................................33
Figura 12 – Circuito Básico de um AmpOp.............................................33
Figura 13: Diagrama do dispositivo com comunicação USB e conversor
analógico/digital.................................................................................................34
Figura 14: Diagrama de blocos do conversor analógico/digital..............35
Figura 15 – Layout das Trilhas...............................................................40
Figura 16 – Layout dos Componentes....................................................41
Figura 17 – Layout das Trilhas das Placas de Correção........................42
Figura 18 – Layout dos Componentes das Placas de Correção.............43
Figura 19 – Protótipo no Montado no Interior da Caixa..........................44
Figura 20 – Vista Superior da Caixa.......................................................44
Figura 21 – Vista Superior Esquerda da Caixa.......................................45
Figura 22 – Vista Superior Direita da Caixa............................................45
Figura 23 – Tela de interface do PCWHD..............................................48
Figura 24 - Esquema Eletrônico do Programador.................................49
Figura 25 – Gravador do PIC..................................................................49
Figura 26 – Tela de interface do PICPgm Develop. Programmer V1.0.1.5
..........................................................................................................................50
Figura 27 - Microcontrolador 18F2550....................................................51
Figura 28 – Fluxograma do Firmware.....................................................52
8
Figura 29 – Tela de interface gráfica do Borland Delphi Second Edition
versão 7.2..........................................................................................................56
Figura 30 – Fluxograma do programa em Delphi...................................61
Figura 31 – Tela de interface gráfica do programa final.........................61
9
LISTA DE QUADROS
Quadro 1: Relação de Resistores Utilizados..........................................46
Quadro 2: Relação de Capacitores Utilizados........................................46
Quadro 3: Relação de Circuitos Integrados Utilizados...........................47
Quadro 4: Relação dos Demais Componentes Utilizados......................47
Quadro 5 – Pinos Utilizados no PIC.......................................................52
10
SUMÁRIO
AGRADECIMENTOS..........................................................................................1
RESUMO.............................................................................................................2
ABSTRACT.........................................................................................................3
LISTA DE ABREVIATURAS E SIGLAS...............................................................4
LISTA DE FIGURAS............................................................................................6
LISTA DE QUADROS.........................................................................................8
SUMÁRIO............................................................................................................9
1.- INTRODUÇÃO..............................................................................................11
1.1. OBJETIVO..............................................................................................11
1.1.1. OBJETIVO GERAL..............................................................................12
1.1.2. OBJETIVO ESPECÍFICO.....................................................................12
1.2. JUSTIFICATIVA......................................................................................12
2.-CONCEITOS.................................................................................................14
2.1. PRINCIPAIS CONCEITOS......................................................................14
2.1.1. OSCILOSCÓPIO..................................................................................14
2.1.2. USB......................................................................................................15
2.1.2.1. HISTÓRICO......................................................................................16
2.1.3. WIRELESS USB – WUSB...................................................................17
2.1.4. PRINCIPAIS CARACTERÍSTICAS DO USB.......................................17
2.1.5. TOPOLOGIA USB...............................................................................18
2.1.6. TIPOS DE CONECTORES E ADAPTADORES USB..........................20
2.1.7. CABO USB..........................................................................................23
2.1.8. HOST USB...........................................................................................24
2.1.9. PROTOCOLO USB..............................................................................25
2.1.10. ENUMERAÇÃO................................................................................26
2.1.11. MODELO DE FLUXO DE DADOS...................................................27
2.1.12. DISPOSITIVOS USB........................................................................29
2.1.13. DIGITALIZAÇÃO DE SINAIS...........................................................32
2.1.14. AMPLIFICAÇÃO DE SINAIS............................................................33
3.-ARQUITETURA DO PROTÓTIPO................................................................34
3.1. ANÁLISE DOS PRINCIPAIS COMPONENTES DO CIRCUITO.............35
11
3.1.1. ESCOLHA DO MICROCONTROLADOR............................................36
3.1.2. ESCOLHA DO MULTIPLEXADOR......................................................37
3.1.3. ESCOLHA DO AMPLIFICADOR OPERACIONAL..............................38
4.-CONCLUSÕES.............................................................................................64
4.1. PERSPECTIVAS.....................................................................................65
REFERÊNCIAS BIBLIOGRÁFICAS.................................................................66
REFERÊNCIAS PARA PESQUISA..................................................................67
ANEXO A - CRONOGRAMA DO PROJETO....................................................70
ANEXO B – DIAGRAMA ESQUEMÁTICO DO CIRCUITO..............................71
ANEXO C – DIAGRAMA ESQUEMÁTICO DO CIRCUITO DE TRATAMENTO DE SINAIS.........................................................................................................72
ANEXO D – DIAGRAMA ESQUEMÁTICO DA FONTE EXTERNA.................73
ANEXO E – CÓDIGO FONTE DO FIRMWARE................................................74
ANEXO F – Código Fonte do Software..........................................................79
12
1. INTRODUÇÃO
A medição e a análise de sinais são de fundamental importância para
muitos profissionais, principalmente na área de eletro-eletrônica. Esta medição
pode ser feita de diversas maneiras. Muitos são os dispositivos existentes para
realizar medições em circuitos elétricos ou eletrônicos, seja um simples
multímetro de bolso com seus recursos limitados ou um sofisticado
osciloscópio de bancada com suas várias funções especiais, ou ainda os
analisadores de espectro. Cada um dos equipamentos tem sua aplicação,
dependendo das necessidades de precisão, confiabilidade e custo, o usuário
pode optar pelo equipamento que satisfaça sua necessidade.
Quanto maior a complexidade do equipamento, confiabilidade, precisão,
quantidade de recursos e ainda a tecnologia utilizada, maior será o custo do
equipamento. Juntando a eletrônica e os recursos do computador, resolveu-se
desenvolver um dispositivo para análise de sinais, semelhante a um
osciloscópio, porém, de mais baixo custo.
O dispositivo para aquisição de sinais e controle digital via USB é um
dispositivo que captura os sinais a serem analisados através de pontas de
prova conectadas a entradas do tipo BNC, trata o sinal e envia através de uma
conexão USB para um microcomputador, onde, por meio de uma interface
gráfica, o sinal é então mostrado em uma tela, similar a de um osciloscópio
comum.
Este projeto foi baseado no trabalho de conclusão de curso dos
graduandos Leandro Silva Piecarz e Walter Luciano Espíndola, apresentado
em 2007 [1]. Partindo da idéia base buscou-se aprimorar e evoluir o dispositivo
apresentado por estes formandos de 2007.
1.1. Objetivo
O objetivo deste projeto é desenvolver um dispositivo para aquisição e
tratamento de sinais, e envio destes através de conexão USB para um
13
computador que, previamente carregado com um software, mostrará os sinais
a serem analisados na tela.
Também incorporado ao projeto tem-se um controlador de dispositivos
através do computador, com saídas digitais para os equipamentos a serem
controlados.
1.1.1. Objetivo geral
O objetivo geral deste projeto é desenvolver um hardware e um software
na área de instrumentação e controle, voltado para a medição de sinais e o
controle de dispositivos externos, visando custo baixo e facilidade de uso.
1.1.2. Objetivo específico
Projetar um circuito eletrônico para a aquisição de sinais com dois
canais de oito bits, com taxa de amostragem pré-definido no
firmware em 32kSPS e oito escalas de amplitude variando de
0,02V a 25V.
Desenvolver um firmware para a comunicação via USB e
digitalização do sinal.
Desenvolver uma interface gráfica para que os sinais sejam
mostrados na tela do computador.
Confeccionar o protótipo do dispositivo.
1.2. Justificativa
Várias são as motivações para o desenvolvimento deste projeto, dentre
as principais pode-se citar os seguintes:
14
A utilização dos conhecimentos em eletrônica analógica e digital para
desenvolver o circuito.
A possibilidade de confeccionarmos a placa, visto que esta parte
prática é extremamente apreciada pelos membros da equipe.
O desafio de desenvolver uma interface gráfica no computador, sendo
que nenhum dos membros da equipe tinha conhecimentos
aprofundados no assunto, tendo então que estudar e aprender mais
sobre isto.
A possibilidade futura de comercialização, adequando o produto às
normas e evoluindo o protótipo com as possíveis correções e
sugestões.
15
2. CONCEITOS
Nesta parte do trabalho será apresentado um breve resumo de conceitos
necessários para o entendimento da seqüência do projeto. Serão abordados
conceitos básicos sobre osciloscópios e suas principais funções, comunicação
via porta USB com suas principais características e protocolos, bem como
dispositivos que usam este tipo de comunicação. Também serão abordados os
temas de digitalização e amplificação de sinais.
2.1. Principais Conceitos
2.1.1. Osciloscópio
Osciloscópio é basicamente um dispositivo de visualização gráfica que
mostra sinais, contínuos ou alternados, elétricos no tempo. Um osciloscópio
pode ser usado para determinar diretamente o período ou a tensão de um
sinal, determinar indiretamente a freqüência de um sinal ou ainda para medir a
diferença de fase entre dois sinais periódicos.
Os sinais captados pelo osciloscópio são geralmente mostrados em uma
tela retangular de tamanho 10cmx8cm com divisões de 1cm² e, nos eixos X e Y
cada quadrado ainda possui subdivisões de 0,2cm o que facilita a leitura dos
sinais analisados.
Para realizar a captura dos sinais se faz necessário o uso de ponteiras
de prova adequadas para o modelo de osciloscópio usado. Geralmente essas
ponteiras são atenuadoras com escalas de atenuação de 1:1, 1:10 ou 1:100,
resposta em freqüência com escalas de 20MHz a 300MHz e conexão do tipo
BNC. As escalas de atenuação e resposta em freqüência dependem do modelo
da ponteira.
16
Os osciloscópios podem ser analógicos ou digitais, normalmente com
uma ou duas entradas de sinal e que permitem a visualização dos canais
separadamente ou simultaneamente.
As funções mais comuns encontradas nos osciloscópios são:
CH1 – mostra apenas o sinal do canal 1.
CH2 – mostra apenas o sinal do canal 2 .
ALT – mostra alternadamente varreduras completas de cada um
dos canais. Para que a atlernância não seja perceptível a
varredura deve apresentar um período inferior a 1/n da
persistência da retina do olho humano, onde n é o número de
canais amostrados. Para dois canais, por exemplo, um período
equivalente a 50Hz é suficiente.
CHOP – a apresentação dos dois canais é efetuada em uma
única varredura completa do feixe de elétrons por partilha de
tempo. A comutação efetua-se a elevada freqüência, 100kHz, de
forma a garantir que a distância entre traços consecutivos seja
inferior ao diâmetro da mancha luminosa. Deste modo a
sequência de pequenos traços é percebida como uma linha
contínua. No entanto, se a freqüência de varredura for numa
freqüência mais baixa, pode-se observar um traço descontínuo.
ADD – mostra a soma dos sinais presentes nos canais 1 e 2.
Também encontramos em um osciloscópio botões para seleção de
escalas de tempo e de amplitude do sinal. O ajuste da escala de amplitude é
independente para cada um dos canais e o ajuste da escala de tempo é
comum aos dois canais, em alguns modelos de osciloscópios ainda podemos
ter essa seleção da escala de tempo em separado para cada um dos canais.
[6], [7] e [8].
2.1.2. USB
Diversas características, como sua velocidade de transmissão, sua
versatilidade, sua facilidade de uso e sua confiabilidade, fazem do USB uma
17
interface perfeita para efetuar comunicação com os mais diversos periféricos,
desde um mouse até uma câmera digital, inclusive permitindo a leigos instalar
o seu próprio periférico no seu computador pessoal.
2.1.2.1. Histórico
A versão 1.0 do padrão USB foi lançada em janeiro de 1996. No entanto,
ele só se tornou disponível para computadores pessoais com o lançamento da
versão “OEM Service Release 2” do Windows 95, no segundo semestre de
1996. O seu uso ainda era muito limitado, visto que não havia muitos
periféricos que utilizavam este barramento, e o suporte técnico desta versão
ainda possuía muitos erros. Por volta de 1998, a quantidade de periféricos
desenvolvidos com o padrão USB havia aumentado muito, e o lançamento do
Windows 98 e de sua versão subseqüente, o “Windows 98 Second Edition”,
que corrigiu alguns erros da anterior, permitiram que o USB se tornasse uma
interface bastante popular. Em setembro de 1998 foi lançada a versão 1.1 do
padrão USB. Ambas as versões (citadas em conjunto como USB 1.x) permitiam
duas velocidades, chamadas Low-Speed (1,5 Mbps) e Full-Speed (12 Mbps).
Com o aumento na popularidade do USB 1.x, tornou-se aparente a
necessidade de se aumentar a velocidade do barramento. Visto isso, foi
lançado em abril de 2000 a versão 2.0 do padrão USB, que introduziu uma
nova velocidade de transferência: Hi-Speed (480 Mbps). Este valor não foi
escolhido por acaso: pesquisas mostraram que para uma velocidade de
transmissão possibilitar compatibilidade reversa com as velocidades anteriores,
ela deveria ser 40 vezes maior do que a Full Speed. Esta nova velocidade
tornou o USB mais atrativo para periféricos como dispositivos de
armazenamento e impressoras.
Em dezembro de 2001, foi lançado um suplemento para o USB 2.0,
chamado USB On-The-Go, que permitiu a conexão direta entre periféricos, ao
contrário da implementação padrão, que exige a conexão do periférico a um
computador. E em maio de 2005, completou-se a especificação técnica de
outra extensão do USB, denominada Certified Wireless USB (ou,
18
simplesmente, Wireless USB), que permite que a transmissão USB seja
realizada sem fios. [2].
2.1.3. Wireless USB – WUSB
O WUSB utiliza formatos de pacotes definidos na subcamada MAC
(Media Access Control – Controle de Acesso ao Meio) da camada enlace.
Existem quatro tipos básicos de pacote utilizados neste protocolo:
Pacotes MMC (Micro-scheduled Management Command –
Comando de Gerenciamento Microescalonado): são pacotes de
controle da transmissão de rádio. Estes pacotes endereçam todos
os dispositivos da rede WUSB e são transmitidos utilizando
encapsulamento seguro de pacotes. Devem ser transmitidos
sempre pelo host da rede e à taxa de bits mais confiável do
protocolo, que é a taxa básica de sinalização da camada física.
Pacotes de dados: estes pacotes podem ser transmitidos tanto
por um host como por um dispositivo e carregam dados
específicos da aplicação. Podem ser transmitidos a qualquer taxa
de bits que seja permitida pela implementação.
Pacotes de “handshake”: são pacotes pequenos que indicam
sucesso das transações. Transmitidos sempre pelos dispositivos
da rede WUSB, são parte importante do protocolo, e por isso
devem ser transmitidos, assim como os pacotes MMC, à taxa de
bits mais confiável do mesmo.
Pacotes de notificação: podem ser transmitidos apenas por
dispositivos e são utilizados para carregar informações de
notificação específicas para o host. [2].
2.1.4. Principais características do USB
19
O USB tem como principais características as seguintes:
O computador atua como um host.
Podem ser conectados ao host até 127 dispositivos, diretamente
ou através de hubs USB.
Cabos individuais USB podem ter até 5 metros; com hubs, os
dispositivos podem ficar até 30 metros de distância do host (o
equivalente a seis cabos).
Com o USB 2.0, o barramento possui uma taxa máxima de
transferência de dados de 480 Mbps.
Um cabo USB possui dois fios para energia (+5 volts e o fio terra)
e um par trançado para a condução dos dados.
Nos cabos de energia, o computador poderá fornecer até 500 mA
de energia a 5 volts.
Os dispositivos de baixa-potência (como o mouse) poderão puxar
a energia diretamente do barramento. Os dispositivos de alta-
potência (como impressoras) possuem fonte própria de
alimentação e exigem mínima energia do barramento. Os hubs
podem ter suas próprias fontes de energia para fornecer energia
aos dispositivos conectados a ele.
Os dispositivos USB são hot-swappable (conectáveis "a quente"),
ou seja, podem ser conectados e desconectados a qualquer
momento.
Os diversos dispositivos USB podem ser colocados no modo
sleep (hibernar) pelo computador host, quando o computador
entrar no modo de economia de energia. [2], [3], [4] e [5].
2.1.5. Topologia USB
O barramento USB possui uma topologia da forma de estrela em
camadas (tiered star). Neste tipo de topologia, um único PC (root) pode se
conectar a vários periféricos (partes que provêem funções ao sistema) e ainda,
20
a hubs (pontos de conexão, definidos como uma classe especial de
dispositivos no USB), que por sua vez conectam outros periféricos.
No centro de cada estrela, há um hub e cada ponto é um dispositivo que
se conecta a uma porta de um hub. Um hub típico pode possuir 2, 4 ou 7
portas. Um dispositivo (periférico) pode ainda ser um dispositivo composto,
contendo um periférico e um hub (por exemplo, uma impressora conectada a
um host PC pode possuir portas USB, para que possamos “plugar” um cabo
para imprimir fotos diretamente de uma câmera digital ou ainda conectar outros
dispositivos). A cada dispositivo composto na rede é designado um endereço
único.
Figura 1 – Topologia USBFonte: http://www.pads.ufrj.br/~rapoport/usb/usb4.html
No USB, o host inicia uma transmissão de dados através dos
dispositivos conectados a ele através da alocação de slots de tempo a cada
dispositivo (Time division Multiplexing - TDM). As conexões entre um host e um
dispositivo lógico são ponto-a-ponto e dirigidas do host para o dispositivo. Além
disso, um host no USB pode fazer conexões lógicas com até 127 dispositivos.
O Wireless USB possui topologia semelhante ao do USB cabeado, onde
a diferença principal entre as duas é a ausência de hubs na não-cabeada. [2] e
[3].
21
Figura 2 – Topologia do Wireless USBFonte: site http://www.gta.ufrj.br/grad/07_1/wusb/TopologiadoUSB.html
2.1.6. Tipos de conectores e adaptadores USB
2.1.6.1. Conectores
Figura 3 – Tipos de Conectores USBFonte: site http://www.gdhpress.com.br/hardware/leia/index.php?p=cap3-18
22
Figura 4 – Tipos de Conectores USBFonte: site http://www.intel.com/support/pt/motherboards/desktop/sb/CS-023466.htm
Figura 5 – Tipos de Conectores USBFonte: site http://eletronline.blogspot.com/2009/02/universal-serial-bus-usb.html
23
2.1.6.2. Adaptadores
Figura 6 – Tipos de Adaptadores USBFonte: site https://loja.tray.com.br/adm/editor/up/108972/1499_g.jpg
Figura 7 – Tipos de Adaptadores USBFonte: site www.atera.com.br/figuras/kitusb1399.GIF
24
Figura 8 – Tipos de Adaptadores USBFonte: site http://www.gdhpress.com.br/hardware/leia/cap3-18_html_67a5b903.jpg
2.1.7. Cabo USB
O cabo USB é um cabo blindado que possui que possui internamente
outros quatro cabos, como na figura a seguir:
Figura 9 – Corte Transversal do Cabo USBFonte: site http://www.laercio.com.br/artigos/hardware/hard-051/hard-051c.htm
25
Os cabos USB possuem no seu interior, 2 pares de fios. Um par é
trançado e formado por fios branco e verde ou, em alguns modelos, amarelo e
azul. Através desses dois fios trafegam os dados, no formato serial. Esses dois
sinais formam o que chamamos de par diferencial. Ao invés de ter um fio de
terra e outro de sinal, os dois levam o mesmo sinal, mas com polaridades
invertidas, portanto são chamados de D+ e D–. A vantagem do par diferencial
é a alta imunidade a ruídos elétricos e interferências em geral.
O cabo possui ainda os fios V+ (vermelho) e GND (preto ou marrom) em
cada segmento para distribuir energia aos dispositivos. V+ é nominalmente +5
V na fonte. Envolvendo esses dois pares de fios temos uma camada formada
por uma folha de alumínio e uma blindagem externa, formada por uma malha
de cobre. Envolvendo tudo temos uma camada protetora de plástico.
O USB permite a utilização de segmentos de cabo variáveis de 0,5
metros até 5 metros, escolhendo-se um padrão adequado de condutores. Para
fornecer níveis de tensão de entradas garantidos e impedâncias apropriadas
nas terminações, são utilizadas terminações parciais no fim da cada cabo.
Estas terminações permitem a detecção da conexão e remoção em cada porta
e a diferenciação entre dispositivos de alta e baixa velocidade. [3], [4] e [5].
2.1.8. Host USB
Existe apenas um host num sistema USB. A interface USB para o
sistema do computador hospedeiro refere-se ao controlador do mesmo. O
controlador do host pode ser implementado em combinação de hardware e
software.
O host USB interage com os dispositivos através do controlador do
mesmo. O host é responsável por:
Detectar a conexão e remoção de dispositivos USB.
Gerenciar o fluxo de controle e de dados entre ele e os
periféricos.
Coletar estatísticas de atividades e estado.
26
Fornecer alimentação aos dispositivos conectados.
O software do sistema USB no host gerencia interações entre
dispositivos USB e o software do dispositivo instalado no próprio hospedeiro.
Existem cinco áreas de interação entre o software do sistema USB e o
software do dispositivo:
Enumeração e configuração do dispositivo.
Transferências isossíncronas de dados.
Transferências assíncronas de dados.
Gerenciamento de energia.
Gerenciamento de informações de barramentos e dispositivos.
Sempre que possível, o software do sistema usa interfaces existentes
no host para gerenciar as interações acima. [3].
2.1.9. Protocolo USB
O USB é um barramento receptor (ou de contagem). O controlador do
host inicia todas as transferências de dados.
Todas as transações do barramento envolvem a transmissão de até três
pacotes. Cada transação se inicia quando o controlador do host envia um
pacote USB descrevendo o tipo e a direção da transação, o endereço do
dispositivo USB e o número do ponto final (endpoint). O ponto final de um
dispositivo é a única porção endereçável deste que é a fonte de informação em
um fluxo de comunicações entre o host e o próprio. O número de endpoint é
um valor de 4 bits entre 0(hex) e F(hex), inclusive, associado a um ponto final
de um periférico USB.
Este primeiro pacote é conhecido como "pacote de sinal" (token packet).
O dispositivo USB, que é endereçado, seleciona a si mesmo pela
decodificação do endereço apropriado. Em uma dada transação, dados são
transferidos do host para o dispositivo ou vice-versa. A direção da transferência
é especificada no token packet. A fonte da transação envia então um pacote de
dados ou indica que não há mais dados para serem transferidos. O
27
destinatário, em geral, responde com um "pacote aperto de mão" (handshake
packet), indicando o sucesso da transferência.
O modelo para transferências de dados entre a fonte ou um destino no
host e um ponto final de um dispositivo é conhecido como pipe (tubo ou canal).
Existem dois tipos de pipe: correntes (stream) e mensagens (message).
Uma corrente de dados não possui uma estrutura USB definida,
enquanto as mensagens possuem.
Além disto, os tubos possuem associações com as bandas de
transmissão de dados, tipos de serviços de transferência e características de
endpoint, como direção e tamanho de buffer. A maioria dos tubos passa a
existir quando um dispositivo é configurado. Uma mensagem de pipe, “default
control pipe”, sempre existe enquanto o dispositivo está sendo alimentado, para
que possa fornecer acesso às configurações, informações de controle e status
deste.
A listagem das transações permite o controle do fluxo para várias
correntes de tubos (stream pipes). O mecanismo de controle de fluxo permite a
construção de listas flexíveis, que acomodam serviços concorrentes de
misturas heterogêneas de stream pipes. Múltiplas correntes de pipes podem
ser servidas em diferentes intervalos e com pacotes de diferentes tamanhos.
[3].
2.1.10. Enumeração
A enumeração é a atividade que identifica e atribui endereços únicos
para os dispositivos ligados ao barramento. Por permitir a conexão e remoção
de dispositivos em qualquer instante de tempo, a enumeração é uma atividade
ininterrupta para o software do sistema.
Além disso, a enumeração também inclui a detecção e o processo de
remoção de periféricos. [3].
28
2.1.11. Modelo de fluxo de dados
O barramento suporta dados funcionais e substituição de controles entre
o host e periféricos, assim também como um conjunto de pipes unidirecionais
ou bidirecionais. As transferências de dados realizam-se entre o software do
host e um endpoint particular em um dispositivo USB. Algumas destas
associações é que são chamadas de pipes (tubos ou canais). Geralmente, o
movimento de dados através de um tubo é independente do fluxo de dados em
outro tubo.
Um dado dispositivo USB deve possuir vários endpoints. Por exemplo, o
dispositivo deve ter um ponto final que suporte um tubo transportando dados
para o dispositivo e outro que suporte o transporte de dados no sentido
contrário.
Na arquitetura USB são quatro tipos básicos de transferências de dados:
Transferência de Controle: Usada para configurar um dispositivo no
instante de sua conexão e pode ser usada para outros propósitos
específicos, incluindo controle de outros pipes no dispositivo.
Transferência de Volume de Dados: Gerada e consumida em grandes
quantidades e simultaneamente, sem restrição de tempo. Possui uma
ampla e dinâmica latitude em transmissões de reserva. Este tipo de
dado é seqüencial. A largura das bandas de transmissão para este tipo
de transferência de dados pode variar dependendo de outras atividades
concorrentes do barramento. É um tipo de transmissão que assegura a
integridade dos dados, mas não a velocidade de transmissão.
Transferências de Dados por Interrupção: Usada para caracteres ou
coordenadas com percepções humanas ou características de respostas
regenerativas. Alguns dados podem ser apresentados para
transferências por um dispositivo em qualquer instante e é distribuída
pelo USB a uma taxa nunca mais lenta quanto a especificada pelo
dispositivo.
Transferência Isossíncronas de Dados: Fluxo de dados constantes em
intervalos equivalentes. Ocupa uma quantidade pré-negociável da banda
de transmissão do barramento, com a distribuição de pulsos. Chamada
29
também de transferência de correntes em tempo real (streaming real-
time transfers). [3].
2.1.11.1. Transferência de controle
Dados de controle são usados pelo software de sistema do USB para
configurar os dispositivos durante a primeira conexão destes. Outros drivers
podem ser escolhidos para utilizar transferências de controle em
implementações específicas. A distribuição de dados é perdida. [3].
2.1.11.2. Transferência do tipo bulk
Volume de dados, tipicamente, consiste em grandes quantidades destes,
assim como os usados em impressoras e scanners. Este tipo de dado é
seqüencial. Trocas de dados confiáveis são asseguradas por hardware
utilizando a detecção de erros do próprio. Vale lembrar também que a largura
das bandas de transmissão para este tipo de transferência de dados pode
variar dependendo de outras atividades concorrentes do barramento. É um tipo
de transmissão que assegura a integridade dos dados, mas não a velocidade
de transmissão. Esta é apenas garantida pelo melhor esforço, isto é, caso haja
possibilidade de transmissão mais rápida, esta será feita. [3].
2.1.11.3. Transferência de interrupção
Uma transferência pequena e limitada de, ou para, um dispositivo é
chamada de interrupção. Alguns dados podem ser apresentados para
transferências por um dispositivo em qualquer instante, e é distribuída pelo
USB a uma taxa nunca mais lenta quanto a especificada pelo dispositivo.
Dados de interrupção consistem tipicamente de notificações de eventos,
caracteres ou coordenadas que são organizadas com um ou mais bytes. [3].
30
2.1.11.4. Transferência isossíncrona
Dados isossíncronos são contínuos e em tempo real na sua criação e
distribuição. Informações relacionadas ao sincronismo são sugeridas pela taxa
fixa em que cada dado isossíncrono é recebido e transferido.
Este tipo de dado deve ser distribuído de acordo com a taxa de recepção
para que o seu sincronismo seja mantido. Além disso, a taxa de distribuição
deve ser sensível a atrasos nesta atividade. Para pipes isossíncronos a banda
de transmissão se baseia em amostras características das funções associadas.
Um exemplo típico de dado isossíncrono é a voz. Caso a taxa de
distribuição destes dados não seja mantida, irão ocorrer "saltos" na corrente de
dados. Ainda se o dado é distribuído na taxa apropriada pelo hardware USB,
atrasos de distribuição introduzidos por software podem degradar aplicações
que necessitam de transmissões em tempo real, como telefonia e áudio
conferências.
Correntes isossíncronas de dados são alocados em uma determinada
porção da banda de transmissão para assegurar que os dados serão
distribuídos na taxa desejada. [3].
2.1.12. Dispositivos USB
Dispositivos USB são divididos em diversas classes. Estes componentes
são necessários para carregar informações, auto-identificação e configurações
genéricas.
2.1.12.1. Caracterização de dispositivos
Todos os dispositivos USB são acessados por um endereço atribuído
durante sua conexão e enumeração. Cada componente adicionado suporta um
31
ou mais pipes, através dos quais o host pode se comunicar com os
componentes. Todo componente USB suporta um canal especialmente
designado no ponto final zero para que seja incluído o canal de controle
(control pipe). Através deste pipe de controle, dispositivos USB suportam um
mecanismo de acesso comum para obter informações.
O canal de controle no endpoint zero é a informação necessária para
descrever completamente o dispositivo USB. A informação é dividida em três
categorias:
Standard: A definição é comum para todos os periféricos USB e inclui
itens como a identificação do vendedor, classe do dispositivo e o
gerenciamento de alimentação. Configurações, interface e descrições de
endpoint dos dispositivos carregam informações relacionadas sobre o
mesmo.
Class: A definição desta informação varia, dependendo das classes de
dispositivos.
Vendedores USB: O vendedor de dispositivos USB é livre para adicionar
qualquer informação desejada. [3].
2.1.12.2. Descrição dos dispositivos
Existem duas classes majoritárias de dispositivos: hubs e funções.
Somente os hubs possuem a característica de fornecer pontos adicionais de
conexão ao barramento. Funções propiciam um aumento de capacidade ao
host.
2.1.12.2.1. Hubs
Hubs são elementos chave na arquitetura plug and play do USB e
servem para simplificar a conectividade de acordo com as perspectivas dos
usuários, além de oferecer segurança a baixo custo e complexidade.
Fios concentrados constituem os hubs. Estes por sua vez ativam as
características de conexão do USB. Pontos de conexão são chamados de
32
portas. Cada hub converte um simples ponto de conexão em vários outros. A
arquitetura suporta a concatenação de hubs.
A porta principal (upstream port) de um hub o conecta como o host.
Cada porta secundária (downstream port) permite a conexão de outro hub ou
função.
Os hubs podem detectar a conexão e a remoção de um dispositivo, tanto
de baixa quanto de alta velocidade, nas portas secundárias, além de distribuir
energia para estes.
Duas partes constituem um hub: o controlador e o repetidor. Este último
é um protocolo de mudança controlado entre as portas secundárias e a
primária. Também possui suporte de hardware para reiniciar e suspender a
transmissão de sinais. O controlador do host propicia aos registradores da
interface permitir a comunicação de, ou, para o host. Comandos de controle e
estados específicos permitem ao host configurar um hub, além de monitorar e
controlar as suas portas. [3].
Figura 10 – Modelo de Hub USBFonte: site http://www.pads.ufrj.br/~rapoport/usb/usb4.html
2.1.12.2.2. Funções
Uma função é um dispositivo que é capaz de transmitir ou receber dados
ou informações de controle do barramento, estando conectado, por um cabo, a
uma porta ou hub. Além disso, um pacote físico pode conter funções múltiplas
e possuir hosts embutidos. Estes são conhecidos como dispositivos compostos
e aparecem para o host como um hub com um ou mais dispositivos não-
removíveis.
33
Cada função contém informações de configurações que descrevem suas
capacitações e recursos exigidos. Antes de poder utilizar uma função, o host
deve configurá-la Esta configuração inclui a alocação da banda de transmissão
e a seleção das opções específicas para a configuração da função.
Abaixo seguem alguns exemplos de funções:
Um dispositivo localizador, como um mouse.
Um dispositivo de entrada, como um teclado.
Um dispositivo de saída, como uma impressora.
Um adaptador de telefonia, como um ISDN. [3].
2.1.13. Digitalização de sinais
Para digitalizar um sinal, precisamos de uma base de tempo e um
Conversor Analógico Digital (CAD), que forneça uma aproximação digital do
sinal original, como mostrado na figura 11. A aproximação digital é registrada
em “n” bits e a variação de amplitude do sinal digitalizado pode ser reduzida
para uma resolução de, no máximo, uma parte de 2n.
Exemplo: para um conversor de 8 bits que pode converter sinais
analógicos entre 0V e 5V, a resolução do conversor A/D é dada pelo valor
máximo do sinal analógico dividido pelo valor máximo de combinações de bits.
Neste caso a resolução seria 5 dividido por 28, o que resultaria numa resolução
de 0,01953125V ou 19,53125mV.
A base de tempo determina a velocidade com que podemos amostrar a
forma de onda e varia com o tipo de CAD. Em geral, quanto maior for o número
de bits, mais lento é o dispositivo.
O bit mais significativo (MSB) é o que registra a maior variação de
tensão, e o bit menos significativo (LSB) registra a menor variação de tensão.
[1], [9] e [10].
34
Figura 11 – Conversor Analógico DigitalFonte: site http://www.universiabrasil.net/mit/6/6071/PDF/f02-lec20a_val.pdf
2.1.14. Amplificação de sinais
Como os sinais analisados podem assumir amplitudes muito baixas, da
ordem de mili ou micro-volts, neste projeto é usado um amplificador de sinais, o
TL072, responsável por amplificar o sinal amostrado para valores adequados à
análise.
A amplificação do sinal depende do ganho do amplificador operacional, e
este ganho é regulado através do valor do resistor R2.
Figura 12 – Circuito Básico de um AmpOpFonte: Datasheet do componente TL072
35
3. ARQUITETURA DO PROTÓTIPO
A arquitetura definida para este protótipo foi a de um microcontrolador
com comunicação via USB e conversor analógico/digital internos.
Para a placa foi definido o layout de apenas uma face de trilhas.
Na arquitetura do microcontrolador com conversor analógico/digital
interno, o microcontrolador é o responsável em converter o sinal analógico
capturado por qualquer uma das entradas do dispositivo em digital. Como a
amplitude do sinal capturado pode ser variável, é usado um amplificador para
cada entrada do dispositivo, com ganho variável ajustado pelo
microcontrolador. O ganho é definido através de seleção feita pelo usuário no
software, esta seleção gera um sinal que vai do PIC para o multiplexador,
selecionando o resistor correspondente ao ajuste de escala desejado, e este
resistor por sua vez, é quem define o ganho do amplificador.
A comunicação e o envio de sinais entre o dispositivo e o computador
são feitos através da comunicação USB do microcontrolador com o
computador.
Figura 13: Diagrama do dispositivo com comunicação USB e conversor analógico/digital
Fonte: ttcsope
36
Figura 14: Diagrama de blocos do conversor analógico/digitalFonte: Datasheet do microcontrolador PIC18F2550
3.1. Análise dos Principais Componentes do Circuito
Os principais componentes deste circuito, e que serão analisados a
seguir, são:
Microcontrolador
Multiplexador
Amplificador Operacional
37
3.1.1. Escolha do microcontrolador
Foram analisados microcontroladores dos fabricantes ATMEL,
MICROCHIP e TEXAS INSTRUMENTS. As pesquisas foram feitas através das
ferramentas de auxílio para verificação de modelos disponíveis no site de cada
fabricante, nestas ferramentas coloca-se os dados que interessam para o
projeto e a ferramenta mostra o que o respectivo fabricante tem que possua as
características desejadas.
No site da ATMEL encontra-se o microcontrolador AT91CAP7E
Características principais:
256 kbytes de memória ROM interna 160 kbytes de memória SRAM interna USB 2.0 Conversor analógico/digital de 10-bits Clock variável de 8 a 16 MHz Programação “in circuit” Encapsulamento LFBGA com 225 pinos
No site da TEXAS INTRUMENTS não foi obtido nenhum
microcontrolador que apresentasse as características desejadas (USB e CAD).
Já no site da MICROCHIP foram encontradas 2 opções de
microcontroladores, PIC18F2550 e PIC18F4550, ambos continham as
principais características desejadas, comunicação via USB e conversor
analógico/digital.
Características principais:
- PIC18F2550:
USB 2.0 Clock variável de 8 a 48 MHz Conversor analógico/digital de 10-bits Programação “in circuit” 32 kbytes de memória FLASH 2048 bytes de memória SRAM
38
256 bytes de memória EEPROM 24 portas de entrada/saída Encapsulamentos PDIP e SOIC de 28 pinos
- PIC18F4550:
USB 2.0 Clock variável de 8 a 48 MHz Conversor analógico/digital de 10-bits Programação “in circuit” 32 kbytes de memória FLASH 2048 bytes de memória SRAM 256 bytes de memória EEPROM 35 portas de entrada/saída Encapsulamentos PDIP de 40 pinos e TQFP e QFN de 44
pinos
Dentre estes citados foi escolhido o PIC18F2550, pois além de ter as
características desejadas, dois exemplares foram emprestados à equipe pelo
engenheiro Jefferson Chochi Zembovici da empresa HENRY. Posteriormente
foi conseguido o contato de um distribuidor MICROCHIP em São Paulo, Bevian
comercial e importadora LTDA, com quem, entrando em contato, foram
conseguidas amostras do componente, sendo pago apenas as despesas de
envio. Duas amostras do componente com encapsulamento DIP e duas em
SMD foram enviadas pelo distribuidor, com isso, um total de seis
microcontroladores ficaram à disposição da equipe para que esta pudesse
fazer testes com diferentes programações e para possível reposição, backup,
em caso de queima de algum dos microcontroladores.
3.1.2. Escolha do multiplexador
Os multiplexadores analisados para o projeto são todos da empresa
MAXIM. Os modelos analisados foram o MAX308, MAX4638 e MAX4051,
todos com oito portas multiplexáveis.
O motivo da escolha destes componentes do referido fabricante foi o fato
de que este enviaria amostras dos componentes sem custo algum.
39
Características principais:
- MAX308:
8 canais multiplexados Compatível com lógica TTL e CMOS Resistência de canal menor que 5omhs Proteção contra descarga eletrostática maior que 2000 V Tempo de chaveamento
o Ton = 100nso Toff = 75ns
- MAX4638:
8 canais multiplexados Compatível com lógica TTL e CMOS Resistência de canal de 0,4 ohms Tempo de chaveamento
o Ton = 18nso Toff = 7ns
- MAX4051:
8 canais multiplexados Compatível com lógica TTL e CMOS Resistência máxima de canal de 12 omhs Tempo de chaveamento
o Ton = 50nso Toff = 40ns
Para usar no projeto restaram duas opções, o MAX4638 e o MAX4051,
pois foram estes os modelos enviados pelo fabricante, ambos em SMD.
A escolha do componente usado no dispositivo, MAX4638, foi devido a
este possuir menor tempo de chaveamento e menor resistência de canal.
3.1.3. Escolha do amplificador operacional
O amplificador operacional utilizado no dispositivo é o TL072 da TEXAS
INSTRUMENTS, este componente foi escolhido pelo fato de que a equipe já
possuía o componente, reduzindo assim despesas com componente e
otimizando os custos do projeto.
40
Características principais:
Dual AmpOp Baixo ruído Proteção contra curto-circuito na saída Baixa distorção harmônica total (0,003% típico) Alta impedância de entrada (JFET) Slew rate típico = 13 V/us
3.2. HARDWARE
Para o hardware decidiu-se usar placa com apenas uma face,
componentes discretos e circuitos integrados com encapsulamento DIP, isto
pelo motivo de que era de interesse da equipe confeccionar a placa.
3.2.1. Desenvolvimento do Dispositivo
O circuito foi desenhado, esquemático e layout das trilhas, no software
EAGLE V.5.5.0 que é disponibilizado gratuitamente através do site do
fabricante (www.cadsoft.de).
O diagrama elétrico do circuito foi feito com base nos datasheets dos
componentes, no trabalho de final de curso usado de base para este e em
conversas entre os membros da equipe.
A placa foi planejada de tal forma que se pudesse testar os principais
componentes separadamente, por meio de jumpers, com os quais consegue-se
“bypassar” alguns CI’s e com isso testar cada parte do circuito. Também foram
usados soquetes para todos os CI’s, o que facilita caso algum deles venha a
dar problema.
A placa foi feita de modo artesanal, usando o sistema de transfer,
impressão a laser em papel poliéster e transferido para a placa por processo
térmico, com o auxílio de um ferro de passar roupas comum.
41
3.2.2. Fotos da Placa
Para confecção do circuito forma usadas placas de fibra de face única,
na figura 15 pode-se ver o aspecto das trilhas do circuito, e na sequência, na
figura 16, pode-se ver como ficou a distribuição dos componentes sobre a
placa.
Figura 15 – Layout das TrilhasFonte: Autoria Própria
42
Figura 16 – Layout dos ComponentesFonte: Autoria Própria
3.2.3. Correções do Circuito
Algumas correções foram necessárias no hardware do dispositivo para
que este pudesse captar sinais positivos e negativos.
Fazendo testes e analisando o circuito foi visto que este apenas
funcionaria para sinais positivos, então foi acrescentado uma nova placa para
tratamento de sinal ao dispositivo e uma fonte externa para que se obtivesse
alimentação negativa, desta forma conseguiu-se fazer com que o dispositivo
funcionasse tanto para sinais positivos como para sinais negativos.
43
3.2.4. Fotos das Placas para Correção do Circuito
A fonte foi montada em uma caixa plástica, externa à do dispositivo de
captura de sinais, enquanto a placa para tratamento de sinal foi colocada
juntamente com as outras partes, na caixa do dispositivo.
Figura 17 – Layout das Trilhas das Placas de CorreçãoFonte: Autoria Própria
44
Figura 18 – Layout dos Componentes das Placas de CorreçãoFonte: Autoria Própria
3.2.5. Aspecto Final do Dispositivo
O dispositivo foi montado em uma caixa de alumínio com dimensões de
18cm x 12cm x 9cm, após tratamento da superfície metálica a caixa foi pintada
com tinta spray. Para dar o acabamento final ao protótipo foram usados
adesivos impressos aplicados por sobre a caixa, e a seguir vemos as imagens
da montagem e do aspecto final do dispositivo.
45
Figura 19 – Protótipo no Montado no Interior da CaixaFonte: Autoria Própria
Figura 20 – Vista Superior da CaixaFonte: Autoria Própria
46
Figura 21 – Vista Superior Esquerda da CaixaFonte: Autoria Própria
Figura 22 – Vista Superior Direita da CaixaFonte: Autoria Própria
47
3.2.6. Relação de Componentes
3.2.6.1. ResistoresRESISTOR VALOR
R1 1kΩ
R2, R21, R22 10kΩ
R10, R18 47kΩ
R9, R17 100kΩ
R8, R16 200kΩ
R7, R15 470kΩ
R6, R14, R19, R20, R23, R24 1MΩ
R5, R13 2,2MΩ
R4, R12 4,7MΩ
R3, R11 10MΩ
Quadro 1: Relação de Resistores UtilizadosFonte: Autoria Própria
3.2.6.2. CapacitoresCAPACITOR VALOR
C3, C4 15pF
C2 470nF
C1, C6, C7, C8, C9 100nF
C10, C11 22nF
C5, C12 10µF
Quadro 2: Relação de Capacitores UtilizadosFonte: Autoria Própria
48
3.2.6.3. Circuitos integradosCIRCUITO INTEGRADO CÓDIGO
UC1 PIC18F2551
IC1, IC2 MAX4638
IC3 TL072
Quadro 3: Relação de Circuitos Integrados UtilizadosFonte: Autoria Própria
3.2.6.4. Outros componentesXTAL1 20MHz
CON1, CON2 Conector KK 5 vias – 5045-5
CON3 Conector USB
CON4, CON5 Conector BNC
JP1, JP2, JP3 Barra com 3 pinos
JP4, JP5 Barra com 2 pinos
Quadro 4: Relação dos Demais Componentes UtilizadosFonte: Autoria Própria
3.2.7. FIRMWARE
49
Firmware é o conjunto de instruções operacionais programadas
diretamente no hardware de um equipamento eletrônico. Nesse projeto foi
necessário desenvolver e compilar o programa com as instruções específicas
ao microcontrolador PIC 18F2550.
3.2.7.1. Compilador Usado
O microcontrolador escolhido foi o microchip PIC 18F2550. Para esse
modelo existem diversos compiladores como o próprio MPLAB em conjunto
com o Microchip C18, porém decidimos utilizar o software PCWHD 4.084, da
empresa CCS (Custom Computer Service), que faz a compilação em
linguagem C. O principal motivo foi à grande quantidade de funções e rotinas
pré-programadas dedicadas a microcontroladores da família PIC, bem como a
facilidade na interface de programação.
Figura 23 – Tela de interface do PCWHDFonte: Autoria Própria
3.2.7.2. Programador Usado
50
Existem muito gravadores de PIC dedicados. Para facilitar os testes em
nosso protótipo, nos baseamos no circuito utilizado no gravador “PICPlus” que
realiza a gravação pelo método ICSP (In-Circuit Serial Programming™). Este
programador não necessita de fonte de alimentação externa, aproveitando o
recurso existente no microcontrolador de programação em baixa tensão (LVP).
A questão da programação do microcontrolador foi previamente estudada,
sendo implementada no protótipo de tal forma que com a mudança de um
jumper, é possível conectar o circuito do “PICPlus” modificado e realizar a
programação do PIC.
Figura 241 - Esquema Eletrônico do Programador Fonte: site http://www.jdm.homepage.dk/newpic.htm
3.2.7.3. Foto do Programador
Figura 25 – Gravador do PICFonte: Autoria Própria
51
Utilizamos o software livre PICPgm versão 1.0.1.5 para realizar a
gravação do firmware no PIC. Esse programa reconhece automaticamente o
programador PICPlus e até mesmo o modelo de microcontrolador utilizado.
Figura 26 – Tela de interface do PICPgm Develop. Programmer V1.0.1.5Fonte: Autoria Própria
3.2.7.4. Programação do Microcontrolador
Antes de iniciar a programação do firmware, precisa-se ter conhecimento
pleno nos seguintes aspectos:
Funções desempenhadas pelo microcontrolador;
Quais portas de entradas e saídas serão utilizadas, bem como as
funções de cada uma;
Freqüência do cristal utilizado;
Registradores necessários para o modelo de PIC escolhido;
Fluxograma com a lógica de programação
52
Figura 27 - Microcontrolador 18F2550 Fonte: Datasheet Microchip – 18F2550
O quadro 5 mostra as funções dos pinos utilizados no PIC18F2550.
Pino Função Descrição
1MCRL Entrada de reset, em nível baixo reseta o sistemaVpp Entrada de tensão da programação
2 AN0 Entrada analógica 03 AN1 Entrada analógica 14 RA2 Saída Digital A0 para controle do MUX15 RA3 Saída Digital A2 para controle do MUX26 RA4 Saída Digital A1 para controle do MUX27 RA5 Saída Digital A0 para controle do MUX28 Vss Referência à terra para a lógica e os pinos de i/o9 OSC1 Entrada do oscilador de cristal 20MHz
10 OSC2 Conecta o cristal 20MHz ou ressonador 11 RC0 Saída Digital A2 para controle do MUX112 RC1 Saída Digital A1 para controle do MUX114 Vusb Regulador de tensão interno do USB 3.3V15 D - Linha diferencial negativa do USB (input/output)16 D+ Linha diferencial positiva do USB (input/output)19 Vss Referência à terra para a lógica e os pinos de i/o20 Vdd Fonte positiva para a lógica e os pinos de i/o21 RB0 Saída Digital22 RB1 Saída Digital23 RB2 Saída Digital24 RB3 Saída Digital25 RB4 Saída Digital26 PGM Pino que permite a programação em baixa tensão ICSP27 PGC Clock de programação ICSP
53
28 PGD Pino de dados da programação ICSPQuadro 5 – Pinos Utilizados no PIC
Fonte: Autoria Própria
Abaixo vemos o fluxograma completo do firmware.
3.2.7.5. Fluxograma
Figura 28 – Fluxograma do FirmwareFonte: Autoria Própria
De acordo com as necessidades de utilização no projeto, os principais
registradores configurados foram os relacionados às definições de clock
(CONFIG1L, CONFIG1H, OSCCON), USB (UCON, UCFG, USTAT, UADDR,
UFRMH:UFRML), Serial (SSPSTAT, SSPCON1) e na configuração de portas
como entrada e saída (TRISA, TRISB, TRISC).
54
3.2.7.6. Descrição do Firmware
Com o software PCWHD, baseado em linguagem “C”, foi compilado o
firmware. Os principais comando serão mostrados abaixo:
#include <18F2550.h>Realiza a chamada do arquivo de definição de todos os
registradores endereçados para o 18F2550, existente no banco de
dados do compilador CCS.
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN
Configura vários registradores do microcontrolador,
principalmente aos que diz respeito ao oscilador.
HSPLL - oscilador de cristal de alta freqüência com PLL
habilitado.
NOWDT - watchdog desabilitado.
NOPROTECT - proteção de código desabilitada.
LVP – programação em baixa tensão habilitada.
DEBUG - RB6 e RB7 dedicados para In Circuit Debug
USBDIV - clock USB do 96MHz PLL/2
PLL5 - cristal de 20MHz PLL prescaler /5
CPUDIV1 - clock do núcleo 96MHz PLL/2
VREGEN - regulador interno de tensão USB habilitado
#define USB_EP1_TX_ENABLE USB_ENABLE_BULK#define USB_EP1_RX_ENABLE USB_ENABLE_BULK
Ativa o Endpoint1 para as transferências IN e OUT Bulk/Interrupt
#define USB_EP1_TX_SIZE 64#define USB_EP1_RX_SIZE 3
55
Determina o tamanho de 64 e 3 bytes reservado para o Buffer Tx
e RX, respectivamente, do Endpoint1.
#include <pic18_usb.h>
#include <PicUSB.h>
#include <usb.c>
Inclui as bibliotecas de configuração da USB e descritores,
existentes no banco de dados do compilador CCS para o hardware da
família PIC18.
set_tris_a(0b00000011);set_tris_b(0b00000000);set_tris_a(0b00000000);setup_adc_ports(AN0_TO_AN1)
Configura apenas as portas A0 e A1 como entrada analógica, as
demais como saída digital.
usb_init()usb_task()usb_wait_for_enumeration()
Inicia, habilita os periféricos e interrupções e aguarda o PIC ser
enumerado pelo sistema operacional.
for (i=1;i<TXSIZE;i+=2) set_adc_channel(1); delay_us(10); txdata[i]=read_adc(); set_adc_channel(0); delay_us(10); txdata[i+1]=read_adc();
usb_puts(1,txdata,TXSIZE,USB_DTS_TOGGLE);
Rotina de leitura das entradas analógicas e envio para o
computador através da porta de comunicação USB.
56
3.2.8. SOFTWARE
Foi desenvolvido um software de interface gráfica para funcionar na
plataforma Windows cuja função é a visualização das diversas formas de
ondas capturadas pelo dispositivo, bem como ajustes de escalas e controle das
saídas digitais.
3.2.8.1. Software Usado
A programação de interface gráfica foi desenvolvida no Borland Delphi
Second Edition versão 7.2, onde utiliza linguagem Pascal orientada a objeto.
Optou-se por utilizar esse software devido a ampla variedade de
recursos que desejava-se utilizar, como desenhos de gráficos incluindo
ferramentas de auxilio como o DirectX, barras de sliders, check box,
processamento paralelo, entre outros recursos disponíveis.
Figura 29 – Tela de interface gráfica do Borland Delphi Second Edition versão 7.2Fonte: Autoria Própria
57
3.2.8.2. Estrutura do Código
Cada objeto colocado na janela “Form” é dotado de propriedades que
permite configurar o mesmo. Com exceção do gráfico, todos os demais
componentes possuem algum tipo de evento, como clicar, marcar, arrastar e
segurar. Baseados nestes eventos criou-se o programa na janela de
codificação.
Como o Delphi permite processamento paralelo, dois principais rotinas
ficavam continuamente em loop infinito. A primeira é o processamento de
eventos da janela principal e a segunda era a captura de pacotes dos sinais
analógicos que o PIC enviava.
Para facilitar o entendimento lógico da programação, o código foi
dividido em Main (principal), USB (comunicação) e Draw (desenho do gráfico).
A seguir são apresentadas as principais partes da rotina com
comentários dos pontos mais importantes. Os comandos serão mostrados em
formatação itálico e negrito . A rotina completa encontra-se no Anexo F.
//Loop Infinito para captura de pacotes de dadoswhile true do
begin if GetUSBData then
begin UpdateDrawBuffer; ClearScreen; DrawData; end; Sleep(25);
end;O código Main basicamente cria os procedimentos para cada evento da
janela principal e fica em um loop infinito onde espera o PIC enviar dados ao
programa.
58
procedure TForm1.onoff_buttonClick(Sender: TObject);beginif not usb_connected then
begin ShowMessage('Dispositivo não conectado ou não
inicializado.'); exit;end;if onoff_button.Caption = 'ON' then
begin onoff_button.Caption := 'OFF'; hold_button.Enabled:=true; DXTimer1.Enabled:=true; CleanDrawBuffer1; CleanDrawBuffer2; th.Resume; endEssa rotina é executada quando o evento de clicar sobre o botão ON é
realizado. Ela verifica se o dispositivo USB está conectado e depois habilitam
outros botões de controle, também limpa os buffers do gráfico.
No código USB, está centralizado todos os comandos relacionados a
essa comunicação.
function _MPUSBGetDLLVersion():DWORD; stdcall;external 'mpusbapi.dll';
function _MPUSBGetDeviceCount(pVID_PID:PCHAR8):DWORD; stdcall;external 'mpusbapi.dll';
function _MPUSBOpen(instance:DWORD;pVID_PID:PCHAR8;pEP:PCHAR8;dwDir:DWORD;dwReserved:DWORD):THANDLE; stdcall;external 'mpusbapi.dll';
59
function_MPUSBRead(handle:THANDLE;varpData:PBYTE;dwLen:DWORD;varpLength:DWORD;dwMilliseconds:DWORD):DWORD; stdcall;external 'mpusbapi.dll';
function _MPUSBReadInt(handle:THANDLE;varpData:PBYTE;dwLen:DWORD;var
pLength:PDWORD;dwMilliseconds:DWORD):DWORD; stdcall;external 'mpusbapi.dll';
function _MPUSBWrite(handle:THANDLE;pData:PBYTE;dwLen:DWORD;var pLength:DWORD;dwMilliseconds:DWORD):DWORD; stdcall;external 'mpusbapi.dll';
function _MPUSBClose(handle:THANDLE):DWORD; stdcall;external 'mpusbapi.dll';
Esses são alguns comandos contidos na biblioteca mpusbapi.dll
fornecida pelo fabricante do microcontrolador. As funções precisam ser
reconhecidas pelo Delphi para futura utilização.
vid_pid:PCHAR8='vid_04d8&pid_2525'; // VID e PIDIndica ao software qual dispositivo USB reconhecer. Vendor ID 04d8 é o
padrão para produtos Microchip já o Product ID 2525 foi definido pela equipe
para identificação desse projeto.
function StartUSB: boolean; if (_MPUSBGetDeviceCount(vid_pid)=0) then
exit;myOutPipe:= _MPUSBOpen(0,vid_pid,out_pipe,MP_WRITE,0);myInPipe:= _MPUSBOpen(0,vid_pid,out_pipe,MP_READ,0);if ((myOutPipe = INVALID_HANDLE_VALUE) or (myInPipe = INVALID_HANDLE_VALUE)) then
exit; // testa a conexão - envia ping send_buffer[0] := PING;_MPUSBWrite(myOutPipe,send_buffer,1,SentLength,1000);
60
tmp:=IntToStr(SentLength);_MPUSBRead(myInPipe,recv_buffer,MAXSIZE,ReceiveLength,1000);
Função para início do dispositivo USB se conectado. Para verificar a
comunicação, o programa envia um “ping” e em seguido recebe uma resposta
pré-definida.
send_buffer[0] := LED_CONTROL; send_buffer[1] := led1; send_buffer[2] := led2; if _MPUSBWrite(myOutPipe,send_buffer,3,SentLength,1000)<>1 then ShowMessage('error led control');
Exemplo de envio de bytes de controle dos dispositivos externos
(representado por LEDs) para o microcontrolador PIC.
if(_MPUSBRead(myInPipe, recv_buffer, MAXSIZE, ReceiveLength, 1000)<>1)then
begin ShowMessage('error get usb data 3'); exit;
end;for i:=1 to ReceiveLength do begin if ((i mod 2)=0) then //índex par begin usb_buffer2[buf2] := recv_buffer[i-1]; inc(buf2); end else begin // índex impar usb_buffer1[buf1] := recv_buffer[i-1]; inc(buf1); end;end;
61
Captura dos pacotes enviados pelo PIC. Onde realiza a diferenciação
dos canais analógicos 1 e 2. O microcontrolador envia os sinais do canal 1
através dos bytes de indexação par, enquanto os sinais do canal 2 pelos bytes
de indexação impar, assim mantendo a mesma velocidade de captura em
ambos os canais.
Por último tem-se o código de desenho do gráfico precisa realizar a
normalização dos níveis de sinais para as amplitudes máximas apresentadas
na tela.
x := (i-1)*(Form1.DXDraw1.Width div (length(draw_buffer1) div h_factor));y := draw_buffer1[i-1];y := round((y/255)*Form1.DXDraw1.Height); // condicionamento do sinalForm1.DXDraw1.Surface.Canvas.MoveTo(x,y);x := (i)*(Form1.DXDraw1.Width div (length(draw_buffer1) div h_factor));y := draw_buffer1[i]; y := round((y/255)*Form1.DXDraw1.Height); // condicionamento do sinalForm1.DXDraw1.Surface.Canvas.LineTo(x,y);
A cada ponto desenhado, é realizada a ligação entre ele e o ponto
anterior através de uma reta, assim fazendo com que o gráfico fique contínuo e
não pontilhado.
62
Figura 30 – Fluxograma do programa em DelphiFonte: Autoria Própria
3.2.8.3. Interface Gráfica
Figura 31 – Tela de interface gráfica do programa finalFonte: Autoria Própria
63
Na figura 31 é mostrada a tela do Dispositivo de Aquisição de Sinais e
Controle Digital via USB com as seguintes funções:
Botão ON/OFF inicia a visualização gráfica ou encerra o aplicativo
gráfico.
Seletor de escala de tensão independente para os canais 1 e 2,
com uma faixa de 0,02 V a 0,5 V por divisão.
Seleção de escala de tempo independente em segundos por
divisão.
Check Box para habilitar os canais 1 e/ou 2.
Hold – Permite o congelamento instantâneo do gráfico para
melhor analise do sinal amostrado
Tela de visualização gráfica dos canais 1 e 2, com dez divisões
no eixo “X” e no eixo “Y”.
3.2.8.4. Driver do Dispositivo
Antes de iniciar o desenvolvimento do firmware foi estudado qual o
método de comunicação USB seria adotado. Existem três métodos:
USB Communication Device Class (USB CDC) – Basicamente o driver
emula uma porta COM, fazendo com que a comunicação entre o software e o
firmware seja realizada como se fosse uma porta serial padrão. É o método
mais simples para compilação do programa, porém a velocidade de
comunicação é muito baixa 115 kbps (~14,4 kB/s).
Human Interface Device (EasyHID) - O dispositivo USB seria
reconhecido automaticamente pelo Windows como um Dispositivo de Interface
Humana (HID), não sendo necessário desenvolver driver especiais para a
aplicação, mas teria uma limitação de velocidade de 64 kB/s.
USB Bulk - Driver customizado que permite a comunicação USB apenas
com a limitação de velocidade do próprio USB 2.0 (480 Mbps). Esta foi a
escolha para o desenvolvimento do projeto.
O driver é disponibilizado pela própria Microchip e utilizado em dois
momentos. O primeiro na instalação do dispositivo no sistema operacional,
64
onde faz o reconhecimento, enumeração e configuração USB do
microcontrolador. O segundo é a utilização da biblioteca “mpusbapi.dll” para o
desenvolvimento do software de interface gráfica, o qual serve para
comunicação entre o computador e o próprio PIC18F2550.
4. CONCLUSÕES
65
Neste trabalho foi desenvolvido um dispositivo de aquisição de sinais
analógicos e controle digital via USB. Esse tema envolveu conhecimentos de
diversas disciplinas do curso de engenharia elétrica, como circuitos elétricos,
instrumentação, microcontroladores, circuitos lineares e não lineares, entre
outros. Por esse motivo somado ao uso da comunicação USB, tornou o projeto
muito interessante, pois atualmente é a interface mais utilizada para troca de
dados digitais entre os diversos equipamentos eletrônicos. O aprofundamento
nesse e em outros assuntos relacionados ao projeto, acabou ampliando a visão
de possibilidades para aplicações desses conhecimentos em dispositivos
futuros.
Várias linguagens de programação e diversos softwares foram utilizados,
o que proporcionou um aprendizado muito grande nessa área. Também foi um
enorme desafio a confecção completa dispositivo, desde a placa de circuito
impresso até a caixa protetora, todo desenvolvimento foi realizado pela equipe,
o que trouxe muita satisfação para a mesma.
O protótipo e software sofreram várias alterações e ajustes para
alcançar o objetivo definido inicialmente. Com os testes finais, conseguimos
obter as seguintes características:
Um taxa de amostragem de aproximadamente 32kSPS; Tensão de entrada AC de 50Vpp; Escala de tempo ponto a ponto real de 2ms; Escala mínima de tensão de 0,1V/div. Controle de ganho em tempo real; Controle dos dispositivos externos simultaneamente com
aquisição de dados; Programação do firmware ICSP
Com um maior tempo de desenvolvimento seria possível melhorar as
características citadas acima, principalmente implementando um conversor
analógico digital externo acoplado a uma memória intermediária, aumentando
assim a taxa de amostragem. Algumas funções no tratamento de sinal através
do software de interface gráfica também foram discutidas, entre elas, um
trigger, cálculos de valores RMS, filtros, FFT, entre outros.
4.1. PERSPECTIVAS
66
Para avançar com o dispositivo e uma possível evolução para um
produto comercial pode-se citar algumas melhorias a serem implementadas:
Maior velocidade de aquisição com um CAD melhor
Limite máximo de tensão de entrada aumentado
FFT
Botão de Trigger
Cálculos matemáticos entre os sinais das 2 entradas
Redução do tamanho do dispositivo
Proteções contra surtos
Incorporação de filtros
Eliminação da necessidade de fonte externa
REFERÊNCIAS BIBLIOGRÁFICAS
67
[1] ESPÍNDOLA, Walter Luciano; PIECARZ, Leandro Silva. USBSCOPE. Trabalho de conclusão de curso (Graduação em Engenharia Elétrica) – UFPR, Curitiba. 2007.
[2] Topologia do USB. Disponível em: http://www.gta.ufrj.br/grad/07_1/wusb/TopologiadoUSB.html. Acesso em: 1 de junho de 2009.
[3] Arquitetura USB. Disponível em: http://www.pads.ufrj.br/~rapoport/usb/usb4.html. Acesso em: 1 de junho de 2009.
[4] Interfaces e Periféricos USB. Disponível em: http://www.laercio.com.br/artigos/hardware/hard-051/hard-051c.htm. Acesso em: 2 de junho de 2009.
[5] Como Funcionam as Portas USB. Disponível em: http://informatica.hsw.uol.com.br/portas-usb1.htm. Acesso em: 3 de junho de 2009.
[6] CARVALHO, Felipe Monteiro et al. Osciloscópio Digital em Placa ISA. USP. São Paulo. Disponível em: http://incubadora.fapesp.br/frs/download.php/707/OsciloscopioISA.pdf. Acesso em: 1 de junho de 2009.
[7] Instrumento de Medidas Elétricas em CA – Parte II – Osciloscópio. Disponível em: http://www.ucg.br/acad_web/professor/sitedocente/admin/arquivosUpload/7502/material/Lab2%20circuitos%20elet%20ii.pdf. Acesso em: 1 de junho de 2009.
[8] Eletricidade Básica – Osciloscópio. Disponível em: http://www.inep.ufsc.br/eletbas/aula05.pdf. Acesso em: 1 de junho de 2009.
[9] Conversão Analógica Digital. Disponível em: http://www.universiabrasil.net/mit/6/6071/PDF/f02-lec20a_val.pdf. Acesso em: 3 de junho de 2009.
[10] Conversor Analógico Digital – A/D. Disponível em: http://www.colegiouberaba.com.br/apostilas/subsidios_eletronica/conversor%20a_d.pdf. Acesso em: 3 de junho de 2009.
REFERÊNCIAS PARA PESQUISA
68
Adaptadores USB. Disponível em: http://www.atera.com.br/figuras/kitusb1399.GIF. Acesso em: 2 de junho de 2009.
Adaptadores USB. Disponível em: http://www.gdhpress.com.br/hardware/leia/cap3-18_html_67a5b903.jpg. Acesso em: 2 de junho de 2009.
Adaptadores USB. Disponível em: https://loja.tray.com.br/adm/editor/up/108972/1499_g.jpg. Acesso em: 2 de junho de 2009.
ASSOCIAÇÃO BRASILEIRA DE NORMAS TÉCNICAS. NBR 14724: informação e documentação: trabalhos acadêmicos: apresentação. Rio de Janeiro, 2002.
ATMEL. Atmel Product Selector Guide. Disponível em: http://www.atmel.com/. Acesso em: 11 de março de 2009.
COSTA, Alexandre. Gravadores de PIC. Disponível em: http://br.geocities.com/alexrobotica/eletronic_robotica_grava_pics.html. Acesso em: 23 de abril de 2009.
Create USB Interface. Disponível em: http://www.create.ucsb.edu/~dano/CUI/. Acesso em 24 de abril de 2009.
Entendendo USB Firewire. Disponível em: http://www.gdhpress.com.br/blog/entendendo-usb-firewire.html. Acesso em: 2 de junho de 2009.
HOFFMAN, Pablo. Osciloscópio USB – Documentación. Disponível em: http://pablohoffman.com/cgi-bin/twiki/bin/view/Oscusb/OscusbDocumentacion. Acesso em: 28 de abril de 2009.
IN-Circuit Serial Programming (ICSP). Disponível em: http://www.embedinc.com/picprg/icsp.htm. Acesso em: 23 de abril de 2009.
Iniciando PIC USB. Disponível em: http://www.edaboard.com/ftopic313796.html. Acesso em: 23 de abril de 2009.
Intel. Desktop Boards – Portas USB. Disponível em: http://www.intel.com/support/pt/motherboards/desktop/sb/CS-023466.htm. Acesso em: 2 de junho de 2009.
Jonis Project – PIC+USB. Disponível em: http://www.jonis.com.br/novo/index.php?option=com_content&view=article&id=53:pic-usb-bootloader-facil&catid=38:eletronica. Acesso em: 24 de abril de 2009.
69
MICROCHIP. Microchip Advanced Parts Selection. Disponível em: http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1924. Acesso em: 11 de março de 2009.
OBJECTIVE DEVELOPMENT. Power Switch. Disponível em: http://www.obdev.at/products/vusb/powerswitch.html. Acesso em: 11 de março de 2009.
PIC 18 USB Support. Disponível em: http://www.oshonsoft.com/pic18usb.html. Acesso em: 21 de abril de 2009.
PICPgm. Disponível em: http://members.aon.at/electronics/pic/picpgm/. Acesso em: 23 de abril de 2009.
Programas de PIC com USB. Disponível em: http://www.electronicfr.com/index.php/Microcontrollers-and-USB/-Part-3-How-to-build-a-USB-thermometer-and-barometer-with-PIC-18F4550-or-18F2550.html. Acesso em: 23 de abril de 2009.
SOUZA, Emmanuel C. O. Criando Textos Segundo a ABNT. Disponível em: http://www.scribd.com/doc/1816529/Normas-ABNT-no-Word?page=7. Acesso em: 28 de maio de 2009.
TEXAS INSTRUMENTS. MCU Selection Tool. Disponível em: http://focus.ti.com/en/multimedia/flash/selection_tools/mcu/mcu.html. Acesso em: 10 de março de 2009.
UNISO. Manual de Normalização de Apresentação de Teses, Dissertações e Trabalhos de Conclusão de Curso (TCC) da Universidade de Sorocaba. Disponível em: http://www.scribd.com/doc/4076862/ABNT-Manual-I. Acesso em: 22 de junho de 2009.
Universal Serial Bus – USB – Eletronline. Disponível em: http://eletronline.blogspot.com/2009/02/universal-serial-bus-usb.html. Acesso em: 2 de junho de 2009.
USB. Disponível em: http://www.gdhpress.com.br/hardware/leia/index.php?p=cap3-18. Acesso em: 2 de junho de 2009.
USB Boot-Loader on a PIC 18F2550. Disponível em: http://techsanctuary.com/node/64. Acesso em 23 de abril de 2009.
USB Especifications. Disponível em: http://www.usb.org/developers/usb20/developers/whitepapers/usb_20g.pdf. Acesso em: 21 de abril de 2009.
USB Explicação. Disponível em: http://www.rogercom.com/PortaUSB/MotorPasso.htm. Acesso em: 24 de abril de 2009.
70
ANEXOS
71
ANEXO A - Cronograma do Projeto
Março/2009 – Estudo dos microcontroladores e definição dos
demais componentes eletrônicos do dispositivo a ser
desenvolvido.
Abril/2009 – Definição do projeto eletrônico, layout da placa,
confecção do dispositivo e início do estudo para o
desenvolvimento do software.
Maio/2009 – Possíveis correções, testes, calibração do
dispositivo, testes preliminares do software e possíveis
melhorias a serem implementadas.
Junho/2009 – Correções finais, layout externo do produto,
últimos testes e modificações, elaboração do relatório e
verificação final do produto.
Julho/2009 – Apresentação.
ANEXO B – Diagrama Esquemático do Circuito
72
73
ANEXO C – Diagrama Esquemático do Circuito de Tratamento de Sinais
74
ANEXO D – Diagrama Esquemático da Fonte Externa
75
ANEXO E – Código Fonte do Firmware
//==Código Fonte do Firmware compilado em C pelo programa PCWHD==============#include <18F2550.h>#fuses
HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL4,CPUDIV1,VREGEN#use delay(clock=48000000) // Cristal de 16MHz
// Includes das bibliotecas USB do compilador CCS.//Microchip PIC18Fxx5x Hardware p/ CCS PIC USB Driver#define USB_HID_DEVICE FALSE // Desabilitamos o uso das diretivas HID#define USB_EP1_TX_ENABLE USB_ENABLE_BULK // Ativa EP1(EndPoint1)
para as transferencias IN Bulk/Interrupt#define USB_EP1_RX_ENABLE USB_ENABLE_BULK // Ativa EP1(EndPoint1)
para as transferencias OUT Bulk/Interrupt#define USB_EP1_TX_SIZE 64 // Tamanho para o Buffer Tx EndPoint1#define USB_EP1_RX_SIZE 3 // Tamanho para o Buffer Rx EndPoint1
#include <pic18_usb.h>#include <PicUSBMK.h> //Configuração do USB e descritores para o dispositivo#include <usb.c> //Handles usb ,tokens e descritores
#ENDIF
//==Definições========================================================#define LED1ON PIN_B0#define LED2ENUM PIN_B1#define LED3USB PIN_B2#define LED4OUT1 PIN_B3#define LED5OUT2 PIN_B4#define LED_ON output_low#define LED_OFF output_high
#define MUX1A0 PIN_A2#define MUX1A1 PIN_C1#define MUX1A2 PIN_C0#define MUX2A0 PIN_A5#define MUX2A1 PIN_A4#define MUX2A2 PIN_A3
#define MUX_ON output_high#define MUX_OFF output_low
#define SAMPLE 0x00#define LED_CONTROL 0x01#define MUX_CONTROL1 0x02#define MUX_CONTROL2 0x03#define PING 0x05
#define NO1 0x00#define NO2 0x01#define NO3 0x02#define NO4 0x03#define NO5 0x04#define NO6 0x05#define NO7 0x06#define NO8 0x07
#defineTXSIZE 64
76
int8 rxdata[5];int8 txdata[TXSIZE];int8 txdata2[TXSIZE];int8 txdata3[TXSIZE];int8 txdata4[TXSIZE];int8 txdata5[TXSIZE];int8 txdata6[TXSIZE];int8 txdata7[TXSIZE];int8 txdata8[TXSIZE];int8 txdata9[TXSIZE];int8 txdata10[TXSIZE];int8 send_buf[5];
void TesteUSB(void) //Verifica se o USB está conectado e enumerado
int8 enumerou; usb_task(); // Hab. o perif. usb e as interrupções usb_wait_for_enumeration(); // Aguarda o Pic ser configurado pelo PC enumerou=usb_enumerated(); if (enumerou) LED_ON(LED2ENUM); else LED_OFF(LED2ENUM);
void TXAnalog(void) //Realiza a captura e transmissão das portas analógicas
int8 i;
LED_ON(LED3USB); set_adc_channel(0); // Canal A0 delay_us(10); // Retardo txdata[0]=read_adc();
for (i=1;i<TXSIZE;i+=2) set_adc_channel(1); // Canal A1 delay_us(10); // Retardo txdata[i]=read_adc(); set_adc_channel(0); // Canal A0 delay_us(10); // Retardo txdata[i+1]=read_adc(); usb_puts(1,txdata,TXSIZE,USB_DTS_TOGGLE); LED_OFF(LED3USB);
void MuxCH1(void) //Seleciona o ganho do CH1 if (rxdata[1]==NO1) MUX_OFF(MUX1A2); MUX_OFF(MUX1A1); MUX_OFF(MUX1A0); if (rxdata[1]==NO2) MUX_OFF(MUX1A2); MUX_OFF(MUX1A1); MUX_ON(MUX1A0);
77
if (rxdata[1]==NO3) MUX_OFF(MUX1A2); MUX_ON(MUX1A1); MUX_OFF(MUX1A0); if (rxdata[1]==NO4) MUX_OFF(MUX1A2); MUX_ON(MUX1A1); MUX_ON(MUX1A0); if (rxdata[1]==NO5) MUX_ON(MUX1A2); MUX_OFF(MUX1A1); MUX_OFF(MUX1A0); if (rxdata[1]==NO6) MUX_ON(MUX1A2); MUX_OFF(MUX1A1); MUX_ON(MUX1A0); if (rxdata[1]==NO7) MUX_ON(MUX1A2); MUX_ON(MUX1A1); MUX_OFF(MUX1A0); if (rxdata[1]==NO8) MUX_ON(MUX1A2); MUX_ON(MUX1A1); MUX_ON(MUX1A0);
void MuxCH2 (void) //Seleciona o ganho do CH2 if (rxdata[1]==NO1) MUX_OFF(MUX2A2); MUX_OFF(MUX2A1); MUX_OFF(MUX2A0); if (rxdata[1]==NO2) MUX_OFF(MUX2A2); MUX_OFF(MUX2A1); MUX_ON(MUX2A0); if (rxdata[1]==NO3) MUX_OFF(MUX2A2); MUX_ON(MUX2A1); MUX_OFF(MUX2A0); if (rxdata[1]==NO4) MUX_OFF(MUX2A2); MUX_ON(MUX2A1); MUX_ON(MUX2A0); if (rxdata[1]==NO5) MUX_ON(MUX2A2); MUX_OFF(MUX2A1); MUX_OFF(MUX2A0); if (rxdata[1]==NO6) MUX_ON(MUX2A2);
78
MUX_OFF(MUX2A1); MUX_ON(MUX2A0); if (rxdata[1]==NO7) MUX_ON(MUX2A2); MUX_ON(MUX2A1); MUX_OFF(MUX2A0); if (rxdata[1]==NO8) MUX_ON(MUX2A2); MUX_ON(MUX2A1); MUX_ON(MUX2A0);
void main(void) // Programa Principal int8 cont=1;
set_tris_a(0b00000011); // AN0, AN1 entradas e RA2,RA3,RA4,RA5 saídas set_tris_b(0b00000000); // RB Todas saídas set_tris_c(0b00000000); // RC0 Todas saídas setup_adc_ports( AN0_TO_AN1 ); // configura IN analog.do conversor A/D setup_adc(ADC_CLOCK_INTERNAL); // configura clock interno para o ADC LED_ON(LED1ON); LED_OFF(LED2ENUM); LED_OFF(LED3USB); LED_OFF(LED4OUT1); LED_OFF(LED5OUT2); usb_init(); // Inicializamos o USB while (TRUE) // Loop Infinito TesteUSB(); // Testa a USB if(usb_enumerated()) // Se o PicUSB está configurado if (usb_kbhit(1)) // Verifica se há algo no USB usb_get_packet(1,rxdata,5); //Captura os dados da USB e coloca //na variável rxdata // sample if(rxdata[0]==SAMPLE) TXAnalog(); // led control if(rxdata[0]==LED_CONTROL) if(rxdata[1]) LED_ON(LED4OUT1); else LED_OFF(LED4OUT1); if(rxdata[2]) LED_ON(LED5OUT2); else LED_OFF(LED5OUT2); // Mux Control CH 1
79
if(rxdata[0]==MUX_CONTROL1) MuxCH1(); // Mux Control CH 2 if(rxdata[0]==MUX_CONTROL2) MuxCH2(); // PING - PONG if(rxdata[0]==PING) send_buf[0] = PING; usb_put_packet(1,send_buf,1,USB_DTS_TOGGLE);
80
ANEXO F – Código Fonte do Software
//==Código Fonte do Software de Interface Gráfica compilado no Delphi============//===================Início da Rotina MAIN==============================
unit main;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, DXDraws, DXClass, ComCtrls, draw, ExtCtrls, Menus, Buttons, usb, draw;
type
TForm1 = class(TForm) DXDraw1: TDXDraw; GroupBox1: TGroupBox; led1_checkbox: TCheckBox; led2_checkbox: TCheckBox; DXTimer1: TDXTimer; GroupBox2: TGroupBox; en_canal1: TCheckBox; en_canal2: TCheckBox; onoff_button: TButton; Label1: TLabel; usb_led: TPanel; hold_button: TButton; GroupBox3: TGroupBox; hscale_bar1: TTrackBar; Label3: TLabel; Label4: TLabel; Label5: TLabel; Label6: TLabel; Label7: TLabel; Label2: TLabel; Label8: TLabel; Label9: TLabel; Label10: TLabel; Label11: TLabel; Label20: TLabel; Label21: TLabel; GroupBox4: TGroupBox; vscale_bar1: TTrackBar; Label12: TLabel; Label13: TLabel; Label14: TLabel; Label15: TLabel; Label16: TLabel; Label17: TLabel; Label18: TLabel; Label19: TLabel; hscale_bar2: TTrackBar; vscale_bar2: TTrackBar; procedure led_c(Sender: TObject); procedure DXTimer1Timer(Sender: TObject; LagCount: Integer); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure onoff_buttonClick(Sender: TObject);
81
procedure FormResize(Sender: TObject); procedure FormCreate(Sender: TObject); procedure hold_buttonClick(Sender: TObject); procedure hscale_bar2Change(Sender: TObject); procedure hscale2Change(Sender: TObject); procedure vscale_bar1Change(Sender: TObject); procedure vscale_bar2Change(Sender: TObject); private Private declarations public Public declarations end;
main_thread = class(TThread) private Private declarations protected procedure Execute; override; end;
var Form1: TForm1; th: main_thread; // escalas hscale1: double = 0.005; hscale2: double = 0.005; vscale1: double = 0.02; vscale2: double = 0.02; hscale_default: double = 0.005; vscale_default: double = 0.02;
implementation
$R *.dfm
procedure TForm1.led_c(Sender: TObject);var led1, led2: integer;begin if led1_checkbox.Checked then led1:=1 else led1:=0; if led2_checkbox.Checked then led2:=1 else led2:=0; led(led1,led2);end;
procedure TForm1.DXTimer1Timer(Sender: TObject; LagCount: Integer);begin if DXDraw1.CanDraw then DXDraw1.Flip;end;
procedure main_thread.Execute;begin if hold and usb_connected then exit;
82
while true do begin if GetUSBData then begin UpdateDrawBuffer; ClearScreen; DrawData; end; Sleep(25); end;end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);begin DXTimer1.Enabled:=false;// th.Suspend;end;
procedure TForm1.onoff_buttonClick(Sender: TObject);begin if not usb_connected then begin ShowMessage('Dispositivo não conectado ou não inicializado.'); exit; end;
if onoff_button.Caption = 'ON' then begin onoff_button.Caption := 'OFF'; hold_button.Enabled:=true; DXTimer1.Enabled:=true; CleanDrawBuffer1; CleanDrawBuffer2; th.Resume; end else begin onoff_button.Caption := 'ON'; hold_button.Enabled:=false; DXTimer1.Enabled:=false; ClearScreen; DXDraw1.Flip; //th.Suspend; end;
end;
procedure TForm1.FormResize(Sender: TObject);begin DXDraw1.Flip;end;
procedure TForm1.FormCreate(Sender: TObject);begin if StartUSB then begin th:=main_thread.Create(true); end else begin usb_connected := false;
83
end;
ClearScreen;end;
procedure TForm1.hold_buttonClick(Sender: TObject);begin if hold then begin DXTimer1.Enabled := true; hold := false; end else begin hold := true; DXTimer1.Enabled := false; end;end;
procedure TForm1.hscale_bar2Change(Sender: TObject);begin CleanDrawBuffer1; case hscale_bar1.Position of 6: hscale1:=0.500; 5: hscale1:=0.200; 4: hscale1:=0.100; 3: hscale1:=0.050; 2: hscale1:=0.020; 1: hscale1:=0.010; 0: hscale1:=0.005; end;end;
procedure TForm1.hscale2Change(Sender: TObject);begin CleanDrawBuffer2; case hscale_bar2.Position of 6: hscale2:=0.500; 5: hscale2:=0.200; 4: hscale2:=0.100; 3: hscale2:=0.050; 2: hscale2:=0.020; 1: hscale2:=0.010; 0: hscale2:=0.005; end;end;
procedure TForm1.vscale_bar1Change(Sender: TObject);begin change_mux1(vscale_bar1.Position);end;
procedure TForm1.vscale_bar2Change(Sender: TObject);begin change_mux2(vscale_bar2.Position);end;
end.//===================Fim Rotina MAIN====================================
//===================Início da Rotina USB=================================
84
unit usb;
interface
uses Classes, Windows, SysUtils, Dialogs, Graphics;
Const MAXSIZE=64; MPUSB_FAIL=0; MPUSB_SUCCESS=1; MP_WRITE:DWORD=0; MP_READ:DWORD=1; MAX_NUM_MPUSB_DEV=127;
SAMPLE = $00; LED_CONTROL = $01; MUX_CONTROL1 = $02; MUX_CONTROL2 = $03 N01 = $00 N02 = $01 N03 = $02 N04 = $03 N05 = $04 N06 = $05 N07 = $06 N07 = $07 PING = $05;
type DWORD = LongInt; PCHAR8 = array[0..MAXSIZE] of char; PBYTE = array[0..MAXSIZE] of BYTE; PDWORD = array[0..MAXSIZE] of DWORD; PVOID = Pointer; UINT = Cardinal;
usb_thread = class(TThread) private Private declarations protected procedure Execute; override; end;
function _MPUSBGetDLLVersion():DWORD; stdcall;external 'mpusbapi.dll';function _MPUSBGetDeviceCount(pVID_PID:PCHAR8):DWORD; stdcall;external 'mpusbapi.dll';function _MPUSBOpen(instance:DWORD;pVID_PID:PCHAR8;pEP:PCHAR8;dwDir:DWORD;dwReserved:DWORD):THANDLE; stdcall;external 'mpusbapi.dll';function _MPUSBRead(handle:THANDLE;var pData:PBYTE;dwLen:DWORD;var pLength:DWORD;dwMilliseconds:DWORD):DWORD; stdcall;external 'mpusbapi.dll';function _MPUSBReadInt(handle:THANDLE;var pData:PBYTE;dwLen:DWORD;var pLength:PDWORD;dwMilliseconds:DWORD):DWORD; stdcall;external 'mpusbapi.dll';function _MPUSBWrite(handle:THANDLE;pData:PBYTE;dwLen:DWORD;var pLength:DWORD;dwMilliseconds:DWORD):DWORD; stdcall;external 'mpusbapi.dll';function _MPUSBClose(handle:THANDLE):DWORD; stdcall;external 'mpusbapi.dll';
var vid_pid:PCHAR8='vid_04d8&pid_2525'; // VID e PID
85
out_pipe:PCHAR8='\MCHP_EP1'; in_pipe:PCHAR8='\MCHP_EP1'; usb_buffer1: array[1..320] of byte; usb_buffer2: array[1..320] of byte; usb_connected: boolean = false;
function StartUSB: boolean;function GetUSBData: boolean;procedure led(led1, led2: byte);procedure change_mux1(value: byte);procedure change_mux2(value: byte);
implementation
uses main, draw;
var send_buffer, recv_buffer: PBYTE; myOutPipe:THANDLE; myInPipe:THANDLE; tmp: string;
//=============Inicia a USB==============================================function StartUSB: boolean;var ReceiveLength, SentLength:DWORD;begin Form1.usb_led.Color := clRed; usb_connected := false; result := false;
if (_MPUSBGetDeviceCount(vid_pid)=0) then exit;
myOutPipe:= _MPUSBOpen(0,vid_pid,out_pipe,MP_WRITE,0); myInPipe:= _MPUSBOpen(0,vid_pid,out_pipe,MP_READ,0);
if ((myOutPipe = INVALID_HANDLE_VALUE) or (myInPipe = INVALID_HANDLE_VALUE)) then exit;
// testa a conexão - envia ping send_buffer[0] := PING; _MPUSBWrite(myOutPipe,send_buffer,1,SentLength,1000); tmp:=IntToStr(SentLength); _MPUSBRead(myInPipe,recv_buffer,MAXSIZE,ReceiveLength,1000);
if (ReceiveLength<>1) or (recv_buffer[0]<>PING) then exit;
_MPUSBClose(myOutPipe); _MPUSBClose(myInPipe); myInPipe:= INVALID_HANDLE_VALUE; myOutPipe:=INVALID_HANDLE_VALUE;
Form1.usb_led.Color:=clGreen; usb_connected := true; Form1.led1_checkbox.Enabled:=true; Form1.led2_checkbox.Enabled:=true;
86
result := true;end;
//=============Controla a saída Digital (LEDs)===============================procedure led(led1, led2: byte);var SentLength: DWORD;begin myOutPipe:= _MPUSBOpen(0,vid_pid,out_pipe,MP_WRITE,0); myInPipe:= _MPUSBOpen(0,vid_pid,out_pipe,MP_READ,0);
if ((myOutPipe = INVALID_HANDLE_VALUE) or (myInPipe = INVALID_HANDLE_VALUE)) then begin ShowMessage('error led control'); exit; end;
send_buffer[0] := LED_CONTROL; send_buffer[1] := led1; send_buffer[2] := led2; if _MPUSBWrite(myOutPipe,send_buffer,3,SentLength,1000)<>1 then ShowMessage('error led control'); tmp:=IntToStr(SentLength);
_MPUSBClose(myOutPipe); _MPUSBClose(myInPipe); myInPipe:= INVALID_HANDLE_VALUE; myOutPipe:=INVALID_HANDLE_VALUE;end;
//============= Captura os dados da USB ===============================function GetUSBData: boolean;var i, c, buf1, buf2: integer; ReceiveLength, SentLength:DWORD;begin result:=false;
myOutPipe:= _MPUSBOpen(0,vid_pid,out_pipe,MP_WRITE,0); myInPipe:= _MPUSBOpen(0,vid_pid,out_pipe,MP_READ,0);
if ((myOutPipe = INVALID_HANDLE_VALUE) or (myInPipe = INVALID_HANDLE_VALUE)) then begin ShowMessage('error get usb data 1'); exit; end;
// solicita os dados send_buffer[0] := SAMPLE; if _MPUSBWrite(myOutPipe,send_buffer,1,SentLength,1000)<>1 then begin ShowMessage('error get usb data 2'); exit; end; tmp:=IntToStr(SentLength);
// le os dados buf1 := 1;
87
buf2 := 1;
for c:=1 to (2*length(usb_buffer1)div length(recv_buffer)) do begin if(_MPUSBRead(myInPipe, recv_buffer, MAXSIZE, ReceiveLength, 1000)<>1)then begin ShowMessage('error get usb data 3'); exit; end; tmp:=IntToStr(ReceiveLength);
if ReceiveLength<>0 then result:=true;
for i:=1 to ReceiveLength do begin if ((i mod 2)=0) then //par begin usb_buffer2[buf2] := recv_buffer[i-1]; inc(buf2); end else begin // impar usb_buffer1[buf1] := recv_buffer[i-1]; inc(buf1); end; end; end;
_MPUSBClose(myOutPipe); _MPUSBClose(myInPipe); myInPipe:= INVALID_HANDLE_VALUE; myOutPipe:=INVALID_HANDLE_VALUE;end;
procedure change_mux1(value: byte);var SentLength: DWORD;beginmyOutPipe:= _MPUSBOpen(0,vid_pid,out_pipe,MP_WRITE,0); myInPipe:= _MPUSBOpen(0,vid_pid,out_pipe,MP_READ,0);
if ((myOutPipe = INVALID_HANDLE_VALUE) or (myInPipe = INVALID_HANDLE_VALUE)) then begin ShowMessage('error mux control'); exit; end;
send_buffer[0] := MUX_CONTROL1;
case value of 0: send_buffer[1] := N01; // 0.002V/div 1: send_buffer[1] := N02; // 0.005V/div 2: send_buffer[1] := N03; // 0.1V/div 3: send_buffer[1] := N04; // 0.2V/div 4: send_buffer[1] := N05; // 0.5V/div 5: send_buffer[1] := N06; // 1V/div 6: send_buffer[1] := N07; // 2V/div 7: send_buffer[1] := N08; // 5V/div end;
88
if _MPUSBWrite(myOutPipe,send_buffer,3,SentLength,1000)<>1 then ShowMessage('error mux control'); tmp:=IntToStr(SentLength);
_MPUSBClose(myOutPipe); _MPUSBClose(myInPipe); myInPipe:= INVALID_HANDLE_VALUE; myOutPipe:=INVALID_HANDLE_VALUE;end;
procedure change_mux2(value: byte);var SentLength: DWORD;begin myOutPipe:= _MPUSBOpen(0,vid_pid,out_pipe,MP_WRITE,0); myInPipe:= _MPUSBOpen(0,vid_pid,out_pipe,MP_READ,0);
if ((myOutPipe = INVALID_HANDLE_VALUE) or (myInPipe = INVALID_HANDLE_VALUE)) then begin ShowMessage('error mux control'); exit; end;
send_buffer[0] := MUX_CONTROL2;
case value of 0: send_buffer[1] := N01; // 0.002V/div 1: send_buffer[1] := N02; // 0.005V/div 2: send_buffer[1] := N03; // 0.1V/div 3: send_buffer[1] := N04; // 0.2V/div 4: send_buffer[1] := N05; // 0.5V/div 5: send_buffer[1] := N06; // 1V/div 6: send_buffer[1] := N07; // 2V/div 7: send_buffer[1] := N08; // 5V/div end;
if _MPUSBWrite(myOutPipe,send_buffer,3,SentLength,1000)<>1 then ShowMessage('error mux control'); tmp:=IntToStr(SentLength);
_MPUSBClose(myOutPipe); _MPUSBClose(myInPipe); myInPipe:= INVALID_HANDLE_VALUE; myOutPipe:=INVALID_HANDLE_VALUE;end;
//=============Loop Infinito para leitura do USB===============================procedure usb_thread.Execute;begin while true do begin GetUSBData; Sleep(10); end;end;
end.//===================Fim da Rotina USB===================================
89
//===================Início da Rotina DRAW================================unit draw;
interface
uses Graphics, Windows, Classes, SysUtils, Dialogs;
type draw_thread = class(TThread) private // Private declarations protected procedure Execute; override; end;
procedure UpdateDrawBuffer; procedure DrawData; procedure ClearScreen; procedure CleanDrawBuffer1; procedure CleanDrawBuffer2;
var hold: boolean = false; next_start_h_scale: integer = 0;
implementation
uses main, usb;
var draw_buffer1: array[1..320] of smallint; // guarda os pontos já lidos draw_buffer2: array[1..320] of smallint; draw_buffer1_index: integer = 1; draw_buffer2_index: integer = 1;
procedure draw_thread.Execute;begin while true do begin UpdateDrawBuffer; ClearScreen; DrawData; Form1.DXDraw1.Flip; end;end;
//=================Esvazio buffer do desenho 1===============================procedure CleanDrawBuffer1;var i: integer;begin for i:=1 to length(draw_buffer1) do begin draw_buffer1[i] := -1; draw_buffer2[i] := -1; end;end;
90
//=================Esvazio buffer do desenho 2===============================procedure CleanDrawBuffer2;var i: integer;begin for i:=1 to length(draw_buffer2) do begin draw_buffer1[i] := -1; draw_buffer2[i] := -1; end;end;
//=================Atualiza o buffer do desenho==============================procedure UpdateDrawBuffer;var usb_buf, draw_buf, i: integer;begin ///////////// // canal 1 // /////////////
draw_buf:=-1;
// acha o inicio do buffer 1 for i:=1 to length(draw_buffer1) do if draw_buffer1[i]=-1 then begin draw_buf:=i; break; end;
// buffer cheio, apaga if draw_buf=-1 then begin CleanDrawBuffer1; draw_buf:=1; end;
// skip := hscale/hscale_default;
// copia todo o USB buffer usb_buf := 1; while true do//draw_buf <= length(draw_buffer1) do begin if usb_buf > length(usb_buffer1) then break; if draw_buf > length(draw_buffer1) then begin CleanDrawBuffer1; draw_buf:=1; end; draw_buffer1[draw_buf] := usb_buffer1[usb_buf]; draw_buffer2[draw_buf] := usb_buffer2[usb_buf];
inc(draw_buf); inc(usb_buf); end; end;
91
//=================Limpa a tela e desenha os eixos===========================procedure ClearScreen;var hdivs, vdivs: integer; // numero de divisoes horizontais e verticais i: integer;begin vdivs := 10; hdivs := 10;
if not Form1.DXDraw1.CanDraw then exit;
// pinta a tela de branco Form1.DXDraw1.Surface.Fill( Form1.DXDraw1.Surface.ColorMatch(rgb(255,255,255))
);
Form1.DXDraw1.Surface.Canvas.Pen.Color:=clGray; Form1.DXDraw1.Surface.Canvas.Pen.Style := psdot;
// desenha as escalas verticais do canal 1 for i := 1 to vdivs-1 do with Form1.DXDraw1.Surface.Canvas do begin MoveTo(i*(Form1.DXDraw1.Width)div(vdivs), 0); LineTo(i*(Form1.DXDraw1.Width)div(vdivs), Form1.DXDraw1.Height); end;
// desenha as escalas horizontais do canal 1 for i := 1 to hdivs-1 do with Form1.DXDraw1.Surface.Canvas do begin MoveTo(0, i*(Form1.DXDraw1.Height)div(hdivs)); LineTo(Form1.DXDraw1.Width, i*(Form1.DXDraw1.Height)div(hdivs)); end;
Form1.DXDraw1.Surface.Canvas.Pen.Color := clBlack; Form1.DXDraw1.Surface.Canvas.Pen.Style := pssolid;
// eixo vertical Form1.DXDraw1.Surface.Canvas.Pen.Width:=1; Form1.DXDraw1.Surface.Canvas.MoveTo(Form1.DXDraw1.Width div 2, 0); Form1.DXDraw1.Surface.Canvas.LineTo(Form1.DXDraw1.Width div 2,
Form1.DXDraw1.Height);
// eixo horizontal Form1.DXDraw1.Surface.Canvas.MoveTo(0, Form1.DXDraw1.Height div 2); Form1.DXDraw1.Surface.Canvas.LineTo(Form1.DXDraw1.Width,
Form1.DXDraw1.Height div 2);
// mini divisões - horizontal for i:=0 to hdivs*5 do begin Form1.DXDraw1.Surface.Canvas.MoveTo(i*Form1.DXDraw1.Width div hdivs div 5,
(Form1.DXDraw1.Height div 2) - 3); Form1.DXDraw1.Surface.Canvas.LineTo(i*Form1.DXDraw1.Width div hdivs div 5,
(Form1.DXDraw1.Height div 2) + 3); end;
// mini divisões - vertical for i:=0 to vdivs*5 do
92
begin Form1.DXDraw1.Surface.Canvas.MoveTo((Form1.DXDraw1.Width div 2) - 3,
i*Form1.DXDraw1.Height div vdivs div 5); Form1.DXDraw1.Surface.Canvas.LineTo((Form1.DXDraw1.Width div 2) + 3,
i*Form1.DXDraw1.Height div vdivs div 5); end;
end;
//=================Desenha o Canal1==================================procedure DrawData;var i, x, y, h_factor: integer;begin // muda a cor do traçado para verde Form1.DXDraw1.Surface.Canvas.Pen.Color := clGreen; Form1.DXDraw1.Surface.Canvas.Pen.Width := 2;
if not Form1.DXDraw1.CanDraw then exit;
///////////// // canal 1 // /////////////
h_factor := round(hscale1/hscale_default); i:=1; if Form1.en_canal1.Checked then while i <= (length(draw_buffer1) div h_factor) do begin // se chegou no fim do buffer, sai do loop if draw_buffer1[i] = -1 then break;
x := (i-1)*(Form1.DXDraw1.Width div (length(draw_buffer1) div h_factor)); y := draw_buffer1[i-1]; y := round((y/255)*Form1.DXDraw1.Height); // condicionamento do sinal
Form1.DXDraw1.Surface.Canvas.MoveTo(x,y);
x := (i)*(Form1.DXDraw1.Width div (length(draw_buffer1) div h_factor)); y := draw_buffer1[i]; y := round((y/255)*Form1.DXDraw1.Height); // condicionamento do sinal
Form1.DXDraw1.Surface.Canvas.LineTo(x,y);
inc(i); end;
Form1.DXDraw1.Surface.Canvas.Pen.Color := clBlue;
//=================Desenha o Canal2=================================== h_factor := round(hscale2/hscale_default); i:=1; if Form1.en_canal2.Checked then while i <= (length(draw_buffer2)/h_factor) do begin // se chegou no fim do buffer, sai do loop if draw_buffer2[i] = -1 then break;
93
x := (i-1)*(Form1.DXDraw1.Width div (length(draw_buffer2) div h_factor)); y := draw_buffer2[i-1]; y := round((y/255)*Form1.DXDraw1.Height); // condicionamento do sinal
Form1.DXDraw1.Surface.Canvas.MoveTo(x,y);
x := (i)*(Form1.DXDraw1.Width div (length(draw_buffer1) div h_factor)); y := draw_buffer2[i]; y := round((y/255)*Form1.DXDraw1.Height); // condicionamento do sinal
Form1.DXDraw1.Surface.Canvas.LineTo(x,y);
inc(i); end;end;
end.//==================Fim da Rotina DRAW================================