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