Curso de Engenharia de Computação SISTEMA DE

Propaganda
Curso de Engenharia de Computação
SISTEMA DE AQUISIÇAO DE DADOS MICROCONTROLADO
COM COMUNICAÇÃO USB
Regis Gomes Luiz
Itatiba – São Paulo – Brasil
Dezembro de 2006
ii
Curso de Engenharia de Computação
SISTEMA DE AQUISIÇAO DE DADOS
MICROCONTROLADO COM COMUNICAÇÃO USB
Nome do autor: Regis Gomes Luiz
Monografia apresentada à disciplina Trabalho de
Conclusão de Curso, do Curso de Engenharia de
Computação da Universidade São Francisco, sob a
orientação do Prof. Ms. Paulo Eduardo Silveira de Tal,
como exigência parcial para conclusão do curso de
graduação.
Orientador: Prof. Ms. Paulo Eduardo Silveira
Itatiba – São Paulo – Brasil
DEZEMBRO DE 2006
iii
SISTEMA DE AQUISIÇAO DE DADOS MICROCONTROLADO COM
COMUNICAÇÃO USB
Regis Gomes Luiz
Monografia defendida e aprovada em 11 de dezembro de 2006 pela Banca
Examinadora assim constituída:
Prof Ms. Paulo Eduardo Silveira (Orientador)
USF – Universidade São Francisco – Itatiba – SP.
Prof Ms. Claudio Maximiliano Zaina (Membro Interno)
USF – Universidade São Francisco – Itatiba – SP.
Prof Dr. Joao Roberto Moro (Membro Interno)
USF – Universidade São Francisco – Itatiba – SP.
iv
Dedicatória
A meus pais Antonio e Gerolina, sem os quais
não chegaria até aqui.
A minha esposa Leslie, que ensinou-me a fé e o
amor.
A meu filho, Leonardo, a quem tantas horas de
brincadeiras
foram
compreendesse
o
adiadas
porquê
trabalhando”.
Sou eternamente grato a todos.
sem
de
que
este
“papai
está
v
.Agradecimentos
Agradeço primeiramente ao Professor Ms. Paulo Eduardo Silveira, meu orientador, que
acreditou em mim e incentivou-me para a conclusão deste trabalho, face aos inúmeros
percalços do trajeto.
Agradeço também a todos os professores, companheiros de percurso e de discussões
profícuas, dentro e fora do contexto deste trabalho, agraciando-me incontáveis vezes com sua
paciência, conhecimento e amizade.
Eu agradeço fraternalmente a todos.
vi
Sumário
Lista de Siglas ........................................................................................................................viii
Lista de Figuras ....................................................................................................................... ix
Abstract ..................................................................................................................................... x
1
Introdução .......................................................................................................................... 1
2 Descrição do sistema .......................................................................................................... 2
2.1
ARQUITETURA USB.................................................................................................. 2
2.2
Estrutura do Software USB ........................................................................................... 3
2.3
Topologia USB.............................................................................................................. 5
2.4
Estrutura Elétrica USB .................................................................................................. 6
2.5
Método de Comunicação Serial USB............................................................................ 8
2.6
Protocolo de Barramento USB.................................................................................... 10
2.7
Processo de enumeração.............................................................................................. 12
2.8
Descritores................................................................................................................... 12
2.9
Opção pelo uso da classe HID..................................................................................... 13
3 Microcontrolador............................................................................................................. 14
3.1
PIC16C745 .................................................................................................................. 14
3.2
CONVERSOR ANALÓGICO DIGITAL................................................................... 15
3.2.1 Modelos de conversores Analógico Digital..........................................................15
3.2.1.1 Conversor Analógico Digital Paralelo ........................................................... 16
3.2.1.2 Conversor Analógico Digital de Rampa Simples .......................................... 16
3.2.1.3 Conversor Analógico Digital de Rampa Dupla ............................................. 17
3.2.1.4 Conversor Analógico Digital de Aproximações Sucessivas.......................... 18
4 SISTEMA DESENVOLVIDO ........................................................................................ 19
4.1
Hardware ..................................................................................................................... 19
4.2
Software ...................................................................................................................... 20
5
DIFICULDADES ENCONTRADAS ............................................................................. 22
6
CONCLUSÃO .................................................................................................................. 23
APÊNDICE 1 – ESQUEMA ELÉTRICO DO CIRCUITO ............................................... 24
APÊNDICE 2 – SOFTWARE IMPLEMENTADO NO MICROCONTROLADOR ...... 25
APÊNDICE 3 – SOFTWARE IMPLEMENTADO NO PC ............................................... 27
REFERÊNCIA BIBLIOGRÁFICAS.................................................................................... 31
vii
REFERÊNCIA CONSULTADA........................................................................................... 32
viii
Lista de Siglas
USB
Universal Serial Bus
Mbps
Mega Bits por Segundo
PC
Personal Computer
API
Application Programming Interface
NRZI
Non Return to Zero Inverted
PROM
Programmable Read-only Memory
EPROM
Erasable Programmable Read-only Memory
EEPROM
Electrically Erasable Programmable Read-only Memory
RAM
Random Access Memory
LCD
Liquid Crystal Display
CCP
Capture, Compare e PWM
A/D
Analógica Digital
RISC
Reduced Instruction Set Computer
HID
Human Interface Descriptor
ix
Lista de Figuras
Figura 1- Distribuição das Camadas de Software USB.............................................................3
Figura 2 - Seqüência de eventos de conexão USB......................................................................5
Figura 3 - Topologia USB...........................................................................................................6
Figura 4 - Esquema Físico dos Sinais USB e Resistores............................................................8
Figura 5 - Resumo de um Pacote USB.......................................................................................9
Figura 6 - Descrição do Pacote Token......................................................................................10
Figura 7 - Descrição do Pacote Data .......................................................................................10
Figura 8 - Descrição do Pacote Handshake Packets.................................................................10
Figura 9 - Circuito Típico de um Conversor A/D Paralelo.......................................................16
Figura 10- Circuito Típico Simplificado de um Conversor A/D de Rampa Simples...............17
Figura 11 - Circuito Típico Simplificado de um Conversor A/D de Rampa Dupla.................17
Figura 12- Circuito Típico Simplificado de um Conversor A/D de Aproxim. Sucessivas.......18
Figura 13 - Interface com o PC.................................................................................................21
Figura 14 - Relatório de Medidas Adquiridas...........................................................................21
x
Resumo
Esta monografia tem como objetivo e a implementação de um sistema de aquisição de dados
de controle autônomo baseado um microcontrolador da linha PIC (Microchip) e com uma
interface de comunicação com um computador via USB. Para o funcionamento desta interface
foi desenvolvido um software residente no microcontrolador e outro no PC.
PALAVRAS-CHAVE: Microcontrolador, USB, PIC, aquisição.
Abstract
This monograph has as objective the implementation of a system of acquisition of data of
based independent control in a microcontroller of line PIC (Microchip) and with an interface
of communication with a computer saw USB. For the functioning of this interface a software
was developed that also acts in the control of the system.
KEY WORDS: Microcontroller, USB, PIC, Acquisiction.
1
1 INTRODUÇÃO
A aquisição de dados é o conjunto de métodos e dispositivos capazes de transformar
informações do mundo real, na maioria analógicas, para o formato digital, com o qual
funcionam os computadores. Um sistema de aquisição de dados é composto por um ou mais
dispositivos de entrada coletando dados para um computador ou para uma rede de
computadores, capaz de interpretá-los como grandezas físicas, necessitando de um software
adequado para isto.
Existe um número considerável de opções de sistemas de aquisição de dados, sendo
que a escolha do sistema adequado depende essencialmente do tipo de grandeza a ser medida
e do objetivo.
Com a finalidade de desenvolver um projeto para aquisição de dados baseado em
microcontrolador, foi desenvolvido um modelo de sistema com grande utilização
principalmente na indústria para controle de processos, como exemplo pode-se citar um
processo de controle de temperatura de um forno.
O objetivo é projetar e implementar um sistema autônomo de aquisição de dados de
baixo custo implementado com tecnologia disponível no mercado nacional com interface
USB (Universal Serial Bus) de comunicação com o PC.
2
2 DESCRIÇÃO DO SISTEMA
Objetivo principal deste projeto é o estudo e implementação de um modelo de
dispositivo capaz de realizar à aquisição de dados analógicos como temperatura, pressão
atmosférica, sons, etc..., através das portas de entrada analógica no o microcontrolador através
de um dispositivo chamado de conversor A/D disponível no mesmo e o armazenamento
destes dados em PC através de comunicação USB.
Quando solicitado, o microcontrolador atua de maneira autônoma enviando estes
dados através da interface USB disponível neste dispositivo para o PC.
Foi implementada uma interface de visualização de valores e gráfico, controle e
comunicação no PC utilizando a porta de entrada/saída USB. Esta interface foi implementada
utilizando a linguagem de programação Borland Delphi7 [10].
2.1 ARQUITETURA USB
A arquitetura USB foi desenvolvida por volta do ano de 1995 por um grupo de
empresas de tecnologia, como Compaq, Ibm, Microsoft, Nec e outras. O padrão USB permite
que sejam conectados até 127 equipamentos em cada PC, de forma plug and play, ou seja, não
necessitam de uma prévia configuração de recursos no hardware, e é capaz de trabalhar com
velocidades de transmissão de 1,5 Mbps ou 12 Mbps. Tudo isso sem a necessidade de
reinicialização no PC para executar as ligações e com reconhecimento automático de
periféricos adicionados.
A configuração da arquitetura USB é automática, sendo na maioria das vezes
desnecessária a preocupação com drivers e programas ao acrescentar novos dispositivos. As
controladoras USB detectam automaticamente a conexão ou remoção de um periférico,
gerenciam e controlam o driver e a largura da banda exigida por cada dispositivo.
Um dos benefícios deste padrão é substituir a infinidade de conectores diferentes
empregados nos PCs atuais. Uma rápida observação de um PC típico revela em média cinco
tipos de entrada ou saídas diferentes, entre portas seriais, paralelas, saídas para teclado,
mouse, joystick e outros acessórios.
Portanto é consenso na comunidade a substituição de todas essas portas de entrada ou
saída por um único tipo de comunicação, sendo que a tendência aponta para o padrão USB.
3
2.2 Estrutura do Software USB
Numa análise macro, a arquitetura USB é bem simples, pois é constituída por
hospedeiro (HOST) e por diversos dispositivos USB a ele conectados.
O USB possui uma organização das camadas de software necessárias para operar um
dispositivo, o sistema USB HOST é composto por vários níveis de hardware e software,
conforme mostrado na figura 1.
Figura 1 – Distribuição das Camadas de Software USB - [2]
No exemplo da figura 1, é mostrado um aplicativo do sistema operacional Windows
requerendo o acesso a um periférico USB da forma comum, como é feita para os periféricos
comuns e solicita as funções do aplicativo, porém também pode-se utilizar este modelo para
demonstrar aplicações como outros sistemas operacionais como Linux.
Após esta requisição, a API do Windows chama rotinas do driver cliente do
periférico USB instalado. Este driver faz a tradução dos comandos da API para comandos
USB. O driver cliente pode ser nativo do sistema operacional ou vem junto ao dispositivo
USB.
A terceira camada de software mostrada na figura é o driver USB, esta camada que
fornece ao sistema operacional o suporte ao USB.
4
A quarta camada mostrada é o driver do controlador Host, que funciona diretamente
no núcleo do sistema operacional. O Host estabelece o nível de software entre o hardware do
controlador HOST e o driver USB, esta camada que realiza os acessos de entrada e saída
necessários para a operação do dispositivo USB. O Host faz a interpretação das chamadas do
driver USB construindo uma lista de estruturas, um descritor de transferências, uma fila
principal e um buffer de dados para o controlador Host.
Na figura 1 também são mostradas mais duas camadas de hardware.
Sendo que uma delas é o Controlador Host, que é um circuito onde serão feitas as
conexões de todos os dispositivos USB.
Este circuito é gerenciado pelo Host e executa eletronicamente comandos solicitados
pelo Host e registra o estado das transações do USB..
A segunda camada de hardware é constituída pelo conjunto de dispositivos USB
conectados, que são os periféricos que usam esse tipo de barramento.
A possibilidade de conectar-se um novo dispositivo durante a execução do aplicativo
torna a USB extremamente versátil.
Na figura 2 é mostrado a seqüência de um processo de conexão de um periférico
USB. Primeiramente o controlador Host detecta a conexão e envia uma mensagem ao Host
para alertá-lo do ocorrido. Em seguida, o Host reenvia esta mesma notificação ao driver USB,
este faz a inicialização do driver cliente pertencente do periférico conectado, fazendo-o com
que fique operacional, de forma que o aplicativo possa dispor-se de seus recursos. [2]
5
Figura 2 – Seqüência de eventos de conexão USB - [2]
2.3 Topologia USB
No barramento USB podem ser conectados dispositivos, periféricos e hosts que
suportam este padrão. A interconexão física da USB usa a topologia tiered-star (estrela
disposta em camadas/níveis). Um hub é o centro de cada estrela. Cada segmento do cabo USB
é uma conexão entre o host um hub ou uma função. A Figura 3 ilustra a topologia do USB.
6
Figura 3 Topologia USB – [4]
2.4 Estrutura Elétrica USB
Os dispositivos USB podem ser de dois tipos; função ou Hub. A função é capaz de
transmitir ou receber dados e informações de controle pelo barramento.
São consideradas funções, dispositivos como mouse, teclado ou impressora. Cada
uma destes dispositivos contém informações descrevendo suas capacidades e os recursos dos
quais necessita.
O Hub é o elemento chave na topologia USB, pois é ele que permite a expansão do
número de conexões do sistema. Cada Hub converte um ponto de conexão em outros
múltiplos pontos. A arquitetura USB permite o uso de múltiplos Hubs.[2]
O USB permite dois modos de comunicação; um de alta velocidade, operando a 12
Mbps, e outro de baixa velocidade, a 1,5 Mbps. O modo de baixa velocidade visa a atender a
um pequeno número de dispositivos com largura de banda estreita, como mouses ou teclados.
Cada função é responsável por indicar em que modo irá operar.
O barramento físico USB é composto de um cabo blindado com quatro vias com
impedância diferencial de 90Ω, sendo elas VBus, D+, D- e GND, com cores padronizadas
como é mostrado na Tabela 1.
7
Tabela 1 Pinagem de cabo USB
Pino Sinal
Cor
1
Vbus (+5V)
Vermelho
2
D-
Branco
3
D+
Verde
4
GND
Preto
O fio VBus é o meio de fornecimento de alimentação para os dispositivos que
necessitarem dela. Em um sistema USB, existem hubs e funções que possuem alimentação
própria ou alimentados pelo barramento através de VBus que é nominalmente +5 V.
Para aplicações de alta velocidade, os fios D+ e D- devem ser entrelaçados ou
trançados no propósito de evitar perdas de dados causando erros de comunicação, já que
dados são transmitidos por estas vias.
O método que se usa para a transferência de dados nos fios D+ e D- é a diferenças de
tensão entre eles utilizando uma codificação NRZI (Non Return to Zero Inverted), desta forma
a quantidade de erros de transmissão é baixa, proporcionando uma robustez no protocolo
Os cabos são conectados aos dispositivos conforme ilustrado na figura 4. A posição
dos resistores de pull-up muda conforme a taxa de transmissão de dados, sendo quando
conectado um resistor de 15KΩ em D+ se trata de alta velocidade ou conectado um resistor
de 1,5KΩ em D- se trata de baixa velocidade.
Quando não existe nenhuma função conectada ao hub, os resistores de pull-down
fazem com que ambos D+ e D- fiquem abaixo de um valor de tensão de limiar para a detecção
da presença do dispositivo. Se essa condição persistir por mais que 2,5 µs é caracterizada uma
desconexão do dispositivo.
A conexão de um dispositivo é caracterizada pela situação oposta, ou seja, quando
apenas uma das linhas é levada além da tensão de limiar e esta situação persiste por mais de
2,5µs.
Conforme a especificação 1.0/1.1, uma função pode drenar até 100mA pelo cabo
USB.
8
Figura 4 - Esquema físico dos sinais USB e resistores – fonte [4]
2.5 Método de Comunicação Serial USB
Conforme descrito anteriormente, existem duas vias transportando 2 sinais, D+ e D-,
responsáveis pela comunicação serial entre o periférico e o hub, onde existem 3 estados
lógicos, conforme especificação USB, como é mostrado na Tabela 2.
Tabela 2 Estado de D+ e D- - [2]
Estado
D+
D-
J
Alto
Baixo
K
Baixo
Alto
SE0
Baixo
Baixo
Quando o barramento está ocioso, não ocorrendo nenhum tipo de atividade, este
ficará em estado J, ou seja D+ estará em nível alto e D- em nível baixo, isto ocorre devido R1
ser muito maior que R2, então D+ fica com um valor muito próximo a Vbus, devido o divisor
resistivo.
Esta situação é assegurada devido o resistor de pul-down em D- garantir que este
sinal fique em tensão nula.
Caso não haja nenhum dispositivo conectado, os dois resistores de pul-down
garantem um estado SE0 no barramento.
Uma comunicação entre dois terminais USB é realizada mediante transações, que são
constituídas pela transmissão de conjuntos de pacotes. O primeiro pacote é sempre iniciado
por um hub, que assume o papel de iniciador ou mestre do barramento. Dependendo do tipo
9
de transação, os pacotes seguintes podem ser reiniciados novamente tanto por um hub, quanto
por uma função.
Um pacote USB possui pelo menos três campos: sincronismo (SYNC), identificação
do tipo de pacote (PID) e fim de pacote, como mostra a Figura 5.
O pacote sincronismo é constituído pela transmissão da seqüência de estados
KJKJKJKK. Assim como o sincronismo, o identificador do tipo de pacote (PID) também é
transmitido pelo hub, com a característica de ser totalmente definido pelos quatro primeiros
estados, sendo que os quatro estados seguintes são construídos a partir dos complementos dos
quatro estados anteriores. Em seguida, dependendo do tipo de pacote, outros campos de dados
podem ser transmitidos, sendo que a direção do fluxo de informação também é dependente do
tipo de pacote. Todo pacote é encerrado com a transmissão de dois estados SE0, quando então
o barramento volta a ficar ocioso. Caso o hub amostre SE0 por um período de 2,5 µs, o hub
considera que o periférico foi desconectado fisicamente, o USB tem esta capacidade devido
aos dois resistores de pull-down ligados a D+ e D-[2].
A regra para transformar Js e Ks em 1s e Os é simples, apesar de não ser de forma
direta [2].
Para se transmitir um bit O, a codificação NRZI usada exige que se invertam os
estados nas linhas D+ e D-. No caso da transmissão dos bits 1s, os estados são mantidos. Com
esta regra, facilmente conclui-se que o identificador codificado por KJJJ, na Figura 5,
corresponde ao PID 1011, ou seja ao pacote do tipo DATA 1, como será visto mais adiante.
Na especificação USB, julgou-se conveniente que o barramento não ficasse em
estado J, ou seja, D+ em alto e D- em baixo, por muito tempo durante a transmissão de um
pacote. Para evitar esta situação, quando ocorre a transmissão de seis bits 1s em seqüência,
deve-se transmitir um bit 0 de forma redundante. Este bit deve ser naturalmente desprezado na
recepção, este bit extra é conhecido como stuff ou bit tolo.
Figura 5 Resumo de um pacote USB [2]
10
2.6 Protocolo de Barramento USB
A transmissão de dados via USB é baseada no envio de pacotes. A transmissão inicia
após o Controlador Host enviar um pacote descrevendo o tipo e a direção da transmissão, o
endereço do dispositivo USB e o referido número de endpoint.
A transmissão de dados pode ocorrer tanto do Host para o dispositivo quanto em
sentido contrário. O dispositivo USB faz a decodificação do campo de endereços e reconhece
se o pacote lhe é referente. Então a fonte do início da transmissão reenvia outro pacote de
dados ou informa que não há mais dados a transmitir. O destino responde com um pacote de
Handshake indicando se a transferência obteve sucesso.
O USB utiliza três tipos de pacotes, Token, Data e Handshake Packets, mostrados
nas Figuras 6, 7, 8 respectivamente. Nestes pacotes possuem os seguintes campos.
Figura 6 – Descrição do pacote Token – fonte [4]
Figura 7– Descrição do pacote Data - fonte [4]
Figura 8 – Descrição do pacote Handshake Packets – fonte [4]
11
O pacote Token é constituídos por outros 4 pacotes, são eles:
PID (Packet Identifier), é composto de oito bits. Os quatro mais significativos
identificam e descrevem o pacote e os restantes são bits de verificação para
prevenção de erros chamados de check bits. Esses check bits são constituídos
pelo complemento um dos quatros bits identificadores;
ADDR (Address), é composto de endereço do dispositivo USB envolvido.
Composto de 7 bits, limita o número de dispositivos endereçáveis no total de
127;
ENDP (Endpoint), é composto de 4 bits que representam o número do
endpoint envolvido. Permite maior flexibilidade no endereçamento de
funções que necessitem de mais de um subcanal;
CRC (Cyclic Redundancy Checks), é composto de 5 bits destinados à
detecção de erros na transmissão.
O pacote Data é constituído por outros 3 pacotes, são eles:
PID (Packet Identifier), é composto de oito bits, semelhante ao pacote Token;
DATA, e´ composto do pacote de bits de dados;
CRC (Cyclic Redundancy Checks), é composto de 16 bits destinados à
detecção de erros na transmissão.
Um Token Packet pode identificar o tipo de transmissão, tanto sendo de envio de
entrada para o Host, quanto para envio de saída para a função, de início de frame ou de
transferência de informações “configuração de controle” para o endpoint. O CRC de um
Token Packet possui 5 bits e atua apenas sobre os campos ADDR e ENDP, uma vez que o
PID possui seu próprio sistema de prevenção contra erros. Nos dados transmitidos via Data
Packet, devem ter um número inteiro de bytes. O CRC de um Data Packet possui 16 bits,
apenas agindo sobre o campo DATA.
O Handshake Packet é constituído apenas de um PID. Esse pacote pode ter quatro
significados:
O receptor recebeu os dados livres de erros;
O receptor não pode receber os dados;
O transmissor não pode transmitir;
O endpoint está em estado parado.
12
2.7 Processo de enumeração
O processo de enumeração é nome dado pelo mecanismo de configuração das funções
e hubs conectados ao hub raiz, sendo composto por transações do tipo controle.
O processo de enumeração ocorre inicialização do PC ou no ato de conexão de
funções. Um dos objetivos deste processo é permitir que o controlador Host atribua um
número de identificação às funções, esse numero varia de 1 a 127 e é identificador de
endereço do dispositivo localizado no campo ADDR de 7 bits presente nos pacotes do tipo
token.
Outro objetivo do processo de enumeração é fazer com que o host receba as
características do periférico USB e de seu fabricante, além de saber que modalidades de
transação será utilizada nos ciclos de barramento para cada função.
2.8 Descritores
Descritores é o nome dados a mensagens que a função transmite enviando
informações de suas características, tanto de hardware quanto de software.
Basicamente a USB possui 5 tipos de descritores, são eles:
Descritor de Dispositivo – este descritor, serve para identificar alguns
atributos do periférico e de seu fabricante como tipo, versão de USB ID do
fabricante ID do produto, nome do fabricante, nome do produto, número
serial e número de configuração;
Descritor de configuração – O descritor de configuração define as
informações a serem passadas para o controlador Host, porém muitas vezes,
são necessários outros pequenos descritores, que serão analisados mais
adiante;
Descritor de interface – Este descritor é uma das possíveis estruturas de dados
que podem ser transmitidas logo após o descritor de configuração ter enviado
dados como o comprimento total do frame informando o número de bytes
associados à configuração;
Descritor HID - Este descritor é mais utilizado devido a grande vantagem de
não ser preciso desenvolver um device-driver para acessar o protótipo, já que
o sistema operacional já tem embutido um driver com funções básicas de
entrada e saída para a classe HID. Este descritor possui campos como tipo;
13
versão do HID, código do país, descritores restantes, relatório e tamanho de
relatório;
Descritor de Endpoint – Este descritores tem como das finalidades informar
o endereço do endpoint ou função .
2.9 Opção pelo uso da classe HID
A opção pelo uso da classe HID facilita bastante o trabalho de programação dos
aplicativos para PC. A comunicação entre o periférico USB pode então valer-se de funções
simples da API presentes nas bibliotecas hid.dll e setupapL.dll do Windows
14
3 MICROCONTROLADOR
Atualmente o uso de microcontroladores vem crescendo muito devido à
versatilidade, ao aumento da capacidade de processamento de instruções e ao custo reduzido
destes dispositivos, embora complexos e sofisticados.
Um microcontrolador nada mais é do que um microprocessador acrescido de
dispositivos como:
Endereçadores de I/O e de memória;
Memórias de programa como PROM, EPROM ou EEPROM;
Memória volátil como RAM;
Canais seriais, interface USB;
Temporizadores, interface para display (LCD);
Módulo CCP (Capture, Compare e PWM);
E muito outros dispositivos e interfaces, dependendo do modelo. Tudo isto
em uma única pastilha.
Os microcontroladores da família PIC são dispositivos RISC, isto é, um Computador
com SET de Instruções Reduzido [1] fazendo existir poucas instruções – aproximadamente 35
instruções. Possui também arquitetura HARVARD, onde se utiliza o barramento de memória
de programa distinto ao barramento de dados e o fluxo de instruções é PIPELINE, isto é,
enquanto se executa uma determinada instrução, a próxima já está sendo lida. Isto faz com
que haja um aumento considerável na velocidade de execução de uma instrução.
3.1 PIC16C745
O PIC16C745 é o componente de maior importância utilizado neste projeto. Através
dele foi desenvolvida toda a lógica de aquisição de dados, converção A/D e implementação
da interface de comunicação USB.
Esse microcontrolador em particular possui 28 pinos sendo 22 pinos utilizados com
entrada/saída e 5 pode ser utilizável como canais analógicos com resolução de 8 bits. Possui
35 palavras de instrução, clock de até 24MHz, 256 bytes de memória de dados, 256 bytes de
memória programa e memória EPROM.
Neste projeto utilizaremos a versão PIC16C745/JW, devido à sua característica de
possuir uma janela em seu invólucro, podendo ser apagado quando exposto à luz ultravioleta,
podendo assim ser programado e apagado várias vezes.
15
Tabela 3 – Descrição do PIC16C745 – fonte [5]
Características
PIC16C745
Freqüência de operação.
6 MHZ ou 24 MHZ
Resets (e atraso)
POR, BOR (PWRT, OST)
Memória de programa (14 bits de palavra)
8K
Memória de dados (bytes)
256
Dual port ram
64
Interrupções
11
Portas entradas e saídas
22
Temporizadores
3
Módulos Capture/Compare/PWM
2
Módulo conversor analógico digital
5 canais de 8 bits
Comunicação serial
USB, USART/SCI
Detecção de reset (Brown out)
Sim
3.2 CONVERSOR ANALÓGICO DIGITAL
Conversor A/D é um circuito que converte níveis de tensão ou corrente em valores
numéricos correspondentes (digital) [3]. São a base de qualquer instrumento de medição
digital.
Este circuito funciona da seguinte forma: a tensão de entrada, Vi, é dividida por uma
tensão de referência contínua, Vref, e representando o resultado da divisão numa palavra
digital, W, através de um certo código.
A divisão e o código são obtidos por algoritmos especiais que determinam o tipo e a
resolução do conversor A/D.
3.2.1
Modelos de conversores Analógico Digital.
Basicamente existem quatro principais modelos de conversores A/D, cada um deles
com topologia e circuito característicos específicos, priorizando a velocidade de conversão, a
resolução, a simplicidade ou o custo.
16
3.2.1.1
Conversor Analógico Digital Paralelo
Neste modelo o processo de conversão A/D é feito de modo paralelo, isto é, todos os
bits são gerados simultaneamente, o que possibilita uma maior velocidade de operação. O
sinal de entrada é comparado com 2n-1, sendo n o número de bits do conversor, valores
intermediários de tensão distribuídos linearmente dentro da faixa dinâmica do conversor.
Para cada valor intermediário é utilizado um comparador de tensão. A saída dos
2n-1 comparadores é combinada por um conjunto de portas digitais, fornecendo o resultado
de saída em código binário.
O circuito típico do conversor Analógico Digital Paralelo é mostrado na figura 9.
Figura 9 - Circuito típico de um Conversor A/D Paralelo.
3.2.1.2
Conversor Analógico Digital de Rampa Simples
Neste modelo, o processo de geração do código binário de conversão é baseado
numa rampa de tensão linear no domínio do tempo, obtida pela integração da tensão de
entrada Vi.
O tempo gasto para a rampa de tensão atingir um nível de tensão de referência é
acumulado por um contador digital de n bits, sendo proporcional à tensão de entrada. A rampa
de tensão é iniciada juntamente com o contador e a contagem prossegue até que o nível de
referência seja atingido.
17
A função integral funciona também como um filtro passa-baixa do sinal de entrada.
Este modelo, possui um circuito simples e de baixo custo, como é mostrado na figura 10,
porém com um tempo de conversão elevado. É utilizado quando se necessita de médias e altas
resoluções entre 8 à 12 bits. Este modelo possui também uma alta imunidade a ruído devido à
integração do sinal de entrada.
Figura 10 Circuito típico simplificado de um conversor A/D de Rampa Simples.
3.2.1.3
Conversor Analógico Digital de Rampa Dupla
Neste modelo, a conversão A/D é executada através de uma integração, usando um
integrador para converter o valor da tensão de entrada num intervalo de tempo.
Existem vários circuitos que utilizam integradores, alguns mais simples, porém com
um maior número de erros, outros mais complexos, como o de quádrupla rampa, que reduz
ainda mais os erros que o de dupla rampa, como é mostrado na figura 11.
Figura 11- Circuito típico simplificado de um Conversor A/D de Rampa Dupla.
18
O comutador eletrônico seleciona alternadamente a tensão de entrada Va e uma
tensão de referência Vref controlado pelo circuito lógico.12 Este circuito lógico contém um
contador de n bits. No início da conversão, o contador de n bits está em zero e o capacitor C
está descarregado. A tensão de saída do integrador Vi é zero.
O comutador está ligado à tensão analógica de entrada Va, supondo que esta seja
constante e positiva. A partir do instante inicial, a tensão Vi vai aumentar negativamente, com
um declive constante.
3.2.1.4
Conversor
Analógico
Digital
de
Aproximações
Sucessivas
Este modelo é o mais comum dos circuitos de conversão A/D por comparação, que
se caracterizam pela comparação realizada entre o valor analógico a converter e uma
aproximação desse valor gerado pelo conversor. Para gerar esse valor analógico, o circuito
inclui um conversor D/A (digital analógico), como é mostrado na figura 12.
Figura 12 – Circuito típico simplificado do Conversor A/D de Aproximações Sucessivas.
Os vários circuitos A/D do tipo de comparação diferem na função do circuito lógico.
No caso do conversor de aproximações sucessivas, cada um dos bits do código é ligado, isto
é, em nível lógico 1 sucessivamente, do mais significativo para o menos significativo, e a
tensão resultante da aplicação do código ao conversor D/A é comparada com a tensão de
entrada Va.
Caso a tensão de entrada for maior, o bit mantém-se em 1, se a tensão de entrada for
menor, o bit é forçado a 0. Cada ciclo para determinação de um bit que é feito é contado um
ciclo de relógio, para uma conversão de n bits, demora n ciclos de relógio para ocorrer.
Este modelo de conversor A/D foi destacado por ser este o utilizado na maioria de
microcontroladores da linha PIC, em especial o PIC16C745 que utilizaremos no projeto.
19
4
SISTEMA DESENVOLVIDO
O projeto foi dividido em dois segmentos, o projeto de hardware e o software.
O hardware é composto pelo microcontrolador, cabo e componentes eletrônicos
necessário para o funcionamento do sistema.
O software é dividido em duas partes, uma implementada no microcontrolador e uma
outra lógica implementada no PC.
4.1 Hardware
Como foi mencionado, foi utilizado um microcontrolador PIC16C745/JW. Para
permitir o funcionamento do microcontrolador, foi montado um circuito eletrônico com
capacitores, resistores e dois cristais osciladores, um com freqüência de 24MHZ (utilizado
para gerar o sinal de clock para o microcontrolador) e o outro com freqüência de 32KHZ
(responsável pelo tempo de estouro da interrupção do microcontrolador). Todo circuito é
alimentado com o Vbus de 5V do barramentro USB.
Os pinos utilizados no microcontrolador foram:
Pinos 20(VDD), 19 e 8 (ambos VSS), responsáveis pela alimentação e terra;
Pinos 9 (OSC 1) e 10 (OSC 2), responsáveis pela entrada de sinal de clock de
24MHZ;
Pino 1 (MCLR), este pino fica com nível alto, porém é ligado a uma chave
que o deixa em nível baixo gerando um reset no microcontrolador;
Pino 2 (AN1), este pino fica a entrada de um dos canais analógicos do
microcontrolador;
Pinos 11(T1CKI) e 12(T1OSI), pinos responsáveis pela entrada do sinal do
cristal oscilador de 32KHZ, responsável pelo interrupção;
Pinos 14 (VUSB), 15 (D-) e 16 (D+), pinos responsáveis pela transferência de
dados USB.
No pino 15, portas D-, foi colocado um resistor de 1,5KΩ em paralelo com Vbus, por
se tratar de uma configuração USB 1.1. O circuito elétrico pode ser visto no apêndice 1.
20
4.2 Software
O software do microcontrolador foi implementada em linguagem de programação C
utilizando do compilador CCS[7]. No apêndice 2 pode ser visualizada esta implementação.
Este compilador já fornece várias bibliotecas para este dispositivo, tais como
pic_usb.h e usb.c que são responsáveis pela comunicação USB, bem como algumas funções
como bit_set, bit_clear, set_adc_channel(), entre outras.
No projeto foram desenvolvidas funções para determinadas tarefas, tais como:
envio_buffer() – essa função é responsável pelo envio dos dado armazenado
num buffer previamente criado, ela é chamado quando recebe uma solicitação
do aplicativo no PC;
cont_timer()
–
essa
função
faz
um
controle
de
interrupção
do
microcontrolador;
void main() – essa é a função principal do programa, responsável pela
inicialização dos conversores A/D, onde é feita uma média aritmética entre as
três ultimas medidas verificação de solicitação do Host USB.
O software do PC foi desenvolvida em Borland Delphi7 [10] e através de classes
disponíveis no compilador disponibilizam o suporte a comunicação USB, como exemplo a
HidControllerClass e a HID.
O programa possui uma interface gráfica onde pode-se visualizar o gráfico de
medidas coletadas em tempo real, como é visto na Figura 13. Através desta interface é
possível solicitar ao microcontrolador que envie os dados salvos nas posições do buffer, não
necessitando que o sistema esteja sempre acoplado ao PC, quando houver uma variação
muito rápida no sinal de entrada o microcontrolador é capaz de guardar esta informação em
um endereço de memória e enviar ao PC, posteriormente quando solicitado.
Porém deve-se lembrar que, no caso do microcontrolador operar com a USB
desconectada deverá ser feita uma pequena alteração de alimentação do microcontrolador,
fazendo com que a alimentação seja de uma fonte externa e não mais do Vbus do barramento
USB.
21
Figura 13 - Interface com o PC
Também é possível gerar um arquivo texto como relatório das medidas coletadas
pelo microcontrolador como é mostrada na Figura 14.
Figura 14 Relatório de medidas adquiridas
22
5
DIFICULDADES ENCONTRADAS
No decorrer do projeto algumas dificuldades foram encontras, tais como:
Pouca literatura sobre USB, principalmente em Língua Portuguesa, a maioria
de artigos encontrados vinham das mesmas fontes, portanto semelhantes;
Dificuldade na implementação do
software do microcontrolador,
primeiramente utilizando o compilado MPLAB IDE da Microchip, onde foi
abandonado e migrado para o CCS utilizando-se de linguagem de
programação C, uma linguagem já conhecida;
Dificuldade na programação do PIC devido tempo elevado, já que o mesmo
tinha que ser apagado com exposição a luz ultravioleta em todos os testes na
implementação.
23
6
CONCLUSÃO
A pesquisa desenvolvida durante a execução deste trabalho buscou conhecimento
sobre a arquitetura USB, um dispositivo com características extremamente inovadoras [2],
provando ser capaz de substituir a maioria dos dispositivos comunicação entre PC e
periféricos.
Na aplicação mostrada foi observada uma melhor funcionalidade de dispositivos
USB quanto à velocidade de transmissão de dados, comparados com outras portas disponíveis
em PC comuns.
Observando estas características, é cada vez maior a tendência de substituição por
dispositivos USB, sistemas de aquisição de dados com interface com PC com comunicação
serial comum.
Este estudo proporcionou um conhecimento melhor em microcontroladores,
principalmente os da linha PIC, dispositivos versáteis, que podem ser incorporados em várias
aplicações. Ressalta-se também a facilidade de implementação destes dispositivos ulizando-se
o compilador CCS devido a possibilidade de implementação em linguagem de programação
C.
6.1
Extensões
Este trabalho pode ser continuado com a adição ao sistema de um módulo de
memória adicional, para que o mesmo seja capaz de gravar maior quantidade de dados, já que
neste projeto apenas foi utilizada a memória RAM disponível no microcontrolador.
Também poderá ser implementada a medição de grandezas físicas como temperatura.
24
APÊNDICE 1 – ESQUEMA ELÉTRICO DO CIRCUITO
Valores de componentes:
R1= 10 KΩ
R2= 1,5 KΩ
C1= 10 pF
C2= 10 pF
C3= 220 nF
C4= 33 pF
C5= 33 pF
X1= 24 MHz
X2= 32 KHz
25
APÊNDICE 2 – SOFTWARE IMPLEMENTADO NO
MICROCONTROLADOR
///////////////////////////////////////////////////////////////////////
//AQUISICAO DE DADOS VIA USB
//
//////////////////////////////////////////////////////////////////////
#include <16C745.h>
#device *=16
#fuses HS,NOWDT,NOPROTECT
#use delay(clock=24000000)
#DEFINE USB_HID_DEVICE TRUE
#DEFINE USB_RUN_WHEN_CONFIGURED TRUE
#define USB_EP1_TX_ENABLE USB_ENABLE_INTERRUPT
#define USB_EP1_TX_SIZE 8
#define USB_EP1_RX_ENABLE USB_ENABLE_INTERRUPT
#define USB_EP1_RX_SIZE 8
#include < usb_desc_hid.h>
#include <pic_usb.h>
#include <usb.c>
#include <stdlib.h>
#priority timer1,usb
//Variaveis globais
int buffer[80];
int data_out[8];
int data_in[8];
int c;
int x;
struct status_type
{
int usb_ok;
} status;
#byte PIE1=0x8C
#byte T1CON=0x10
#byte TMR1H=0x0F
void envia_vetor()
{
int i;
bit_clear(PIE1,0);
x=data_in[4];
c=data_in[5];
bit_clear(UCTRL,3);
delay_ms(50);
reset_cpu();
}
#separate // Compilador compila a funcao abaixo em sepadado
#int_timer1
void cont_timer()
{
int i;
bit_set(TMR1H,7);
if (status.usb_ok)
{
data_out[3]=0;
while ((!usb_put_packet(1, data_out, USB_EP1_TX_SIZE, TOGGLE))
{
delay_ms(1);
}
}
}
void main()
{
int i;
int adc_buff;
int16 media;
26
static int16 resto_out[3];
int j;
int w;
w=x;
setup_adc_ports(AN0_AN1_AN3); //inicia o A/D
setup_adc(ADC_CLOCK_DIV_32);
set_adc_channel(0);
delay_ms(10);
data_out[0]=read_adc();
usb_set_configured(1);
usb_init();
usb_wait_for_enumeration();
status.usb_ok=1;
enable_interrupts(GLOBAL);
bit_set(PIE1,0);
setup_timer_1(T1_EXTERNAL);
bit_set(T1CON,3);
set_timer1(0x80);
while(usb_enumerated())
{
if (c=1)
{
set_adc_channel(0);
delay_ms(10);
med_adc=read_adc();
buffer[b]=med_adc;
if(b<80)
{
b=b+1;
}
else
{
b=0;
}
media= ((((int16) data_out[0]+med_adc)+resto_out[0])/2);
resto_out[0]= ((((int16) data_out[0]+adc_buff)+resto_out[0])%2);
data_out[0]=media;
}
else
{
for (j=0;j<w;j++)
{
data_out[0]=buffer[j];
delay_ms(50);
}
}
if (usb_kbhit(1))
{
if (usb_get_packet(1, data_in, USB_EP1_RX_SIZE))
{
usb_ep1_rx_status.rx=0;
usb_ep1_rx_status.ov=0;
switch (data_in[0])
{
case 0xA1: envia_vetor();
break;
}
}
else
{
bit_clear(UCTRL,3);
delay_ms(50);
reset_cpu();
}
}
}
status.usb_ok=0;
bit_clear(UCTRL,3);// limpa o 3º bit do regist. uctrl, deixa d- e d+ em alta impedance
delay_ms(50);
reset_cpu();
}
27
APÊNDICE 3 – SOFTWARE IMPLEMENTADO NO PC
unit Principal;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls,
Forms, Dialogs, StdCtrls, Menus,
HidControllerClass, Hid, ExtCtrls, TeeProcs, TeEngine, Chart, Series,
Buttons;
type
Tvisual = class(TForm)
DataChart: TChart;
Acq_Timer: TTimer;
MainMenu: TMainMenu;
TempGroupBox: TGroupBox;
TempLabel: TLabel;
Arquivo1: TMenuItem;
Configuraes1: TMenuItem;
Sair: TMenuItem;
Series1: TFastLineSeries;
Monitorar: TMenuItem;
Aquisitar: TMenuItem;
SaveDialog: TSaveDialog;
procedure FormCreate(Sender: TObject);
procedure Acq_TimerTimer(Sender: TObject);
procedure SairClick(Sender: TObject);
procedure MonitorarClick(Sender: TObject);
procedure AjustarDHClick(Sender: TObject);
procedure AquisitarClick(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure PararClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
visual: Tvisual;
X: integer;
buffer: array [0..8] of Byte;
towrite: DWORD;
toread: DWORD;
red:
DWORD;
written: DWORD;
28
u:
DWORD;
Temperatura:TJvHidDevice;
HidController: TJvHidDeviceController;
AcqFlag: Boolean;
AcqCounter,AcqCounterRef: integer;
implementation
uses MedAdjUnit, AcqIntervalUnit;
{$R *.dfm}
const
crlf = #13#10;
procedure Tvisual.FormCreate(Sender: TObject);
var
iX: integer;
begin
AcqFlag:=False;
HidController := TJvHidDeviceController.Create(Self);
DataChart.Series[0].Clear;
for iX:=-60 to 0 do
begin
DataChart.Series[0].AddXY(iX,0,'',clTeeColor);
end;
X:=0;
end;
procedure Tvisual.Acq_TimerTimer(Sender: TObject);
var
Valor: integer;
begin
if HidController.CheckOutByID(Temperatura,$0461,$0020) then
begin
ZeroMemory(@buffer,Sizeof(buffer));
toread := Temperatura.Caps.InputReportByteLength;
red
:= 0;
if Temperatura.ReadFile(buffer,toread,red) then
begin
inc(AcqCounter);
Valor:= round(buffer[1]);
TempLabel.Caption:=(IntToStr(Valor));
if AcqFlag and (AcqCounter=AcqCounterRef) then
begin
Writeln(Output, Valor:15);
AcqCounter:=0;
end;
DataChart.Series[0].Delete(0);
DataChart.Series[0].AddXY(X,Valor,'',clTeeColor);
Inc(X);
Temperatura.ReportTypeParam
:= HidP_Input;
Temperatura.LinkCollectionParam := 0;
Temperatura.UsagePageParam
Temperatura.UsageParam
:= $ffa1;
:= $04;
end
else ShowMessageFmt('Erro(%d).',[GetLastError()]);
29
HidController.CheckIn(Temperatura);
end
else
begin
Acq_Timer.Enabled:=False;
ShowMessage('Erro de comunicação!');
HidController.Destroy;
Close;
end
end;
// funcao sair
procedure Tvisual.SairClick(Sender: TObject);
begin
Acq_Timer.Enabled:=False;
if AcqFlag then CloseFile(output);
Close;
end;
// funcao monitorar
procedure Tvisual.MonitorarClick(Sender: TObject);
begin
Acq_Timer.Enabled:=True;
end;
procedure Tvisual.AquisitarClick(Sender: TObject);
begin
if AcqFlag then Acq_Timer.Enabled:=True
else
begin
SaveDialog.Execute;
AssignFile(Output,SaveDialog.FileName);
Rewrite(Output);
Writeln(Output,'Posiçao
Medida
':10,
':10, ;
if Acq_Timer.Enabled=False then Acq_Timer.Enabled:=True;
AcqFlag:=True;
end;
end;
procedure Tvisual.AjustarDHClick(Sender: TObject);
begin
Acq_Timer.Enabled:=False;
MedAdjForm.show;
end;
// finaliza
procedure Tvisual.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Acq_Timer.Enabled:=False;
if AcqFlag then CloseFile(Output);
end;
// parar
procedure Tvisual.Parar1Click(Sender: TObject);
var
iX: integer;
30
begin
Acq_Timer.Enabled:=False;
if AcqFlag then
begin
AcqFlag:=False;
CloseFile(Output);
// fecha arq de saida
end;
DataChart.Series[0].Clear;
for iX:=-60 to 0 do
begin
DataChart.Series[0].AddXY(iX,0,'',clTeeColor);
end;
X:=0;
end;
initialization
AcqCounter:=0;
AcqCounterRef:=1;
end.
31
REFERÊNCIA BIBLIOGRÁFICAS
[1] SILVA Jr., Vidal Pereira. Microcontroladores PIC – teoria e prática. 1998.
[2] ZELENOVSKY, Ricardo; MENDONÇA, Alexandre.PC: Um Guia Prático de
Hardware e Interfaceamento. 2002
[3] SILVA Jr., Vidal Pereira.Aplicações Práticas do Microcontrolador 8051. 1999
[4] Especificação USB 1.0/1.1
URL: http://www.usb.org. Recuperado em 21/06/2006.
[5] Data sheet, PIC16C745, 8-Bit CMOS Microcontrollers with USB. Microchip
Technology, 2002.
URL: http://www.microchip.com. Recuperado em 05/06/2006.
32
REFERÊNCIA CONSULTADA
[7] C Compiler Reference Manual, 2003. URL:
http://www.ccsinfo.com. Recuperado em 05/10/2006.
[8] CASTRO, Rômulo; BARROS, Jose. USB com Microcontrolador PIC16C745 Revista
Saber eletrônica outubro 2006
[9] PEREIRA, Fábio. Microcontroladores PIC – Programação em C. Érica, 2ª edição,
2003.
[10] CANTU, Marco.Delphi 7 A Bíblia. 2003
Download