Osciloscópio Digital De 4 canais e Analisador Lógico de...
Transcript of Osciloscópio Digital De 4 canais e Analisador Lógico de...
1
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
50
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
51
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
52
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
53
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.
54
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:
1
2
R
RA −=
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:
12 VoVrefVo +=
Assim é garantido um condicionamento de sinal de [0,+5] V para qualquer tipo de
variação de entrada.
55
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.
56
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
57
4.8 - PCB do esquema Global
Figura 9 – Circuito global em PCB
58
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.
59
O cabeçalho do código principal do Bootloader está apresentado na figura seguinte:
Figura 10 – USB Bootloader Version 1.00
60
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”).
61
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.
62
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.
63
O cabeçalho do código principal do Bootloader está apresentado na figura seguinte:
Figura 13 – Firmaware Mouse Demo
64
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.
65
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 Estado dos leds
SUSPEND 1: Toggle – 2: =LED1
DETACHED_STATE 1: Off – 2: Off
ATTACHED_STATE 1: On – 2: On
POWERED_STATE 1: On – 2: Off
DEFAULT_STATE 1: Off – 2: On
ADDRESS_STATE 1: Toggle – 2: Off
CONFIGURED_STATE 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
66
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
67
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.
68
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.
69
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
70
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.
71
Figura 19 – Programador em schematic completo
6.3 – Utilização
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.
72
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.
73
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
74
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).
75
Figura 23 – Processo de escrita WinPic800