Osciloscópio Digital De 4 canais e Analisador Lógico de até 16 Canais Renato Batista Pereira 1030375 Departamento de Engenharia Electrotécnica Instituto Superior de Engenharia do Porto 2009 1
4 - Descrição do Circuito 4.1 - Desenvolvimento da placa de comunicação USB: O tipo de comunicação utilizada é USB e para tal foi usada a PIC18F4550, pois, já tem integrado uma porta USB. A comunicação USB foi escolhida porque é um meio de comunicação que nos permite elevadas taxas de transmissão, o que não era exequível com o protocolo RS232. Para tal usamos o esquema em baixo que nos permite realizar a parte da comunicação com o PC. Figura 3 USB Basic Board Este circuito simples é o requisito mínimo para estabelecer comunicação USB com o PC. Realizamos este esquema através da informação adquirida pelo fabricante Microchip. O hardware ilustrado só por si não faz nada, para tal é preciso programa-lo com o Bootloader, programa este, que possui todas as rotinas do protocolo USB bem como o processo de inicialização da PIC. O Bootloader 50
desenvolvido foi uma alteração do disponibilizado pelo fabricante que estava preparado para outro tipo de hardware, nomeadamente as boards de desenvolvimento da Microchip. O software utilizado para compilar o código foi o MPLAB C18, disponibilizado pela Microchip. Depois de compreender o Bootloader, disponível pelo fabricante, procedemos á modificação para compatibilizar com o nosso hardware. No entanto os programadores de PIC do ISEP não tinham suporte para programar a PIC18F4550, o que fez regressar ao trabalho de pesquisa por um programador que nos permitisse programar a PIC. 4.2 - Placa programadora Para programar a PIC, utilizamos um programador básico do tipo JDM que nos permitiu programar o dispositivo pela porta RS232. Figura 4 Programador JDM 51
Depois de programada a PIC, testamos o firmware ligando ao PC. Tivemos alguns problemas no inicio pois nem sempre o firmware funcionava bem ou nem mesmo funcionava. Com umas rectificações atingiu-se o funcionamento correcto. De momento, o dispositivo estabelece comunicação com o PC e possui a possibilidade de ser programado via USB. Para tal é necessário o driver USB da PIC 18F4550 e o pacote de desenvolvimento PICDEM FS USB Starter Kit. Quanto ao desenvolvimento do Osciloscópio, foi decidido desenvolver um osciloscópio de 4 canais. Para isso utilizou-se a seguinte filosofia: Figura 5 Fluxograma Hardware Na primeira fase, o circuito de condicionamento de sinal é feito com Amplificadores Operacionais e controlado por computador. De seguida, o sinal é convertido pelo AD e transmitido à PIC que envia a informação para o PC, e este mostra o sinal na aplicação desenvolvida em visual Basic. 4.3 - Condicionamento de sinal A parte de condicionamento de sinal resume-se a um conjunto de ampops que transformam uma variação de sinal na entrada para uma variação de sinal na saída entre [0,+5] V, independentemente dos valores de entrada, o ganho dos ampops pode 52
ser controlado por PC através de um switch analógico fornecido como sample da Maxim. Figura 6 Condicionamento de sinal universal Os Amplificadores Operacionais estão contidos num integrado (CA320EN), em par, num formato DIP de 8 pinos. A primeira etapa tem montagem de amplificador inversor. Este amplificador condiciona a onda de entrada Vi para que as amplitudes máximas sejam sempre de 2.5 V de pico. O switch/multiplexer analógico usado é o Max 338. Este componente permite fazer uma selecção das resistências de forma simples e sem alterações no circuito de montagem inversora. Em baixo está ilustrada a tabela de verdade do Max338. Tabela 4 Tabela MAX338 As entradas A2 a A0 são controladas pelo utilizador na aplicação em Visual Basic permitindo total controlo do dispositivo. 53
Para cada canal de selecção, foram calculadas as resistências R2, em que R1=10k. Variação Vi (Vp) Vo1 (Vp) Ganho 1º Ampop R (Ohm) 0,1 2,5 25 250000 0,2 2,5 12,5 125000 0,5 2,5 5 50000 1 2,5 2,5 25000 2 2,5 1,25 12500 5 2,5 0,5 5000 10 2,5 0,25 2500 20 2,5 0,125 1250 Tabela 5 Ganhos de selecção de tensão Estes ganhos foram calculados de acordo com a fórmula: R2 A = R1 Para garantir os ganho de uma forma perfeita ou mais próxima da ideal usamos potenciómetros para garantir os valores exactos de resistência. No entanto, nesta fase, para as variações máximas do sinal para cada selecção, o sinal na saída do primeiro ampop varia entre [-2.5;2.5] V. O AD funciona com tensões de referencia de [0;+5] V, e para garantir isso, utilizamos um circuito somador na saída da primeira etapa do circuito para somar uma componente continua de +2,5V. O potenciómetro R53 é variado na fase final para que a tensão de referência seja 2,5V e os potenciómetros R49, R50 e R54 são iguais, para que a saída do circuito seja: Vo 2 = Vref + Vo1 Assim é garantido um condicionamento de sinal de [0,+5] V para qualquer tipo de variação de entrada. 54
4.4 - Conversão Analógico para Digital O AD utilizado é o Max154, de 8 bits, com uma taxa de conversão de 2.5µs. Possui 4 entradas analógicas, o que possibilita lerem 4 sinais analógicos com o mesmo integrado. O circuito seguinte representa o circuito do AD: Figura 7 Circuito básico para o AD MAX154 Os 4 diodos que estão na entrada analógica servem para em caso de sobretensão não danificar o AD. Os 2 bits de selecção de canal servem para seleccionar um dos 4 canais para o AD converter, o bit de leitura é o bit que serve de amostragem, que faz com que o AD converta a uma taxa de amostragem predefinida pelo utilizador. Este bit a 1 faz com que o AD desligue, a 0 faz a conversão e leitura. O barramento de dados está ligado ao Porto B da PIC que processa e envia os dados para o PC. 4.5 - PIC18F4550 Este dispositivo e o núcleo principal de todo este projecto. É ele que controla os componentes, processa os dados e os transmite para o PC. É baseado no ultimo modelo de microprocessador RISC da Microchip. Funciona a cerca de 40 MHz com 10 MIPS. 55
4.6 Esquema da Placa Global Aqui temos o desenho completo do trabalho realizado, com todos os componentes descriminados: Figura 8 Circuito global em schematic 56
4.8 - PCB do esquema Global Figura 9 Circuito global em PCB 57
5 - Descrição do Programa/Código 5.1 - Software Bootloader O bootloader da Microchip é uma sequência de código de inicialização que configura a PIC para poder receber dados pela interface de USB, permitindo a execução de comandos provenientes de uma aplicação de programação no PC, para descarregamento de código desenvolvido pelo construtor através da mesma interface USB. Este bootloader é vantajoso em comparação com a programação em programador externo, pois não é necessário remover a PIC do circuito onde ela opera, permitindo apagar e programar novas aplicações em caso de actualização ou necessidade de alteração do software. É comummente denominado como Flash Bootloader pois permanece na memória flash do microprocessador e é sempre a primeira aplicação a ser executada após o reset. O bootloader da Microchip foi descarregado para a PIC por meio do programador JDM em conjunção com a aplicação WinPic800. Foi necessário ajustar as palavras de configuração do ficheiro.hex devido às alterações existentes no hardware (cristal, temporizador interno, modo USB, interrupções, etc). Embora houvesse dificuldade na calibração correcta das palavras de configuração, após análise da datasheet e consulta online do fórum da Microchip, a programação da PIC foi bem sucedida, visto a PIC enumerar e autenticar correctamente por USB quando conectada. O Source Code do Bootloader não foi alterado, apenas foi estudado de forma a aprofundar o conhecimento sobre a programação da interface USB. 58
O cabeçalho do código principal do Bootloader está apresentado na figura seguinte: Figura 10 USB Bootloader Version 1.00 59
O funcionamento do bootloader é descrito no diagrama de blocos seguinte e no texto que o procede: Figura 11 Fluxograma Software PIC Após o inicio do programa ( Start ), são inicializados os registos, definidas variáveis e verificadas os pinos dos portos que definem se o código do bootloader será executado ( Bootloader Button Pressed ). Se o pino 2 do Porto E estiver no nível lógico zero, o código a executar será o do bootloader. O código do bootloader começa por inicializar as portas dos leds para coloca-los a piscar, em padrões definidos (ver tabela no capitulo seguinte), consoante o estado de comunicação do módulo USB ( minitallleds ). 60
De seguida, é configurado o módulo USB interno e inicializados os buffers dos canais de entrada e saída ( minitializeusbdriver ). O estado da interface USB no hardware é verificada ( USBCheckBusStatus ) e o serviço de enumeração e autenticação USB é inicializada ( USBDriverService ). Caso a enumeração não ter terminado ou ainda se encontrar em progresso, a secção de código do BootService não é executada. Se a interface de comunicação USB estiver completamente configurada e correctamente enumerada, os leds devem piscar alternadamente, indicando canal preparado para comunicação. O programa ficará a correr em ciclo fechado apenas colocando os leds nos estados lógicos do estado da interface USB, esperando a recepção de um comando de controlo vindo pelo USB por parte da aplicação no PC ( USBDriverService ), executando o código ao qual o comando se refere, preparando a resposta à execução do comando ( BootService ) e enviando os dados de volta à aplicação no PC ( USBDriverService ). Os comandos, enviados pela aplicação de programação por USB, Microchip PICDEM FS USB Demonstration Tool, permitem realizar algumas operações tais como leitura da versão do bootloader instalado, leitura do código existente no espaço de programação dedicado a código a ser programável por USB, escrita de código a ser executado em funcionamento normal, formatação do espaço dedicado a código de funcionamento normal, leitura de dados de EEPROM, escrita de dados na EEPROM, escrita de configuração da PIC, executar o reset á PIC, entre outros. O modo de comunicação de USB do bootloader é baseado em interrupções provenientes do PC, o PC envia dados e a PIC retorna os dados respondendo, não ao contrário. A comunicação é feita em pacotes de um byte de dados de cada vez, célere a suficiente para permitir a execução da programação em menos de 5 segundos. A figura seguinte demonstra a interface de programação por USB fornecida no pacote de software Microchip USB Framework, distribuída e disponível no site da Microchip. 61
Figura 12 Ilustração USB PICDEM(TM) 5.2 - Software Placa Principal e Periféricos Através da análise do código do bootloader, e de um exemplo de código rato USB fornecido pela Microchip no pacote de desenvolvimento USB, começou-se a desenvolver o software da PIC, no compilador C18 fornecido pela Microchip. Inicialmente ponderou-se a programação em linguagem assembly, ideia essa que foi colocada de parte devido à elevada complexidade dos protocolos e funções USB nessa linguagem. Estudamos e utilizamos a linguagem C, do compilador C18 no MPLAB C18. 62
O cabeçalho do código principal do Bootloader está apresentado na figura seguinte: Figura 13 Firmaware Mouse Demo 63
Na figura abaixo está descrita, em diagrama de blocos, o funcionamento do código geral na PIC. Figura 14 Processo de inicialização Após o modo de bootloader ter sido verificado no arranque e negado, o programa coloca o program counter a 0x800, sendo este o inicio do código do programa normal (principal) da PIC, o equivalente ao 0x000. As interrupções também são deslocadas o mesmo número estando agora nas posições 0x808H (interrupções de alta prioridade, alterada colocando um salto na 0x008H) e 0x818H (interrupções de baixa prioridade, alterada colocando um salto na 0x018H). Após o inicio do programa principal, são re-inicializados os registos, definidas variáveis e colocados os estados nos portos e são inicializadas as portas dos leds para coloca-los a piscar, em padrões definidos (ver tabela seguinte), consoante o estado de comunicação do módulo USB ( InitializeSystem ). De seguida, é configurado o módulo USB interno e inicializados os buffers dos canais de entrada e saída. O estado da interface USB no hardware é verificada e o serviço de enumeração e autenticação USB é inicializada ( USBTasks ). Caso a enumeração não tenha terminado ou ainda se encontrar em progresso, a secção de código do ProcessIO não é executada. 64
Quando a interface de comunicação USB estiver completamente configurada e correctamente enumerada, os leds devem piscar alternadamente, indicando canal preparado para comunicação. O programa ficará a correr em ciclo fechado apenas colocando os leds nos estados lógicos do estado da interface USB, esperando a recepção de um comando de controlo vindo pelo USB por parte da aplicação no PC ( USBTasks ), executando o código do comando correspondente, preparando os dados para envio da resposta de volta à aplicação no PC ( ProcessIO ) e envio dos dados na secção ( USBTasks ). Estado Interface USB SUSPEND DETACHED_STATE ATTACHED_STATE POWERED_STATE DEFAULT_STATE ADDRESS_STATE CONFIGURED_STATE Estado dos leds 1: Toggle 2: =LED1 1: Off 2: Off 1: On 2: On 1: On 2: Off 1: Off 2: On 1: Toggle 2: Off 1: Toggle 2:!LED1 Tabela 6 Estado de funcionamento USB 5.3 Software de Interface Gráfica no PC Recorreu-se ao Visual Basic 6.0 para desenvolver a aplicação de interface com o dispositivo, utilizável no PC, visto ser uma linguagem de alto nível, de programação orientada a objectos que permite desenvolver uma interface de utilizador com facilidade e rapidez. A interface gráfica desenvolvida até ao momento encontra-se 65
apresentada nas imagens seguintes, tanto para a parte de osciloscópio digital, tanto como de analisador lógico. Figura 15 Interface windows A aplicação em Visual Basic 6 foi baseada na aplicação de interface com o exemplo do HID MOUSE EXAMPLE da Microchip, apresentado na figura seguinte. Figura 16 Interface Windows basica A aplicação demonstra o envio de um byte para a PIC por USB e a recepção desse mesmo byte por parte da aplicação. Permite enviar o byte a cada clique num botão, ou continuamente num intervalo de tempo predefinido. O código em que nos 66
baseamos principalmente está contido num módulo de declarações de API s de interface USB ( Application Programming Interface ) que permite utilizar as funções existentes de interface USB no sistema operativo. Para além do módulo de API s existente neste exemplo, foi necessário recorrer ao uso de outros módulos, pesquisados e obtidos na Internet, posteriormente modificados para serem utilizados na aplicação. Entre eles destacam-se os módulos de classes com funções de API s de contadores de alta performance, visto os timer s do VB não terem a resolução suficiente para determinarem intervalos de tempo de transferências por USB, pois a resolução mínima deles é 1ms e não contam o intervalo de tempo quando o código da sua interrupção é executado. As funções o timer de alta performance é baseado no numero de clocks do CPU entre o inicio e a paragem do clock. Recorreu-se à construção de um módulo de manipulação de bits visto ser necessária a conversão de valores decimais para binário e vice-versa, decimal para hexadecimal e vice-versa, binário para hexadecimal e vice-versa. A maior parte destas funções está presente na livraria de desenvolvimento MSDN fornecida em conjunto com o Visual Studio 6.0 no qual está presente o Visual Basic 6.0 tendo o inconveniente de a maior parte das funções serem encontradas se for conhecida a sua designação e finalidade, daí a pesquisa por módulos já existentes. A componente de código do DFT (Direct Fourier Transform) foi obtida na Internet através da análise do código de uma função de um projecto de um osciloscópio digital, desenvolvido numa outra faculdade. O link pode ser encontrado nas referências. Actualmente a análise da DFT só é executada no canal a ser amostrado de momento. O analisador lógico, apresentado na figura da direita, lista a amostragem a ser efectuada na PIC, 16 bits de cada vez. A amostragem está a ser feita a 16 bits, por pedido da aplicação no PC. De momento a FIFO ainda não foi implementada, limitando o funcionamento do analisador lógico. Taxa de amostragem seguida 409600 Hz, até 512 amostras guardadas no buffer interno. Taxa de amostragem por pedido de interrupção de USB encontra-se nos 75Hz devido ao tempo de pedidos de dados por parte da aplicação no PC. Análise da interface USB na PIC indica que é possível atingir taxas de amostragem e taxas de transferências elevadas. 67
A PIC têm capacidade de enviar dados pela interface USB a cada milissegundo, possui 16 canais ( endpoints ), cada um com 64bytes por transferência, totalizando cerca de 1024 KBytes por segundo de transferência máxima, ou 8Mbits por segundo. Taxa de amostragem perto de 1MHz é teoricamente possível (em tempo real), embora com utilização da FIFO possa atingir os 66Mhz. 68
6 - Placa Programadora 6.1 - Programador JDM Na figura seguinte é apresentado o programador. As tensões da porta série não possibilitam a programação directa da PIC. Para se programar uma PIC precisa-se Ground, +5V para alimentação e +12.5V para o sinal de programação. A norma RS232 indica que o valor lógico 0 está entre -3V a -25V (normalmente a -12V) e o valor lógico 1 está entre +3V a +25V (normalmente a +12V). A norma RS232 estabelece como valores válidos para o valor lógico 0 o intervalo de -8V a -12V e para o valor lógico 1 o intervalo de +8V a +12V. Na maioria dos PC s as tensões dos sinais andam perto de -8V e +8V. Figura 17 Programador JDM em schematic 69
Para se conseguir obter +12.5V de tensão de programação, cria-se uma massa de alimentação da PIC que está a -5V relativamente ao Ground da porta série. Desta forma o Ground da porta série está a +5V do Ground da PIC, servindo ela como alimentação para a mesma. O condensador de 22uF carrega-se relativamente à queda de tensão dos 2 diodos 1N 4148 (à direita) estabilizando-se no zener 5v1, servindo de fonte de alimentação +5V. O condensador de 100uF carrega-se relativamente à queda de tensão do diodo 1N 4148 (à esquerda) e do transístor 2N 3904 (à esquerda) estabilizando-se na série dos zener 5v1 e 8v2 a cerca de 13V. Esta tensão é utilizada para programação da PIC. Os sinais dos restantes pinos podem ser obtidos directamente da porta série do PC, sendo estes os Data e Clock, obtidos respectivamente do CTS, DTR e RTS. Este método é utilizado normalmente nos programadores de alimentação por porta série, não tendo muito sucesso devido ás características de temporização e consumo de Vpp da PIC, sendo neste desenho já compensado da maneira descrita acima. Frisa-se que este programador só funciona correctamente com um software de programação preparado para ele. ICPROG 1.4 não funciona. Winpic800 funciona. 6.2 - Construção Figura 18 Programador JDM em PCB O software escolhido para desenvolver esta placa circuito impresso foi o Eagle da Cadsoft, versão 4.16. Este programador suporta PIC s de 40, 28,18 e 8 pinos. A figura acima mostra o PCB enquanto a figura seguinte mostra o esquemático. 70
6.3 Utilização Figura 19 Programador em schematic completo Na utilização deste programador convém ter em conta algumas medidas a serem executadas, de modo a não danificar o programador, a PIC ou a porta série do PC. Referem-se as seguintes: Colocar a PIC no programador, estando ele desconectado de tudo. 1º. Colocar a PIC no programador, estando ele desconectado de tudo. 2º. Ligar o cabo série, ou o programador à porta série do PC. 3º. Programar, ler, etc (Descrito na parte do software, mais abaixo). 4º. Desligar o cabo série, ou o programador da porta série do PC. 5º. Remover a PIC do programador. 71
6.4 Software Foi escolhido o Winpic800 como software para programar em conjunto com este programador. O facto de ser grátis, de utilização intuitiva e bastante compatível com este programador levou à sua preferência. Nas figuras seguintes demonstra-se o procedimento para programar um ficheiro compilado no formato hexadecimal (*.hex) que será descarregado para a PIC. Figura 20 Palabras de configuração Na figura acima, estão apresentadas as palavras de configuração do ficheiro hex compilado. Estas servem para determinar a configuração do hardware onde será descarregado, desde frequência de operação a definições de timer s, programação de baixa voltagem, AD s internos, entre outros. A próxima figura mostra o código em blocos hexadecimais, código esse que será descarregado na PIC. 72
Figura 21 Interface principal WinPic800 Os procedimentos para descarregar um ficheiro compilado para uma PIC através do programador, estão descritos nas figuras seguintes. 1º. Iniciar aplicação Winpic800. Ao iniciar, o programador deve estar com a PIC já inserida. A aplicação tenta fazer a auto-detecção do modelo da PIC. Se tiver sucesso, o modelo será indicado, como na figura seguinte. Caso falhe a detecção, será indicado como Desconhecido. Figura 22 Detecção de pic no WinPic800 73
2º. Ir a Menu -> Configuração -> Hardware e seleccionar JDM Programmer. Escolher a porta série correspondente, neste caso COM1. 3º. Ir a Menu -> Configuração -> Software e seleccionar as seguintes opções: General -> Nada. Programar -> Verificar após programação Dispositivo -> Usar Autoseleccção( ) e Detectar e autosel( ).hex -> Actualizar ficheiro ( ) e File.HEX -> Data( ) AVR -> Nada. ICSP-Mode -> Code, Data e Configuration 4º. Ir a Ficheiro -> Abrir e navegar até ao ficheiro *.hex que se deseja descarregar para a PIC. 5º. Ir a Dispositivo e seleccionar Programar Tudo. Se tiver sucesso na programação a barra ficará verde no fim e um aviso será mostrado a indicar que a programação foi bem sucedida (Figura abaixo). Se não tiver sucesso, será mostrado também um aviso, e a programação será interrompida. No caso dos portáteis, certas interfaces RS232 não tem níveis de tensões suficiente altos para permitir a programação, mas recomenda-se que se tente umas 10 vezes antes de desistir. Após a programação deve seguir-se os passos descritos na secção de hardware anteriormente (remover cabo, retirar PIC, etc). 74
Figura 23 Processo de escrita WinPic800 75