Upload
joycecris
View
220
Download
7
Embed Size (px)
Citation preview
UNIVERSIDADE FEDERAL DO ESPÍRITO SANTO
CENTRO TECNOLÓGICO DEPARTAMENTO DE ENGENHARIA ELÉTRICA
PROJETO DE GRADUAÇÃO
DESENVOLVIMENTO DE UM OSCILOSCÓPIO VIRTUAL DE BAIXO CUSTO COM INTERFACE USB
IGOR VESCOVI DEVENS
VITÓRIA – ES FEVEREIRO/2008
IGOR VESCOVI DEVENS
DESENVOLVIMENTO DE UM OSCILOSCÓPIO VIRTUAL DE BAIXO CUSTO COM INTERFACE USB
Parte escrita do Projeto de Graduação do aluno Igor Vescovi Devens, feito sob a orientação do Professor Dr. Evandro Ottoni Teatini Salles, apresentado ao Departamento de Engenharia Elétrica do Centro Tecnológico da Universidade Federal do Espírito Santo, para obtenção do grau de Engenheiro Eletricista.
VITÓRIA – ES
FEVEREIRO/2008
IGOR VESCOVI DEVENS
DESENVOLVIMENTO DE UM OSCILOSCÓPIO VIRTUAL DE BAIXO CUSTO COM INTERFACE USB
COMISSÃO EXAMINADORA: ___________________________________ Prof. Dr. Evandro Ottoni Teatini Salles Orientador ___________________________________ Eng. Marcelo Souza Fassarella Co-orientador ___________________________________ Prof. Dr. Teodiano Freire Bastos Filho Examinador ___________________________________ Prof. Dr. Hans-Jorg Andreas Schneebeli Examinador
Vitória - ES, 11, Fevereiro, 2008
i
DEDICATÓRIA
Aos meus amigos da Engelite.
ii
AGRADECIMENTOS
Agradeço a Deus, meus pais, Torricelli e Angela e meu irmão, Arthur, pelo
apoio. Sem esquecer dos amigos e da namorada, que tiveram muita paciência durantes
os meses e meses em que me ocupei deste projeto e me ausentei de tantas cervejas.
Obrigado também a Marcelo Fassarella pela sugestão do tema e profissionalismo, ao
meu Orientador Evandro, pela sua paciência e apoio, e a equipe da Geocontrol pela
confiança e experiência que lá adquiri.
iii
LISTA DE FIGURAS
Figura 1 - Sinal Analógico. .......................................................................................... 17
Figura 2 - Sinal Discretizado no Tempo. ..................................................................... 17
Figura 3 - Sinal Discretizado no tempo e na Amplitude. ............................................ 18
Figura 4 - Diagrama de blocos de um ADC por Aproximação Sucessiva. ................. 20
Figura 5 - Stellaris LM3S811 Evaluation Board. ........................................................ 25
Figura 6 -Diagrama de blocos do Hardware do Osciloscópio Virtual via USB. ......... 26
Figura 7 - Osciloscópio Virtual via USB conectado ao computador. ......................... 27
Figura 8 - Circuito Divisor de tensão. ......................................................................... 29
Figura 9 - Filtro RC. .................................................................................................... 30
Figura 10 - Filtro RC utilizado. ................................................................................... 31
Figura 11 - Circuito semi-completo de tratamento do sinal de entrada....................... 32
Figura 12 - Circuito completo de tratamento do sinal de entrada. .............................. 33
Figura 13 - Análise no tempo do circuito. ................................................................... 33
Figura 14 - Análise na freqüência do circuito. ............................................................ 34
Figura 15 - Circuito de tratamento do sinal na placa. .................................................. 34
Figura 16 - Circuito do oscilador independente. ......................................................... 35
Figura 17 - Circuito do oscilador independente na placa. ........................................... 35
Figura 18 - Fluxograma do programa principal. .......................................................... 38
Figura 19 - Fluxograma da interrupção do conversor AD. .......................................... 39
Figura 20 - Interface gráfica do Software. ................................................................... 40
Figura 21 - Manipulação da biblioteca gráfica. ........................................................... 41
Figura 22 - Manipulação do Software do Osciloscópio Virtual via USB. .................. 42
Figura 23 - Senoidal de 10 Hz, osciloscópio USB. ..................................................... 45
Figura 24 - Senoidal de 10 Hz, osciloscópio analógico. ............................................. 45
Figura 25 - Senoidal de 220Hz, osciloscópio USB. .................................................... 46
Figura 26 - Senoidal de 220 Hz, osciloscópio analógico. ........................................... 47
Figura 27 - Senoidal de 10 Khz, osciloscópio USB. ................................................... 47
Figura 28 - Senoidal de 10 KHz, osciloscópio analógico. ........................................... 48
Figura 29 - Quadrada de 51 Hz, osciloscópio USB. .................................................... 49
iv
Figura 30 - Quadrada de 51 Hz, osciloscópio analógico. ............................................ 49
Figura 31 - Quadrada de 6 KHz, osciloscópio USB. ................................................... 50
Figura 32 - Quadrada de 6 KHz, osciloscópio analógico. ........................................... 51
Figura 33 - Quadrada de 10 KHz, osciloscópio USB. ................................................. 51
Figura 34 - Quadrada de 10 KHz, osciloscópio analógico. ......................................... 52
Figura 35 - Triangular de 52 Hz, osciloscópio USB. .................................................. 53
Figura 36 - Triangular de 52 Hz, osciloscópio analógico. ........................................... 53
Figura 37 - Triangular de 5,06 KHz, osciloscópio USB. ............................................ 54
Figura 38 - Triangular de 5,06 KHz, osciloscópio analógico. ..................................... 55
Figura 39 - Análise de amplitude Máxima. ................................................................. 55
Figura 40 - Análise de amplitude Mínima. .................................................................. 56
Figura 41 - Senoidal de 30 KHz no Osciloscópio USB. ............................................. 57
Figura 42 - Quadrada de 30 KHz no Osciloscópio USB. ............................................ 57
Figura 43 - Triangular de 30 KHz no Osciloscópio USB. ........................................... 58
Figura 44 - Diagrama de blocos do projeto futuro. ..................................................... 63
Figura 45 - Memória SRAM auto-incrementável. ....................................................... 64
Figura 46 - Futura versão do Osciloscópio Virtual via USB em fase de
desenvolvimento. ......................................................................................................... 65
Figura 47 - Esquemático do LM3S811 da Kit da Luminary Micro. ........................... 87
Figura 48 - Esquemático do CI FTDI2232c do Kit (Serial x USB). ........................... 88
v
LISTA DE TABELA
Tabela 1 - Codificação Binária da Tensão. .................................................................. 19
Tabela 2 - Classes USB. .............................................................................................. 22
Tabela 3 - Custo Aproximado do Hardware do Osciloscópio Virtual via USB. ......... 62
vi
GLOSSÁRIO
1. AD: Analog to Digital.
2. ADC: Analog to Digital Converter.
3. ARM: Advanced RISC Machine.
4. Bluetooth especificação industrial para áreas de redes pessoais sem fio
(Wireless Personal Area Networks – PANs).
5. bps: Bits per Second.
6. CDC: Connected Device Configuration.
7. COM port: Porta de comunicação.
8. FFT: Fast Fourier Transform
9. Filtro RC: Filtro Resistivo e Capacitivo.
10. Half Duplex: Sistema que oferece comunicação em duas direções, mas apenas
uma por vez. Ex: Walkie Talkie.
11. HID: Human Interface Device.
12. Hub USB: Periférico que permite que vários outros periféricos USB se
conectem a uma mesma porta USB.
13. IrDA: Infrared Data Association.
14. JTAG: Joint Test Action Group.
15. MP3: MPEG-1 Audio Layer 3.
16. PenDrive: Memória Flash para armazenamento de dados com conexão USB.
17. Plotar: Desenhar.
18. Plug and Play: Característica de um periférico que pode ser adicionado a um
computador sem a necessidade de configuração ou instalação.
19. RISC: Reduced Instruction Set Computer.
20. Smart Card: Cartão com circuito embarcado capaz de processar dados.
21. RS232: Recommended Standard 232.
22. Trigger: Gatilho.
23. UART: Universal Asynchronous Receiver and Transmitter.
24. Wifi: Tecnologia de redes sem fios embarcadas.
vii
viii
SUMÁRIO
DEDICATÓRIA ........................................................................................................... I
AGRADECIMENTOS .............................................................................................. II
LISTA DE FIGURAS ............................................................................................... III
LISTA DE TABELA .................................................................................................. V
GLOSSÁRIO ............................................................................................................. VI
RESUMO ..................................................................................................................... X
1 INTRODUÇÃO .............................................................................................. 11
1.1 Motivação.......................................................................................................... 11
1.2 Objetivo ............................................................................................................. 13
1.3 Metodologia ...................................................................................................... 13
1.4 Divisão da Monografia ..................................................................................... 14
2 CONVERSÃO ANALÓGICA DIGITAL .................................................... 16
2.1 Tipos de conversores AD .................................................................................. 18
2.2 Aproximação Sucessiva .................................................................................... 18
3 UNIVERSAL SERIAL BUS (USB) .............................................................. 21
3.1 Versões da USB ................................................................................................ 21
3.2 Classes dos Periféricos USB ............................................................................. 21
3.3 Características elétricas da USB ....................................................................... 23
3.4 Conversor USB para Serial (UART) ................................................................ 24
4 O PROJETO DESENVOLVIDO ................................................................. 25
4.1 Hardware ........................................................................................................... 25
4.2 Microcontrolador .............................................................................................. 27
4.3 Circuito de Tratamento do Sinal de Entrada ..................................................... 28
4.3.1 Circuito Divisor de Tensão ...................................................................... 28
4.3.2 Dimensionamento do Filtro ..................................................................... 29
4.3.2.1 Filtro passa baixas RC ................................................................ 30
4.3.3 Circuito de Offset de Tensão ................................................................... 31
4.3.4 Oscilador Independente – Ponta de prova ............................................... 35
4.4 Firmware ........................................................................................................... 36
ix
4.4.1 Explicação da lógica e Fluxograma ........................................................ 36
4.4.2 Continuidade da Análise ......................................................................... 39
4.5 Software ............................................................................................................ 40
4.5.1 Características do Gráfico ....................................................................... 40
4.5.2 Configurações do Osciloscópio ............................................................... 41
5 RESULTADO ................................................................................................. 44
5.1 Ondas Senoidais ................................................................................................ 44
5.1.1 Onda Senoidal a 10 Hz ............................................................................ 44
5.1.2 Ondas Senoidais 220 Hz .......................................................................... 45
5.1.3 Onda Senoidal a 10 KHz ......................................................................... 47
5.2 Ondas Quadradas .............................................................................................. 48
5.2.1 Ondas Quadradas 51 Hz .......................................................................... 48
5.2.2 Ondas Quadradas 6 KHz ......................................................................... 50
5.2.3 Ondas Quadradas 10 KHz ....................................................................... 51
5.3 Ondas Triangulares ........................................................................................... 52
5.3.1 Ondas Triangulares 52 Hz ....................................................................... 52
5.3.2 Ondas Triangulares 5,06 KHz ................................................................. 54
5.4 Análise das Amplitudes Máxima e Mínima ..................................................... 55
5.5 Análise com freqüência acima da Projetada ..................................................... 56
6 CONCLUSÃO E MELHORIAS FUTURAS ............................................... 59
6.1 Melhorias Futuras de Hardware ........................................................................ 62
6.2 Melhorias Futuras de Firmware e Software ...................................................... 65
REFERÊNCIAS BIBLIOGRÁFICAS ..................................................................... 67
APÊNDICE A ............................................................................................................. 69
APÊNDICE B ............................................................................................................. 73
APÊNDICE C ............................................................................................................. 86
x
RESUMO
Este Projeto de Graduação teve como pressuposto a proposta de integrar o
conhecimento adquirido durante o curso de Engenharia Elétrica com ênfase em
eletrônica e telecomunicações, com um projeto interessante e de grande utilidade.
Foi desenvolvido um Osciloscópio Virtual via USB envolvendo o projeto de
circuitos eletrônicos, filtros eletrônicos, firmwares, softwares, comunicação Serial ×
USB. O projeto permite que se capture sinais previamente digitalizados por uma placa
conectada a uma porta USB de um computador pessoal. A placa utilizada para captura
(kit Stellaris) está baseada em um microcontrolador LM3S811 que possui núcleo
ARM Cortex M3, utilizando a tecnologia Thumb 2. Foram desenvolvidos tanto o
firmware do microcontrolador quanto o software que é executado no computador
pessoal, para permitir a visualização da onda capturada. Realizaram-se testes com
diversos tipos de ondas periódicas padronizadas para avaliar o desempenho do sistema.
A largura de banda máxima do sinal de entrada foi de 10KHz, limitada pela taxa de
conversão do módulo A/D do microcontrolador. Os resultados foram satisfatórios,
demonstrando a viabilidade da proposta. A base teórica adquirida durante a graduação
e o estímulo de se projetar e construir um equipamento primordial ao Engenheiro
Eletricista, foi o alicerce central deste projeto.
11
1 INTRODUÇÃO
1.1 Motivação
Em projetos eletrônicos, o Osciloscópio é um equipamento muito importante,
pois permite ao desenvolvedor e ao técnico observar o formato do sinal em estudo.
Contudo, seja ele Analógico ou Digital, é uma ferramenta de alto custo, por isso nem
sempre se tem acesso a este aparelho.
Quando se trata de um Osciloscópio Analógico tem-se um preço um pouco
mais acessível do que os Osciloscópios Digitais. Entretanto, são ferramentas de
tecnologia antiga, grandes, pesados e possuem pouca aplicação para um desenvolvedor
que deseje além de visualizar a onda, salvar a imagem do sinal, imprimir, ou mesmo
armazenar os pontos coletados para utilizar em algum software para pós-
processamento.
Em contrapartida, temos os Osciloscópios Digitais, com um desempenho
melhor, e com a possibilidade de contar com analisador de espectro embutido, tela
colorida, vários canais, interface com o computador e um valor de custo maior,
proporcional a todas suas vantagens.
Atualmente, é possível encontrar osciloscópios analógicos, de baixa qualidade,
com preço girando em torno de R$1.200,00 (2 canais de entrada e largura de banda de
20MHz) e osciloscópios digitais de ótima qualidade com preços em torno de
R$3.500,00 (2 canais, largura de banda de 60MHz, tela colorida, 500M amostras por
segundo de captura em cada canal e recursos matemáticos como transformada rápida
de Fourier). Caso se deseje osciloscópios analógicos de boa qualidade, o preço sobe
consideravelmente (em alguns casos mais que duplica), o que acaba por reforçar ainda
mais a migração de um osciloscópio analógico para o digital. Na verdade, observa-se
que os fabricantes tradicionais de osciloscópios, que produziam instrumentos
analógicos de excelente qualidade, migraram quase todos para produzir
exclusivamente equipamentos digitais. De todas as formas, pese ao preço dos
equipamentos tanto analógicos como digitais, o custo ainda é elevado para boa parte
dos usuários.
12
Por outro lado, no estágio atual da tecnologia, onde o computador portátil
deixou de ser um luxo para se tornar um instrumento de trabalho para o técnico e o
desenvolvedor, é interessante aproveitar seu potencial de cálculo e armazenamento nas
atividades que envolvam desenvolvimento e manutenção de equipamentos eletro-
eletrônicos. Assim, hoje em dia é comum integrar ao computador instrumentos de
medições, conhecidos agora como instrumentos virtuais que, no nosso caso torna-se
um osciloscópio virtual.
Portanto, o usuário interessado em um osciloscópio digital mais simples, capaz
de ir a campo integrado por exemplo a um notebook (ou mesmo para uso laboratorial),
mas com funções consideradas essenciais ao desenvolvedor ou projetista moderno,
pode empregar este tipo de equipamento. Um dispositivo deste tipo permite que
inclusive algoritmos típicos de processamento digital de sinais sejam realizados in loco
no computador, o que pode contribuir para uma rápida avaliação de um sinal, recurso
este impensável para Osciloscópios Analógicos.
A fim de se preencher essa necessidade de um Osciloscópio de baixo custo,
com desempenho mediano (largura de banda pequena) e interface com um computador
surgem como opção os Osciloscópios Virtuais, onde a visualização dos sinais
analisados é exibida em um software executado em um computador comum.
O BitScope (www.bitscope.com) é o exemplo mais difundido deste tipo de
equipamento. No sitio do fabricante, além de ser vendido, são também fornecidos os
esquemas elétricos para quem quiser construir o seu próprio equipamento (o esquema
fornecido utiliza comunicação via porta paralela para com o PC). Os preços
atualmente giram em torno de US$425,001, o que daria algo em torno de R$765,00
reais (na data da confecção desta monografia, US$1,00 ≈ R$1,80), valor este sem as
taxas de importação e frete que podem chegar a até 100%.
Neste sentido, o projeto aqui apresentado mostra o desenvolvimento de um
Osciloscópio Virtual, projeto este que apresenta avanços quando comparado a um
Projeto de Graduação anterior intitulado, Uso Do Computador Pessoal No
1 Sinal de entrada de, no máximo 100 MHz de largura de banda, 2 canais A/D de 40 Mega-Amostras por
segundo, 32 kB de buffer de memória.
13
Desenvolvimento De Um Analisador De Espectro De Baixa Freqüência, desenvolvido
por Walter Anjos em [15]. Este utilizava comunicação via porta paralela com o
computador, para assim transferir os dados coletados por um hardware de aquisição de
dados com conversor A/D dedicado. A análise de espectro nesse projeto anterior era
feita através de uma Transformada Rápida de Fourier (FFT). E como era necessário
capturar uma seqüência de amostras do sinal, esse equipamento também funcionava
como um Osciloscópio. Contudo, sua interface gráfica era complicada e tanto o
Osciloscópio quanto o Analisador de Espectro não permitiam análises ininterruptas.
Neste novo projeto a comunicação utilizada é a USB, mantendo-se, portanto,
compatível com o padrão de comunicação atual dos computadores. O software possui
uma interface gráfica (GUI) amigável e compatível com o Windows 98, 2000 e XP,
permite análises ininterruptas do sinal amostrado e funções de Trigger. Além disso, o
microcontrolador utilizado possui uma tecnologia mais avançada e o circuito de
aquisição de dados mantém uma comunicação bidirecional com o computador.
Contudo, não há a função de Analisador de Espectro nesta versão. Entretanto,
melhorias diversas devem ser feitas como proposta futura, levando o Osciloscópio
Virtual aqui apresentado a ter desempenho capaz de satisfazer até mesmo usuários
mais exigentes.
1.2 Objetivo
O objetivo deste projeto é construir um Osciloscópio Virtual via USB, que é
uma porta de comunicação rápida e padrão, além de um software de visualização.
Todo o projeto foi baseado sobre a plataforma de desenvolvimento Stellaris
LM3S811 Evaluation Board da Luminary Micro, que possui um microcontrolador
ARM7 Thumb2 e um circuito integrado de comunicação Serial x USB.
1.3 Metodologia
Foi feita inicialmente uma pesquisa na internet para analisar projetos
semelhantes, analisando idéias e possibilidades de arquiteturas do projeto. Arquiteturas
simples e complexas foram pesquisadas, assim como a disponibilidade de material
14
para desenvolvimento do projeto, componentes e exemplos de códigos. Estes foram os
pontos iniciais para o início do desenvolvimento do trabalho.
Duas arquiteturas de hardware mostraram-se interessantes a princípio, contudo
a mais otimizada foi descartada durante a fase de desenvolvimento de hardware,
devido a sua alta complexidade. A utilização de um kit de desenvolvimento mostrou-
se mais atrativa e facilitou a finalização da primeira fase do projeto.
A segunda etapa do desenvolvimento voltou-se para uma implementação em
conjunto do firmware e do software. Antes, entretanto, foi necessário decidir qual seria
a plataforma de desenvolvimento utilizada, assim como a linguagem de programação.
Optou-se pela linguagem C e a plataforma de desenvolvimento da Keil, µVision 3,
devido aos códigos de exemplos pré-existentes para esta plataforma. Quanto ao
software optou-se pelo Borland C++ Builder, devido às facilidades gráficas da
plataforma e devido à biblioteca gráfica utilizada, que fora desenvolvida para a
plataforma da Borland.
Com o hardware, firmware e software operando, iniciou-se a etapa mais
simples do hardware, que foi o desenvolvimento do circuito de tratamento de sinal de
entrada e o oscilador independente. Nesta fase, fez-se o uso intenso do Pspice para
simulação. Apenas quando verificado em simulação todo o funcionamento desses dois
circuitos, os protótipos foram criados e testados.
A etapa final do projeto foi focada em uma bateria de testes e comparação
entre as capacidades do Osciloscópio USB e de um osciloscópio analógico comum de
20 MHz. Realizados todos os testes a monografia foi preparada.
1.4 Divisão da Monografia
Esta monografia está divida em capítulos teóricos, desenvolvimento, testes,
conclusão e apêndices.
Nos Capítulos 2 e 3, temos a teoria de conversores AD e comunicação USB.
Todo o desenvolvimento do hardware, firmware e software do projeto está
descrito no Capítulo 4. No Capítulo 5 temos os teste e resultados obtidos com o
Osciloscópio Virtual projetado.
15
Conclusão e Melhorias Futuras estão descritas no Capítulo 6. Os Apêndices A
e B contêm o código fonte do firmware e do software, respectivamente, enquanto no
Apêndice C temos alguns esquemáticos do kit da Luminary Micro utilizado.
16
2 CONVERSÃO ANALÓGICA DIGITAL
A necessidade de se coletar dados do mundo real que estão em formato
analógico e arquivá-los em formas digitais nos força a utilizar conversores analógico-
digital, também conhecidos como ADC (Analog to Digital Converter – A/D).
Um sinal analógico é contínuo na amplitude e no tempo, possuindo qualquer
valor de amplitude dentro da sua faixa de variação para qualquer instante de tempo.
Coletar dados com tal precisão e constância infinitesimal é impossível. O que os ADCs
fazem é amostrar repetidas vezes o sinal, sendo que o valor da amplitude de cada
amostragem é discretizada, ou seja, só pode medir valores específicos.
Portanto, como não temos uma cópia digital fiel do sinal real, podemos perder
qualidade do sinal amostrado. Um método de se precaver contra isso é obedecer ao
Teorema de Nyquist2.
De acordo com o Teorema de Nyquist a quantidade de amostras por unidade
de tempo de um sinal, chamada taxa de amostragem, deve ser maior que o dobro da
largura de banda contida no sinal a ser amostrado, para que possa ser reproduzido
fielmente. A metade da taxa de amostragem é chamada taxa de Nyquist e corresponde
ao limite máximo de freqüência do sinal que pode ser reproduzido. Como não é
possível garantir que o sinal não contenha sinais acima deste limite (distorções,
interferências, ruídos, etc...), é necessário filtrar o sinal com um filtro passa baixo com
freqüência de corte igual (ou menor) à taxa de Nyquist, ou filtro anti-aliasing.
Ressalta-se que teoricamente, um sinal contínuo, limitado em banda, se
amostrado conforme o teorema, possui erro de reconstrução (retornando do domínio
discreto para o contínuo) igual a zero, ou seja, a reconstrução é perfeita. Entretanto,
para se considerar um sinal digital, é necessário discretizar também a amplitude de
cada amostra. Esta segunda discretização, entretanto, introduz erros que impedem a
2 Este teorema foi enunciado por Claude Shannon, que homenageou Nyquist, dando seu nome a ele pelos desenvolvimentos
realizados anteriormente, dos quais Shannon se valeu. O procedimento de amostragem, mas com caráter mais matemático,
sob o ponto de vista de aproximação de funções contínuas, também foi enunciado, independentemente, por Whittaker e
Kotel’nikov, [12[
17
reconstrução do sinal com erro zero (retornando do domínio digital para o contínuo),
uma vez que somos obrigados a associar uma palavra binária de dimensão finita para
cada amostra. O erro introduzido por este passo é irrecuperável e dá origem a uma das
maiores fontes de ruído em sinais digitais que é conhecido como ruído de quantização.
Modelos demonstram que, em quantização uniforme, que é bastante empregada em
instrumentos de medição, para cada bit extra na palavra binária, a relação sinal/ruído
eleva-se em 6dB [2].
Nas Figuras 1, 2 e 3 [1] pode-se observar graficamente o efeito da
digitalização em um sinal analógico.
Figura 1 - Sinal analógico.
Figura 2 - Sinal discretizado no tempo.
18
Figura 3 - Sinal discretizado no tempo e na amplitude.
Os valores permissíveis (discretos) estão (geralmente) igualmente espaçados
ao longo de toda a faixa dinâmica de conversão, e o número de valores discretos é
dependente do número de bits (largura da palavra) do conversor usado.
2.1 Tipos de conversores AD
Os tipos mais importantes de conversores AD são:
Rampa ou Integração (simples e dupla);
Aproximação Sucessiva;
Paralelo (ou Flash).
Assim, como na maioria dos microcontroladores, o conversor AD utilizado
pelo LM3S811 da Luminary Micro utiliza o método de Aproximação Sucessiva. Este é
o método mais utilizado em microcontroladores por oferecer uma taxa de amostragem
satisfatória para a maioria das aplicações e também por ser de baixo custo e baixo
consumo quando comparado com os ADC flash.
Algumas características do ADC do LM3S811 são os seus quatro canais de
entrada, capacidade de amostragem de até 500.000 amostras por segundo e uma faixa
de 0 a 3 Volts com precisão de 10 bits, sendo que 0 V é convertido para o valor binário
de 0000000000b e 3 V 1111111111b.
2.2 Aproximação Sucessiva
O método da aproximação sucessiva precisa de um número fixo de ciclos de
clock para chegar a um resultado. Como o próprio nome sugere, opera através de
19
comparações que iniciam por um valor pré-determinado e, através de comparações
sucessivas, encontra o dado equivalente ao valor analógico de entrada.
Um diagrama de blocos do funcionamento interno do ADC por Aproximação
Sucessiva pode ser visualizado na Figura 4 [1].
Figura 4 - Diagrama de blocos de um ADC por Aproximação Sucessiva.
Para analisar o funcionamento do conversor A/D por aproximação sucessiva,
tomemos um projeto que consiste em um conversor com intervalo de 0V a 15V e um
degrau de tensão de 1V. Deste modo, obtêm-se 16 níveis e são necessários 4 bits, que
geram a relação da Tabela 1.
Tabela 1 - Codificação Binária da Tensão.
Tensão (V) bit3 bit2 bit1 bit0
0 0 0 0 0
1 0 0 0 1
2 0 0 1 0 3ª
3 0 0 1 1 4ª
4 0 1 0 0 2ª
5 0 1 0 1
6 0 1 1 0
7 0 1 1 1
20
8 1 0 0 0 1ª
9 1 0 0 1
10 1 0 1 0
11 1 0 1 1
12 1 1 0 0
13 1 1 0 1
14 1 1 1 0
15 1 1 1 1
De acordo com a Tabela 1, o valor de tensão central é de 8V, sendo o ponto de
partida para a comparação com o sinal analógico de entrada. Os próximos níveis de
comparação, que são definidos pelo valor de entrada (Vin), têm os bits remanejados de
forma a resultar em um dado de saída correspondente ao valor analógico de entrada.
Se a entrada Vin for menor que a tensão com a qual está sendo comparada
(Vin<Vcomp), então torna-se o bit respectivo igual a 0 e o próximo igual a 1. Se
Vin>Vcomp, mantém-se o bit em questão e coloca-se o próximo bit em 1.
Por exemplo, se tivermos um valor de entrada igual a 3,7 volts, (1ª passo) o
conversor compara com 8 volts (na Tabela 1 é representado pelo valor binário 1000b),
verifica que é menor, torna o bit3=0 e o bit2=1. (2ª passo), ficando desta maneira com
4V (na Tabela 1 é representado pelo valor binário 0100b). Uma nova comparação é
realizada e, como 4V ainda é maior que 3,7V, deve-se tornar o bit2=0 e o bit1 =1 (3ª
passo). Em seguida tem-se 2V (na Tabela 1 é representado pelo valor binário 0010b),
que é menor que 3,7V, e o sistema mantém bit1=1 e coloca bit0=1 (4ª passo). Desta
forma, tem-se 3V (na Tabela 1 é representado pelo valor binário 0011b). Como o
conversor possui um degrau de 1V, o valor de saída correspondente aos 3,7V de
entrada, será 3V. Observe que, neste caso, o sistema ainda considera Vin = 3,7V maior
que 3V. Como anteriormente já foi verificado que este valor é menor do que 4V e
maior do que 2V, logicamente, para o sistema, a tensão de saída só poderá ser 3V.
21
3 UNIVERSAL SERIAL BUS (USB)
A tecnologia USB fornece a facilidade da conexão plug and play além da
enorme taxa de comunicação de dados. A sua compatibilidade também é algo
fundamental, visto que atualmente a IEEE não exige mais que um computador pessoal
tenha portas serial e paralela. Portanto, nos computadores mais modernos é comum
encontrarmos apenas portas USB para conectar periféricos ao computador.
3.1 Versões da USB
A comunicação USB é classificada em quatro tipos:
USB 1.0 – Foi a primeira geração da comunicação USB e é capaz de atingir
taxas de 1.5 Mbps (USB LOW SPEED) e 12 Mbps (FULL SPEED).
USB 1.1 – Versão com correções da USB 1.0.
USB 2.0 – USB HIGH SPEED. Possui capacidade de comunicação de 480
Mbps (60 MBps). É a tecnologia mais aplicada nos periféricos de alta
velocidade, tais como HDs externos, WebCams, Câmeras Digitais e Pen
Drives.
USB 3.0 – USB SUPER-SPEED que ainda está em caráter experimental.
Sua taxa de comunicação chegará a mais de 4.8 Gbps (600MBps) e utilizará
fibra óptica, ultrapassando até as altas taxas atingidas na comunicação
SATA2 e FireWire.
3.2 Classes dos Periféricos USB
Os periféricos USB podem ter uma classe totalmente dedicada pelo
desenvolvedor ou pertencer a uma classe padrão, usando assim um driver genérico
passando a ser reconhecido sem a necessidade de pré-instalação de drivers.
Na Tabela 2 temos a lista de classes de configuração do periférico USB.
22
Tabela 2 - Classes USB.
Classe Uso Descrição Exemplo
00h Periférico Informação da classe utilizada -
01h Interface Áudio Microfone, placas de som
02h Duplo Comunicação e controle CDC Ethernet e modem
03h Interface
Interface Homem - Máquina -
Human Interface Device
(HID)
Teclado e mouse
05h Interface Físico -
06h Interface Imagem -
07h Interface Impressora -
08h Interface Armazenamento de dados -
Mass Storage
Pen Drive USB, Leitor de cartão de
memória, Tocador de MP3
09h Periférico Hub USB
0Ah Interface CDC-Data
Essa classe é utilizada em conjunto
com a 02h - Comunicação e controle
CDC
0Bh Interface Smart Card -
0Dh Interface Segurança -
0Eh Interface Vídeo Webcam
DCh Duplo Periférico de Diagnóstico -
E0h Interface Controlador Sem Fio –
(Wireless) Adaptador Wi-Fi, Bluetooth
EFh Duplo Diversos ActiveSync
FEh Interface Aplicação Específica IrDA
23
FFh Duplo Específico do Vendedor
3.3 Características elétricas da USB
O cabo USB pode chegar a até 5 metros de comprimento sem
comprometimento da comunicação High Speed. Esse limite de comprimento se deve
ao tempo de resposta máximo de 1500ns para que um dado enviado seja considerado
recebido ou perdido. Contudo, com a utilização de Hubs podem-se atingir maiores
distâncias.
O cabo é constituído de quatro fios, sendo dois para sinais de dados e os outros
dois para alimentação. A alimentação é constituída de um fio GND (comum) e outro
de +5Volts, capaz de fornecer inicialmente apenas 100mA, mas com requisição de
mais corrente pode chegar a até 500mA drenados do computador. Isso traz uma
enorme vantagem comparada com as comunicações serial RS232 e paralela, pois agora
o periférico não só é capaz de se comunicar em uma taxa de comunicação mais alta e
ser plug and play, como também pode ser alimentado pelo mesmo cabo que o conecta
ao computador.
A comunicação USB acontece de maneira serial por um par trançado com
impedância de 90 Ohms +/- 15%. Os fios de dados são chamados de D+ e D-. A
sinalização utilizada é Half Duplex diferencial, onde o sinal propagado no fio D+
possui seu sinal complementar (invertido) no fio D-. Ao chegar ao circuito os fios D+
e D- entram, respectivamente, nas entradas não-inversora e inversora de um circuito
subtrator. Como o ruído é igual em ambos os fios do par trançado, ao chegar no
subtrator o seu sinal é cancelado enquanto o módulo das Amplitudes dos sinais D+ e
D- são somados. Deste modo, evitam-se os efeitos do ruído eletromagnético em cabos
longos.
Os níveis de tensão variam de acordo com padrão USB utilizado. Para as
comunicações Low Speed e Full Speed o nível lógico baixo é dado de 0 a 0,3 volts e o
nível lógico alto é dado de 2,8 a 3,6 volts. Já na comunicação High Speed os sinais
variam de ± 400mV, com uma impedância de 45 ohms para o comum ou uma
impedância diferencial de 90 Ohms.
24
A USB utiliza um protocolo especial para negociar o modo High Speed,
chamado de Chirping. Um periférico que utiliza USB HS (High Speed), a princípio
sempre inicia a comunicação em modo FS (Full Speed). Após receber um sinal de
reset é feita uma negociação com o Hub ou outro controlador da USB onde o
periférico saberá se poderá ou não comunicar-se em HS.
Outra característica importante da USB é que ela permite que até 127
periféricos se comuniquem no mesmo barramento USB do hospedeiro. Para conseguir
isto basta utilizar hubs USB para, além de prolongar o cabo, possibilitar novas
conexões.
Mesmo com todos os prós a comunicação USB possui um problema. Devido
às enormes facilidades que oferece ao usuário final ela requer uma maior
complexidade de hardware e software ao desenvolvedor. Mesmo que já tenhamos um
hardware USB pronto, ainda assim é necessário desenvolver um driver (caso o
hardware não utilize uma classe padrão) e um software de maior complexidade quando
comparado com as tradicionais comunicações serial e paralela.
3.4 Conversor USB para Serial (UART)
A fim de aproveitar a conectividade do padrão USB e ainda manter a
facilidade de desenvolvimento dos dispositivos seriais RS232, dispositivos que não
necessitam das taxas de transmissão de dados tão altas como as da USB 1.1 e 2.0,
podem utilizar conversores USB para UART.
Visto que os protocolos são diferentes, é necessário utilizar um circuito
integrado que faz essa conversão. Com isso, podemos utilizar a tradicional UART em
uma extremidade e a USB na outra extremidade, bastando apenas a instalação de um
driver no computador para que assim o computador passe a reconhecer o periférico
como uma ComPort virtual, mantendo desta forma a compatibilidade com diversos
periféricos.
O hardware do kit fornecido pela Luminary Micro utiliza esse tipo de solução
para o desenvolvedor. O CI (circuito integrado) utilizado é o FT2232C que contém
duas UARTs e uma USB 2.0 (Full Speed).
25
4 O PROJETO DESENVOLVIDO
4.1 Hardware
O projeto foi desenvolvido com base em um kit de desenvolvimento da
Luminary Micro, Stellaris LM3S811 Evaluation Board (Figura 5), que contém um
circuito com um microcontrolador ARM LM3S811 da Luminary Micro, um CI de
comunicação Serial × USB, FT2232C, fabricado pela FTDI e capaz de se conectar a
um computador via porta USB, mas manter o protocolo de comunicação serial
(UART) com o Microcontrolador e com os softwares do computador através de drivers
fornecidos pela própria FTDI.
Figura 5 - Stellaris LM3S811 Evaluation Board.
Toda a programação JTAG da placa de desenvolvimento pode ser feita
utilizando a conexão USB existente na placa, servindo tanto para programação quanto
para comunicação. A fonte de alimentação do circuito vem dos 5 V fornecidos pela
porta USB.
O Kit conta ainda com um display de OLED (Organic Led) monocromático de
96 colunas x 16 linhas. O display pode ser programado serialmente via UART ou por
I2C. Contudo, este display não chegou a ser utilizado no projeto do osciloscópio USB.
Alguns esquemáticos do Stellaris LM3S811 Evaluation Board encontram-se
no Apêndice C.
O projeto do Osciloscópio ainda conta com um circuito de tratamento do sinal
de entrada que é composto por um circuito divisor de tensão para reduzir o sinal de
26
entrada de 20 para 1,5 V e de -20 para -1,5 V; e um circuito para introduzir um offset
de 1,5 V no sinal de entrada, para que o valor do sinal de entrada fique na faixa de
leitura do ADC do LM3S811, que vai de 0 a 3 volts. Em série com esses 2 circuitos foi
adicionado um filtro RC passa baixas, para atenuar as freqüências acima da capacidade
do Osciloscópio.
Há ainda um circuito que utiliza para gerar uma onda quadrada periódica
independente do microcontrolador, a fim de servir como pino de teste para o
Osciloscópio. Desta forma, a geração da onda de teste é independente do circuito do
microcontrolador, de modo a permitir averiguar se o microcontrolador está
funcionando corretamente.
Na Figura 6 é apresentado um diagrama de blocos do hardware do projeto
seguido de uma foto sua implementação na Figura 7.
Figura 6 -Diagrama de blocos do hardware do Osciloscópio Virtual via USB.
27
Figura 7 - Osciloscópio Virtual via USB conectado ao computador.
4.2 Microcontrolador
O microcontrolador LM3S811 possui núcleo ARM Cortex M3 que utiliza a
tecnologia Thumb 2. A linha Cortex M3 é baseada no núcleo ARMv7-M e foi
desenvolvida para ter alto desempenho e baixo custo. Parte disso é devido à tecnologia
Thumb 2 que, em troca de uma pequena perda de desempenho, reduz o consumo de
energia e também o uso de memória, diminuindo o custo do CI. Outra característica da
tecnologia Thumb é a de permitir que o núcleo ARM de 32 bits trabalhe com
memórias de 16 e de 8 bits.
A seguir listam algumas características do microcontrolador utilizado. Para
mais informações ver o data sheet do LM3S811 [13].
Memória Flash de 64 Kbytes;
Memória SRam de 8 Kbytes;
Freqüência máxima de operação de 50 MHz;
Possui 3 Timers de 32 bits;
Possui 2 UART por hardware;
Possui 1 I2C por hardware;
Possui 1 SPI por hardware;
28
Quatro canais de entrada no ADC de 10 bits;
Taxa de amostragem do ADC pode chegar a 500.000 amostras por
segundo;
Possui 1 sensor e temperatura;
Possui 1 comparador analógico;
Pode ter de 1 a 32 pinos destinados a GPIO;
Seu encapsulamento é de 48 pinos LQFP;
Interface JTAG.
Características Elétricas básicas:
Alimentação nominal de 3,3 V, podendo chegar ao mínimo de 3,0 V e
máximo de 3,6 V;
Consumo para características nominais executando “while (1);” 70
mA.
4.3 Circuito de Tratamento do Sinal de Entrada
A entrada analógica do Osciloscópio USB está definida para analisar uma
faixa de +20 V a -20 V. Contudo, o conversor AD do LM3S811 possui uma faixa de
leitura de tensão de 0 a 3 V apenas. Portanto, é necessário um circuito para reduzir os
+ 20 V para 1,5 V, -20 V para -1,5 V, e um circuito para deslocar o nível de tensão de
-1,5 a +1,5 para 0 a 3 V.
Em série a esses circuitos há também um filtro RC passa baixas com a
finalidade de filtrar sinais de alta freqüência, devido ao fato de a largura de banda
analisada ser de apenas 10 kHz.
4.3.1 Circuito Divisor de Tensão
O Circuito divisor de tensão é composto por apenas 2 resistores para gerar
uma queda de tensão de no máximo 1,5 Volts para uma tensão de entrada de 20 Volts
conforme se vê na Figura 8.
29
Figura 8 - Circuito Divisor de tensão.
4.3.2 Dimensionamento do Filtro
Um filtro elétrico é um circuito seletivo de freqüência que permite a passagem
de ondas elétricas que tenham freqüência dentro de uma determinada faixa, e que
atenua ondas elétricas que possuam outras freqüências.
“A resposta em freqüência de um filtro é caracterizada por uma faixa de
passagem e uma faixa de rejeição havendo normalmente uma região de transição entre
elas. As freqüências dentro da faixa de passagem são transmitidas com baixa
atenuação e distorção reduzida, enquanto que as freqüências compreendidas na faixa
de rejeição sofrem atenuação elevada” (CARVALHO, Rogério Muniz. Princípios de
Comunicações, Vitória, 2003, p.77)
Os filtros podem ser:
Filtro passa baixas: quando atenua apenas as freqüências acima da
freqüência de corte.
Filtro passa altas: quando atenuas apenas as freqüências abaixo da
freqüência de corte.
Filtro passa faixa: Quando permite passagem de um sinal apenas em
uma certa faixa de freqüência, atenuando os sinais com freqüência
menor que a freqüência de corte inferior e os sinais com freqüência
acima da freqüência de corte superior.
Filtro rejeita faixa: É o filtro que atenua apenas os sinais com
freqüência dentro de uma certa faixa de valores.
30
4.3.2.1 Filtro Passa Baixas RC
O filtro RC é um filtro de 1ª Ordem que atenua 6dB por década após a
freqüência de corte. O cálculo de sua freqüência de corte é dado por:
. (1)
Na Figura 9 tem-se um circuito de um Filtro RC.
Figura 9 - Filtro RC.
Nas baixas freqüências existe muito tempo para que o capacitor se
carregue fazendo com que ele se comporte como um circuito aberto.
Logo Vout valerá o mesmo que Vin.
Nas altas frequências, o capacitor não tem tempo de se carregar
totalmente. Por isso, o circuito em questão funciona como um divisor
de tensão, e quando a freqüência se torna muito mais alta do que a
freqüência de corte, ele passa a se comportar como um curto, fazendo
com que Vout valha zero.
Embora testes demonstraram que o osciloscópio desenvolvido, por limitações
da taxa de amostragem do ADC, não tratou sinais com largura de banda maior que 10
KHz, a freqüência de corte do filtro utilizado não foi de 10 kHz, isso devido ao fato de
31
que no ponto da freqüência de corte o filtro apresenta uma queda de 3dB de
magnitude. Portanto, a fim de manter o sinal de 10 kHz com perdas mínimas, foi
utilizada uma freqüência de corte mais alta. No caso, a freqüência de 80 kHz atendeu
os requisitos desejados. Na figura 10 são apresentados os valores do filtro RC
calculado para o projeto.
Figura 10 - Filtro RC utilizado.
Cálculo da freqüência de corte utilizando a Equação 1:
Para Fc = 80 KHz, e C = 1 nF, temos R = 2 K Ohms.
Embora todos os cálculos e Figuras apresentadas sugerem que a resistência
utilizada no filtro RC é de 2 K ohms, no momento da construção do circuito foi
utilizado o valor comercial de 2,2 K ohms. Isto faz com que a freqüência de corte do
circuito seja aproximadamente 73 kHz.
4.3.3 Circuito de Offset de Tensão
A soma de um offset de 1,5 Volts é feita colocando-se uma fonte CC de 1,5
Volts em série com o sinal de analógico de entrada. O sinal de entrada passa a ter um
32
terra virtual que na verdade está 1,5 V acima do terra do circuito geral do
Osciloscópio.
Figura 11 - Circuito semi-completo de tratamento do sinal de entrada.
Na Figura 11 a fonte V1 adiciona um offset de +1,5 V ao sinal analógico V2,
como pode ser visto em toda análise CC do circuito.
Como é necessária uma fonte de 1,5 V para gerar o offset no sinal analógico de
entrada e temos à disposição apenas um pino de 3,3 V para uso geral, utilizou-se um
divisor de tensão neste pino de 3,3 V para termos nossa fonte de 1,5 V. Optou-se por
um simples divisor resistivo uma vez que é necessário apenas deslocar a onda de
entrada, posto que a impedância de entrada do circuito de conversão do µC é bastante
elevada. Sendo assim, o circuito de tratamento do sinal de entrada fica como o da
Figura 12, onde a impedância R4 simboliza a carga, no caso, o conversor analógico
digital.
33
Figura 12 - Circuito completo de tratamento do sinal de entrada.
O resultado obtido com esse circuito, em uma análise no tempo, com V2
sendo uma senoidal de 20 V e 20 kHz é apresentado na Figura 13.
Figura 13 - Análise no tempo do circuito.
Fazendo uma análise na freqüência, obtemos o resultado esperado, que é o
inicio da atenuação do sinal por volta de 10 kHz. A escala em Y do gráfico da Figura
14 é o ganho em dB, e em X temos a freqüência por década.
34
Figura 14 - Análise na freqüência do circuito.
A fim de reduzir ruídos e também de manter um conector padrão de
osciloscópio (Conector de Painel - BNC), foi incluído no PCB final da placa de
tratamento do sinal o Conector de Painel, conforme se vê na Figura 15.
Figura 15 - Circuito de tratamento do sinal na placa.
35
4.3.4 Oscilador Independente – Ponta de prova
Assim como outros osciloscópios o Osciloscópio USB projetado também
possui uma ponta de prova para verificar se o mesmo está operando corretamente, e
para verificar a integridade do cabo coaxial utilizado.
Para garantir sua função de teste, este circuito é quase totalmente independente
do resto do Osciloscópio, utilizando apenas a alimentação de 5 V (4,6 Volts
aproximadamente) fornecida pela porta USB. O circuito foi projetado utilizando um CI
555 para gerar uma onda de aproximadamente 1 kHz a partir do equacionamento de
circuitos astáveis encontrado em [10].
Figura 16 - Circuito do oscilador independente.
Na Figura 16 temos o esquema do circuito oscilador de 1 kHz, e na Figura 17
o protótipo em placa.
Figura 17 - Circuito do oscilador independente na placa.
36
4.4 Firmware
O firmware de controle do LM3S811 foi desenvolvido utilizando as
bibliotecas fornecidas pela Luminary Micro para a Stellaris LM3S811 Evaluation
Board. Esta biblioteca, DriverLib.lib, permite a manipulação de todos os periféricos:
UART, SPI, Timers, ADC, etc.
Outra facilidade fornecida pela Luminary Micro foi uma enorme quantidade
de exemplos de códigos para facilitar a compreensão das bibliotecas e encurtar o
tempo de desenvolvimento do projeto.
Todo o código do firmware foi desenvolvido em Linguagem C, a mesma
linguagem em que foi desenvolvida a biblioteca do kit da Luminary Micro. O
ambiente de desenvolvimento utilizado foi o µVision, e o compilador foi o RealView
C/C++ Compiler, ambos de propriedade da Keil TM.
O código fonte do firmware encontra-se no apêndice A.
4.4.1 Explicação da lógica e Fluxograma
O programa do firmware do Osciloscópio USB divide-se em duas partes
principais, uma é o main, cujo fluxograma encontra-se na Figura 18, e a outra é o
código de interrupção do conversor AD, cujo fluxograma encontra-se na Figura 19.
No main são definidas as configurações de trabalho do microcontrolador e de
seus periféricos, são inicializadas as variáveis globais e o programa entra em loop
infinito esperando que o buffer de leitura do conversor AD seja preenchido para depois
enviá-lo via interface serial da UART0 para o CI FT2232C, onde o dado é enviado ao
PC. Vale lembrar que ao final de cada envio de dados o buffer de entrada da UART0 é
verificado para saber se houve ou não mudança na escala de leitura do sinal.
Na interrupção do ADC é feita a leitura do sinal do conversor cada vez que
essa função é acionada pela interrupção gerada pelo Timer1. Durante essa rotina, é
verificado se o buffer com os dados recolhidos anteriormente está sendo transmitido
(variável ‘selec’); caso não esteja sendo transmitido nenhum dado, o dado lido do
ADC é deslocado, aproveitando-se apenas os 8 bits mais significativos dos 10 bits, e
37
esse byte é armazenado no buffer (de acordo com a escala utilizada), que tem o seu
ponteiro incrementado.
O fato de ser utilizado apenas 8 bits dos 10 bits convertidos deve-se ao fato de
que a utilização de apenas 8 bits por amostra facilita e agiliza a transmissão via porta
serial, deste modo caso fosse feita uma função de captura e transmissão direta de
dados ao PC, sem pré-armazenamento em um buffer, a utilização de apenas 8 bits por
amostra diminuiria o gargalo criado pela transmissão da porta serial. Contudo essa
rotina ficou para uma próxima versão e o conversor A/D acabou subutilizado.
Quando o buffer está cheio, ou seja, 800 pontos lidos, a rotina main se
encarrega de transmiti-lo.
Figura 18 - Fluxograma do programa principal.
38
Figura 19 - Fluxograma da interrupção do conversor AD.
Um conceito importante que deve ser compreendido é como funciona a escala
de leitura do sinal. O interesse de se implementar este artifício foi o de manter um
número pequeno de pontos armazenados no buffer seja qual fosse a freqüência do sinal
que se deseja visualizar. Para melhor compreensão, é feita uma análise do problema
real; como vemos a seguir.
O conversor AD do LM3S811 no projeto está trabalhando a cerca de 130.000
amostras por segundo. Caso seja analisada uma onda de 10 kHz, significa que serão
feitas aproximadamente 13 amostras por período de onda. Para um microcontrolador
ARM trabalhando a 50 MHz, uma taxa de transferência da UART de 460.800 bps e
um Microcomputador de 1GHz, armazenar, transmitir, efetuar cálculos e desenhar 13
pontos na tela não será um grande problema.
39
Contudo, caso o sinal em questão seja de baixa freqüência, como 10 Hz, é
necessário armazenar, transmitir, efetuar cálculos e desenhar 13000 pontos para ver
um período completo do sinal. O que não é tão simples. Isso exigiria hardwares mais
potentes e softwares otimizados.
Este problema é resolvido com o sistema de escalas. Se o usuário do software
seleciona uma opção de grandeza do sinal de ‘alta freqüência’, o firmware passa a
armazenar todos os pontos lidos e transmiti-los ao PC, onde serão desenhados.
Caso o usuário selecione opções de mais baixa freqüência o firmware passa a
armazenar no buffer de transmissão apenas 1 ponto a cada 10 (ou mais) pontos lidos,
fazendo um processo de descarte de amostras conhecido como sub-amostragem.
A escala é mantida proporcional para que a quantidade de pontos transmitidos
seja sempre a de 800 pontos, e a quantidade de pontos desenhados tela seja no máximo
400.
O fato de o número de pontos desenhados no gráfico ser no máximo a metade
do número de pontos armazenados e enviados pelo microcontrolador está relacionado
com a função de trigger via software. Maiores detalhamentos podem ser encontrados
no Apêndice B.
Uma dificuldade encontrada no firmware foi a manipulação do conversor A/D,
pois o data sheet do LM3S811 o descreve como capaz de realizar 500 mil amostras por
segundo. Entretanto, na prática não foi possível fazê-lo trabalhar a mais que 130 mil
amostras por segundo, devido a problemas de travamento da execução do código
quando submetido a taxas mais altas e devido à dificuldades de se manipular o
periférico do conversor A/D.
4.4.2 Continuidade da Análise
Para evitar o gargalo criado pela comunicação Serial × USB, que no firmware
é de 460.800 bps (taxa máxima aceita pela UART do microcontrolador LM3S811)
todo o firmware foi projetado para:
o Primeiro Amostrar e guardar os dados amostrados.
40
o Segundo Quando o buffer estiver cheio, parar o armazenamento dos
dados e enviar os dados pela porta serial.
Deste modo, o limite de amostragem não mais será ditado pela transmissão
serial, no entanto, para altas freqüências podem haver perdas de algum evento, visto
que enquanto os dados armazenados são enviados, nenhum dado do ADC será
coletado.
4.5 Software
Todo software foi desenvolvido em linguagem C++, na plataforma Borland
C++. Para fazer a parte gráfica (SCOPE) foi utilizada uma biblioteca gratuita fornecida
em [8]. A comunicação serial foi desenvolvida com o material encontrado em [11]. O
código fonte completo e comentado do software do Osciloscópio USB está no
Apêndice B.
A interface final do Software ficou como mostrado na Figura 20.
Figura 20 - Interface gráfica do Software.
41
4.5.1 Características do Gráfico
Visto que a biblioteca gráfica utilizada é gratuita, mas não é código aberto (o
código é aberto apenas para quem comprar), certas características não foram possíveis
mudar, tais como o título sobre o gráfico, ‘Scope’, a inscrição no eixo X, ‘Samples’ ao
invés de Amostras, e a inscrição no eixo Y, ‘Y Axis’, quando o ideal nesse caso seria
Tensão.
No entanto, essa biblioteca fornece inúmeras vantagens como a facilidade de
programação, auto-zoom, impressão, salvar imagem do gráfico (ícone destacado na
Figura 21), além de permitir o desenho de mais de um canal no mesmo gráfico. Porém,
esta última ferramenta não foi utilizada visto que o projeto foi de um osciloscópio de
apenas um canal.
Figura 21 - Manipulação da biblioteca gráfica.
4.5.2 Configurações do Osciloscópio
Todas as configurações necessárias para se fazer uma análise correta no
Osciloscópio USB estão disponíveis no menu localizado na lateral direita (Figura 22).
Saber manipular o menu é imprescindível ao usuário.
42
Figura 22 - Manipulação do Software do Osciloscópio Virtual via USB.
1 – Como a comunicação é Serial × USB, ao conectar a placa ao PC será
criada uma ComPort Virtual para a troca de dados com a placa. Portanto, para utilizar
o osciloscópio, deve-se inicialmente selecionar em qual ComPort está conectada a
placa.
2 – O modo de captura ininterrupta desenha o conteúdo lido do ADC na tela
sem passar por nenhum algoritmo para ‘gatilhar’ a onda em momentos iguais.
Portanto, disponibiliza-se um sinal atualizado na tela, porém sem nenhuma seqüência.
3 – A captura com Auto Trigger mantém a tela sempre com um sinal
atualizado, mas esse sinal passa por um algoritmo que sempre tenta iniciar o desenho
da onda a partir do primeiro ponto onde o sinal cruza o seu valor médio com derivada
positiva.
43
4 – O Trigger Manual se assemelha ao Auto Trigger com a única diferença de
que ao invés de iniciar o desenho pelo valor médio, inicia-se pelo valor contido na
caixa de texto logo abaixo.
5 – A Captura Única é ideal quando se deseja uma foto estática da forma de
onda, como, por exemplo, quando se deseja calcular seu período ou amplitude. Para
atualizar o gráfico, quando esta opção estiver selecionada, basta clicar em “Capturar”.
6 – O Ajuste de Offset serve para se fazer correções no sinal de entrada. Esta
função soma o valor contido na caixa de texto, logo abaixo dela, ao valor do sinal lido
pelo ADC. Com isso, pode-se deslocar toda onda no eixo da Tensão.
7 – A Grandeza do Sinal Medido é um campo apenas para ajuste de escala e
melhor visualização do gráfico.
8 – A Escala nos mostra aproximadamente quantos micro-segundos possui
cada amostra do sinal.
9 – Na caixa de texto ‘Amostras’ deve ser inserido o número de amostras
feitas para se completar um período do sinal.
10 – Quando o item 9 for realizado basta pressionar o botão Converter que
serão fornecidos a freqüência e o comprimento de onda do sinal baseados na Escala e
no número de amostras.
44
5 RESULTADO
Os testes do Osciloscópio USB foram realizados no Laboratório de Eletrônica
Digital da Universidade Federal do Espírito Santo. Para a realização dos testes foi
utilizado um Osciloscópio Analógico, de 20 MHz, um Gerador de Sinal de até 2 MHz,
um Laptop (onde foi executado o Software do Osciloscópio USB), e o circuito do
projeto em questão.
Nos testes realizados foram comparados os resultados obtidos com o
Osciloscópio USB e com o Osciloscópio Analógico para diversas formas de ondas
periódicas.
Os valores comparados foram:
Amplitude do sinal mensurado;
Freqüência do sinal mensurado;
Qualidade do sinal mensurado.
5.1 Ondas Senoidais
5.1.1 Onda Senoidal a 10 Hz
Gerador de Sinal: Senóide de 10 Hz.
Resultado obtido pelo Osciloscópio USB:
Amplitude:
Vmax = + 5,7 Volts.
Vmin = - 8,6 Volts.
Freqüência: 10,3 Hz aproximadamente.
Qualidade: Muito ruído.
Na Figura 23 tem-se a imagem do programa em execução neste teste.
45
Figura 23 - Senoidal de 10 Hz, osciloscópio USB.
Resultados obtidos com o osciloscópio analógico (teste exibido na Figura 24):
Amplitude:
Vmax = + 5,4 Volts.
Vmin = - 8,4 Volts.
Freqüência: 10 Hz aproximadamente.
Qualidade: Ruim, o sinal é preciso, contudo não pode ser visualizado
completamente na tela por ser de baixa freqüência. Isso ocorre devido ao
método de reconstrução do sinal utilizado nos osciloscópios analógicos, onde
são necessários vários períodos de onda para a amostrar um período na tela.
Figura 24 - Senoidal de 10 Hz, osciloscópio analógico.
46
5.1.2 Ondas Senoidais 220 Hz
Gerador de Sinal: Senoide de 220Hz.
Resultado obtido pelo Osciloscópio USB:
Amplitude:
Vmax = + 5,7 Volts.
Vmin = - 8,6 Volts.
Freqüência: 218 Hz aproximadamente.
Qualidade: Com ruído.
Na Figura 25 tem-se a imagem do programa em execução neste teste.
Figura 25 - Senoidal de 220Hz, osciloscópio USB.
Resultados obtidos com o osciloscópio analógico (teste exibido na Figura 26):
Amplitude:
Vmax = + 5,4 Volts.
Vmin = - 8,4 Volts.
Freqüência: 227 Hz aproximadamente.
Qualidade: Boa.
47
Figura 26 - Senoidal de 220 Hz, osciloscópio analógico.
5.1.3 Onda Senoidal a 10 kHz
Gerador de Sinal: Senoide de 10 kHz.
Resultado obtido pelo Osciloscópio USB:
Amplitude:
Vmax = + 5,3 Volts.
Vmin = - 8,3 Volts.
Freqüência: 10,3 kHz aproximadamente.
Qualidade: Baixa definição (poucas amostras por período).
Na Figura 27 tem-se a imagem do programa em execução neste teste.
Figura 27 - Senoidal de 10 kHz, osciloscópio USB.
48
Resultados obtidos com o osciloscópio analógico (teste exibido na Figura 28):
Amplitude:
Vmax = + 5,4 Volts.
Vmin = - 8,4 Volts.
Freqüência: 10 KHz aproximadamente.
Qualidade: Boa.
Figura 28 - Senoidal de 10 KHz, osciloscópio analógico.
5.2 Ondas Quadradas
5.2.1 Ondas Quadradas 51 Hz
Gerador de Sinal: Quadrada de 51 Hz.
Resultado obtido pelo Osciloscópio USB:
Amplitude:
Vmax = + 6,1 Volts.
Vmin = - 9,1 Volts.
Freqüência: 51 Hz aproximadamente.
Qualidade: Boa. O ruído está bem visível, contudo, devido à freqüência e
amplitude do sinal amostrado, o ruído não está interferindo negativamente na
análise do sinal.
Na Figura 29 tem-se a imagem do programa em execução neste teste.
49
Figura 29 - Quadrada de 51 Hz, osciloscópio USB.
Resultados obtidos com o osciloscópio analógico (teste exibido na Figura 30):
Amplitude:
Vmax = + 6,0 Volts.
Vmin = - 8,5 Volts.
Freqüência: 52 Hz aproximadamente.
Qualidade: Boa. Bontudo, por ser um sinal de baixa freqüência, a imagem do
sinal fica piscando na tela.
Figura 30 - Quadrada de 51 Hz, osciloscópio analógico.
50
5.2.2 Ondas Quadradas 6 kHz
Gerador de Sinal: Quadrada de 6 kHz.
Resultado obtido pelo Osciloscópio USB:
Amplitude:
Vmax = + 6,1 Volts.
Vmin = - 9,2 Volts.
Freqüência: 6,1 kHz aproximadamente.
Qualidade: Boa.
Na Figura 31 tem-se a imagem do programa em execução neste teste.
Figura 31 - Quadrada de 6 kHz, osciloscópio USB.
Resultados obtidos com o osciloscópio analógico (teste exibido na Figura 32):
Amplitude:
Vmax = + 6,0 Volts.
Vmin = - 8,5 Volts.
Freqüência: 5,9 kHz aproximadamente.
Qualidade:Boa.
51
Figura 32 - Quadrada de 6 KHz, osciloscópio analógico.
5.2.3 Ondas Quadradas 10 kHz
Gerador de Sinal: Quadrada de 10 kHz
Resultado obtido pelo Osciloscópio USB:
Amplitude:
Vmax = + 6,1 Volts.
Vmin = - 9,1 Volts.
Freqüência: 10 kHz aproximadamente.
Qualidade: Ruim. Devido à baixa taxa de amostragem no circuito, a onda
quadrada passa a perder a sua forma.
Na Figura 33 tem-se a imagem do programa em execução neste teste.
Figura 33 - Quadrada de 10 kHz, osciloscópio USB.
52
Resultados obtidos com o osciloscópio analógico (teste exibido na Figura 34):
Amplitude:
Vmax = + 6,0 Volts.
Vmin = - 8,5 Volts.
Freqüência: 10 kHz aproximadamente.
Qualidade:Boa.
Figura 34 - Quadrada de 10 kHz, osciloscópio analógico.
5.3 Ondas Triangulares
Não serão apresentados os resultados em freqüências de 10 kHz para as ondas
triangulares, visto que durante os testes esse tipo de sinal apresentou uma distorção
grande no Osciloscópio USB, inviabilizando comparações. A amostra do sinal a 10
kHz ficou semelhante a uma senóide.
5.3.1 Ondas Triangulares 52 Hz
Gerador de Sinal: Triangular de 52 Hz.
Resultado obtido pelo Osciloscópio USB:
Amplitude:
Vmax = + 5,3 Volts.
Vmin = - 8,7 Volts.
Freqüência: 52 Hz, aproximadamente.
Qualidade: Boa. O ruído está bem visível, contudo, devido à freqüência e
amplitude do sinal amostrado, o ruído não está interferindo negativamente na
análise do sinal.
53
Na Figura 35 tem-se a imagem do programa em execução neste teste.
Figura 35 - Triangular de 52 Hz, osciloscópio USB.
Resultados obtidos com o osciloscópio analógico (Figura 36):
Amplitude:
Vmax = + 5,0 Volts.
Vmin = - 8,5 Volts.
Freqüência: 53 Hz aproximadamente.
Qualidade: Boa. Contudo, por ser um sinal de baixa freqüência, a imagem do
sinal fica piscando na tela.
Figura 36 - Triangular de 52 Hz, osciloscópio analógico.
54
5.3.2 Ondas Triangulares 5,06 kHz
Gerador de Sinal: Triangular de 5,06 kHz.
Resultado obtido pelo Osciloscópio USB:
Amplitude:
Vmax = + 5,3 Volts.
Vmin = - 7,7 Volts.
Freqüência: 5,29 kHz aproximadamente.
Qualidade: Razoável. A baixa taxa de amostragem do ADC já começa a
deformar o sinal.
Na Figura 37 tem-se a imagem do programa em execução neste teste.
Figura 37 - Triangular de 5,06 kHz, osciloscópio USB.
Resultados obtidos com o osciloscópio analógico (Figura 38):
Amplitude:
Vmax = + 5,0 Volts.
Vmin = - 8,0 Volts.
Freqüência: 5,00 kHz, aproximadamente.
Qualidade: Boa. Contudo, por ser um sinal de baixa freqüência, a imagem do
sinal fica piscando na tela.
55
Figura 38 - Triangular de 5,06 kHz, osciloscópio analógico.
5.4 Análise das Amplitudes Máxima e Mínima
Na análise de amplitude máxima o gerador de sinal não conseguiu gerar
nenhuma tensão capaz de saturar o Osciloscópio Virtual via USB (ver Figura 39), visto
que esse foi projetado para analisar de -20 a +20 V (o que foi comprovado em uma
análise CC).
Figura 39 - Análise de amplitude Máxima.
Durante a análise de baixa amplitude do sinal de entrada observa-se uma
relação sinal/ruído baixa, interferindo bastante na leitura do sinal. O sinal observado na
Figura 40 possui amplitude próxima a 150 mV que é o limite de funcionamento do
Osciloscópio USB, visto que embora o ADC trabalhe com uma amostragem com
56
precisão de 10 bits, apenas os 8 mais significativos são utilizados. Portanto, visto que o
Osciloscópio USB pode ler uma faixa de -20 a +20 Volts e que não possui ajuste de
escala por hardware, a precisão do sinal lido é por volta de 155 mV.
Figura 40 - Análise de amplitude mínima.
5.5 Análise com freqüência acima da Projetada
Estes testes foram realizados apenas com o intuito de verificar o
comportamento do Osciloscópio em freqüências muito acima das quais foi projetado
(10 kHz). Nas Figuras 41, 42 e 43 é apresentado o Osciloscópio Virtual via USB
analisando uma onda Senoidal de 30 kHz, uma onda Quadrada de 30 kHz e uma onda
Triangular e 30 kHz, respectivamente.
57
Figura 41 - Senoidal de 30 kHz no Osciloscópio USB.
Figura 42 - Quadrada de 30 kHz no Osciloscópio USB.
58
Figura 43 - Triangular de 30 kHz no Osciloscópio USB.
A amostragem digital de aproximadamente 110 K amostras por segundo
permite ao Osciloscópio uma definição de menos que 4 pontos por período de onda
para um sinal de 30 KHz, o que é muito pouco para se desenhar um sinal com
qualidade3. Portanto, o gráfico fica totalmente distorcido e conforme se observa nas
Figuras 41, 42 e 43, é impossível distinguir o formato do sinal analógico com tão
poucas amostras.
3 Mas observe que, pelo teorema de Nyquist, esta taxa garante uma reconstrução do sinal analógico sem o
fenômeno de aliasing – sobreposição de cópias do sinal. Este é um dos motivos que um osciloscópio digital de
largura de banda de 60MHz exija 500M amostras por segundo de amostragem. Por exemplo, em sistemas de
energia elétrica assume-se, para efeitos de digitalização e manipulação matemática, um mínimo de 6 amostras
por cada período da onda senoidal.
59
5.6 Análise dos Resultados
Nos testes de freqüência foi verificado que a freqüência máxima de análise do
Osciloscópio é por volta de 10 KHz. Isso se deve ao fato do número de amostras por
segundo do conversor analógico digital do LM3S811 ter chegado a no máximo cerca
de 110.000, o que é um valor muito abaixo das 500.000 amostras por segundo que é
dada no data sheet do microcontrolador como o limite deste ADC. Este valor foi um
compromisso entre taxa de amostragem respeitando Nyquist e a garantia de uma
quantidade mínima de amostras representadando o sinal digitalizado na tela do
computador.
Quando se testou freqüências acima de 10 KHz, o número de pontos por
período de onda desenhado na tela passou a ser muito baixo, menos de 10 por período,
caindo assim a qualidade do sinal digitalizado. Conforme se vê no sub-capitulo 5.5, a
queda da qualidade foi tal que não se diferencia mais as formas de ondas senoidais,
quadrada e triangular para sinais de freqüências próximas a 30 Khz.
Vale lembrar que estamos no domínio digital e embora o teorema de Nyquist
mostre que basta amostrar no dobro da taxa da maior freqüência do sinal para
convertê-lo posteriormente ao domínio analógico, fiel ao sinal de entrada (desde que
se empregue um filtro de reconstrução cuja resposta impulsiva seja dada pela função
sinc, irrealizável na prática por ser não causal, daí somente no plano teórico se
consegue reconstrução perfeita do sinal analógico), a representação digital fica
comprometida com poucas amostras por período E, como não há nenhum pós-
processamento no sinal amostrado, onde utilizou-se uma linha reta para interligar os
pontos, o que vemos no gráfico é apenas uma seqüência de pontos amostrados.
Ainda com relação ao aumento da distorção do sinal no gráfico do Osciloscópio
Virtual, com o aumento da freqüência, nota-se que à medida em que se aumenta a
freqüência do sinal amostrado o formato de onda que menos se distorce é a senoidal.
Isso é facilmente explicável pela série trigonométrica de Fourier:
“Uma função pediórica da variável angular θ, x(θ), com período de
repetição de 2π radianos, pode ser desenvolvida em uma série de termos em seno e
cosseno de múltiplos inteiros de θ, chamada de Série Trigonométrica de Fourier, desde
60
que satisfaça às Condições de Dirichlet”. (CARVALHO, Rogério Muniz. Princípios
de Comunicações, Vitória, 2003, p.27)
As Equações 2 e 3 mostram respectivamente a Série Trigonométrica de
Fourier para uma onda triangular de amplitude A e uma onda quadrada de amplitude
A.
( )( )[ ]tfksen
kAtx
k
k
01
2
1
12212²)1(8)( −⋅−−⋅
= ∑+∞
=
−
ππ
, [2]
( ) ( ) ( )[ ]tfksenk
Atxk
01
12212
4−
−= ∑
+∞
=
ππ . [3]
Ou seja, sinais sinusoidais são os únicos que são representados por uma raia
espectral exatamente no valor da freqüência do sinal e valor zero para qualquer outra
freqüência. Qualquer deformação no formato de um sinal sinusoidal (inclua-se neste
caso as ondas triangular e retangular) gera componentes espectrais (harmônicos) com
valor diferente de zero para múltiplos da freqüência fundamental, o que exige uma
maior taxa de amostragem. Observe que, teoricamente, não conseguiríamos amostrar
(e talvez gerar!) uma triangular e uma retangular uma vez que estas são ilimitadas em
banda (infinitos harmônicos). Mas, aplicando-se o bom senso, com alguns harmônicos
acima da fundamental temos um sinal triangular e retangular muito próximo do
aceitável. Daí a importância do filtro de entrada, conhecido como pré-filtro, para
limitar a banda, filtro este previsto no Teorema de Nyquist. Toda a teoria de Shannon
foi feita para sinais limitados em banda, o que exige o pré-filtro.
Quanto aos níveis de tensão verifica-se no sub-capitulo 5.4 que as tensões mais
altas são menos sensíveis a ruídos, enquanto baixas tensões de entrada, 1 Volt por
exemplo, o circuito esta sujeito a muitas interferências. Isso ocorre principalmente
devido a grande faixa de tensão (+/- 20 V) que o osciloscópio é capaz de analisar.
Fazendo com que sinais de entrada com pequenos valores de tensão sejam reduzidos a
valores muito pequenos no circuito divisor de tensão. Isso faz com que o sinal
61
analisado chegue ao pino de entrada do ADC com um nível de tensão muito próximo
aos níveis de tensão dos ruídos do circuito (relação sinal/ruído baixa). Fazendo com
que a análise seja de má qualidade. Ou seja, é necessário uma adapatação da faixa
dinâmica do sinal à faixa de conversão do conversor.
Outro fator que deve ser notado é de que apesar de o conversor ser de 10 bits,
apenas os 8 bits mais significativos são considerados. Portando a precisão do
Osciloscópio é de apenas 40/256, 156 mili-volts aproximadamente. Muitos
osciloscópios digitais profissionais, de baixo custo, trabalham com 8 bits por amostra
(este é o caso dos osciloscópios digitais do DEL).
Portanto, por se tratar de um projeto de baixo custo, ver Tabela 3, quando
comparado aos osciloscópios digitais e analógicos que existem no mercado, o
Osciloscópio Virtual via USB desenvolvido mostra-se como uma opção simples e
indicada para circuitos de baixa freqüência e níveis de tensão maiores que 1 Volt, visto
que é suscetível a ruídos.
Quanto ao cálculo da freqüência do sinal (micro-segundos por amostragem),
como a taxa de amostragem do sinal não é alta, quando se analisa sinais de ordem de
grandeza próximos a 10.000 Hz a precisão da medida da freqüência passa a ser
pequena, acumulando erros que tendem a aumentar com o aumento da freqüência do
sinal amostrado. No caso de uma onda de 10 KHz, como visto no sub-capitulo 5.1.3, o
erro dessa medida foi de +307 Hz.
Na Tabela 3 é apresentada uma planilha de custo aproximado do equipamento
projetado. O custo final do Osciloscópio Virtual via USB é por volta de R$ 47,00 o
que está muito abaixo do valor de mercado de Osciloscópios Analógicos (
Aproximadamente R$ 1.200,00) e Osciloscópios Digitais mais simples (por volta de
R$ 3.500,00) é mais barato também do que a versão mais simples do BitScope (US$
425,00).
Tabela 3 - Custo Aproximado do Hardware do Osciloscópio Virtual via USB.
Descrição Componente Custo unitário em lotes de 100
[4]
62
Microcontrolador LM3S811 $4,20 CI USB x Serial FTDI2232L $6,92 Cristal 6 MHz HC49 $0,44
Regulador 3,3V LP3981 $0,60 Conector USB Tipo B $0,93 Cabo USB 3M A male to B male $1,87
Timer lm555 $0,66 2 Capacitores C Ceramicos SMD 50V $0,14 10 Resistores R 100mW SMD $0,70
Conector de Painel Femea $3,00 PCB 2 camadas 80mmx80mm $6,00
Custo Total $25,46
Custo Total em Reais R$ 45,83 Custo Total + Importação
100 reais / 100 peças = R$1,00 R$ 46,83
Com um aumento não muito alto no custo total do projeto, é possível fazer
inúmeras melhorias no projeto, fazendo com que seja concorrente a algumas versão do
BitScope mas mantendo-se a um custo muito abaixo.
6 CONCLUSÕES E MELHORIAS FUTURAS
Uma mudança em toda a estrutura do hardware poderia tornar o Osciloscópio
USB uma opção de uso até mesmo a usuários mais exigentes.
Inicialmente um sistema de proteção de sobre tensão na entrada analógica
utilizando diodos rápidos aumentaria a durabilidade do equipamento.
A utilização de um CI ADC tipo Flash de altíssima taxa de amostragem para
substituir o ADC do microcontrolador daria ao equipamento uma grande largura de
banda, com dezenas de milhões de amostras por segundo. Aliado ao ADC como um CI
discreto seria importante o uso de uma memória SRAM auto incrementável com taxas
de escrita compatíveis com a taxa de amostragem do ADC, com isso teríamos todo um
circuito independente de amostragem e armazenamento de dados coletados
trabalhando juntos em um clock de altíssima freqüência fornecida por um oscilador
externo.A inclusão de um trigger por hardware (CI detector de cruzamento por nível)
63
poderia dar à segunda versão do projeto uma capacidade de análise de freqüências da
mesma taxa de amostragem do conversor A/D. Isso é possivel se for utilizado um
recurso muito utilizado em Osciloscópios Analógicos, onde cada amostragem do sinal
é capturado apenas um ponto por periodo de onda, de modo que a primeira amostra é
capturada em um no primeiro periodo da onda com um atraso t0, a segunda amostra é
capturada no segundo periodo da onda, mas agora com um atraso t1. E deste modo
uma sequencia de pontos é capturada e possibilita a remontagem do sinal em alta
freqüência.
A transmissão dos dados ao PC poderia ser simplificada no nível de hardware
utilizando-se um microcontrolador com uma porta USB como periférico incluso. É
claro que, além de mudanças no firmware, essas modificações exigiriam uma mudança
na comunicação do software do PC, pois deixaria de ser interpretada como uma
comunicação serial e passaria a ser USB. No mais não haveria grandes modificações.
Na Figura 44 pode-se verificar um diagrama de blocos de um projeto com as
melhorias descritas acima.
64
Figura 44 - Diagrama de blocos do projeto futuro.
Vale lembrar que neste projeto futuro não há um contador externo para
atualizar a linha de endereçamento da memória SRAM, por isso ela deve ser auto-
incrementável capaz de sequenciar a escrita e leitura em todas as linhas de endereço,
diferentemente de muitas SRAMs que auto-incrementam apenas 4 endereço seguidos.
Um exemplo de CI com essas características é o CY7C09159AV (Figura 45),
produzido pela Cypress, trata-se de uma SRAM paralela que alem de ser auto-
incrementável, é dual port, ou seja, possui duas memórias auto-incrementáveis
totalmente independentes em um mesmo encapsulamento.
Figura 45 - Memória SRAM auto-incrementável.
65
A utilização de um microcontrolador com núcleo ARM em um novo projeto
pode não ser necessária visto que as altas taxas de amostragem e comunicação entre o
conversor AD e a memória SRAM são independentes no microcontrolador. Contudo
seu uso ainda é interessante caso deseje-se programar em firmware algum
processamento sobre os dados amostrados, visto a alta taxa de processamento que um
microcontrolador ARM pode fornecer.
Este projeto de hardware com diversas melhorias já teve sua implementação
iniciada, conforme ve-se na Figura 46, contudo o sistema hardware e firmware ainda
não se encontra operante. O circuito possui um microcontrolador ARM7 da Atmel,
AT91SAM7S64, com porta USB Full Speed inclusa, uma memória SRAM dual-port
autoincrementavel capaz de operar a 50 MHz, CY7C09159AV, um ADC flash de 80
MHz, 8 bits, paralelo, da Analog Devices, AD9283_c, onde tanto a memória quanto o
ADC são gatilhados por um oscilador de 50MHz para trabalharem sincronizadamente.
Uma primeira versão da placa de circuito impressa ja foi feita, contudo modificações
podem ser necessárias.
Figura 46 - Futura versão do Osciloscópio Virtual via USB em fase de desenvolvimento.
6.2 Melhorias Futuras de Firmware e Software
Nenhum tratamento ao sinal digitalizado foi implementado em software, para
uma futura versão seria interessante incluir um código para realizar interpolações entre
os pontos a fim de possibilitar um gráfico de melhor qualidade para freqüências
próximas a freqüência máxima. A criação de uma função de coleta de pontos
66
sequênciais para armazenamento em um arquivo também é uma importante evolução
para o software do Osciloscópio Virtual, visto que deste modo os sinais análisados
poderam ser pós-processados.
Outra melhoria possível seria a utilização de algum tipo de filtro digital com o
intuito de reduzir os ruídos. Ambas são implementações em nível de código, mas as
que exigirem maior complexidade e grandes bibliotecas matemáticas devem ser
preferencialmente realizadas em software visto que computadores pessoais possuem
muito mais potência de processamento e memória do que microcontroladores.
Fugindo um pouco das melhorias em qualidade do sinal, pode-se também
gerar códigos para dar mais funções ao projeto. O uso de uma FFT para se obter a
função de Analisador de Espectro no equipamento é interessante. O software poderia
também fornecer os dados por ele recebidos como um servidor de FTP, fazendo com
quem qualquer outro PC conectado na mesma rede, pudesse, tendo IP e porta, e com o
software do Osciloscópio instalado, ver os gráficos em tempo real estando em
qualquer lugar do mundo.
67
REFERÊNCIAS BIBLIOGRÁFICAS
[1] ALMEIDA, AILSON ROSETTI DE. Conversores Digital/Analógicos (DAC)
e Analógico/Digitais (ADC). [on line]. Disponível:
http://www.ele.ufes.br/~ailson/digital2/adda.pdf [capturado em 08 out. 2007].
[2] CARVALHO, ROGÉRIO MUNIZ. Princípios de Comunicações. 3ª Ed.
Vitória, ES. 2003.
[3] UNIVERSAL SERIAL BUS. Universal Serial Bus Class Definitions. [on
line] Disponível: http://www.usb.org/developers/devclass_docs/usbcdc11.pdf
[capturado em 10 nov. 2007].
[4] DIGI-KEY.COM. Orçamento de Componentes Eletrônicos. [on line].
Disponível: http://www.digikey.com [ capturado em 10 fev. 2008].
[5] LUMINARY MICRO. Application Note AN01209-01: ADC OverSampling
Techniques. [on line]. Disponível: http://www.luminarymicro.com [capturado
em 15 out. 2007].
[6] LUMINARY MICRO. Application Note AN01247-00: Using the Stellaris
Microcontroller Analog-to-Digital Converter. [on line]. Disponível:
http://www.luminarymicro.com [capturado em 15 out. 2007].
[7] LUMINARY MICRO. Data sheet EVB_LM3S811: Eval Board User’s
Manual and Schematics. [on line]. Disponível:
http://www.luminarymicro.com [capturado em 4 out. 2007].
[8] MITOV SOFTWARE. PlotLab 3.0. [on line]. Disponível:
http://www.mitov.com/html/download_plotlab.html [capturado em 20 set.
2007]
[9] WIKIPEDIA. Universal Serial BUS. [on line]. Disponível:
http://en.wikipedia.org/wiki/USB [capturado em 28 out. 2007].
68
[10] FILHO, TEODIANO FREIRE BASTOS. Apostila de Eletrônica Básica II.
Vitória, 2005.
[11] SALTEADORES. Serial Communication with Borland C++ Builder. [on
line]. Disponível: http://maikel.galeon.com/serie/bcbcomm.html [capturado em
10 set. 2007].
[12] UNSER, M. Sampling-50 years after Shannon,Proceedings of the IEEE, Vol.
88, n. 4, Abril 2000, pp. 569-587.
[13] LUMINARY MICRO. Data sheet DS-LM3S811-1972: LM3S811
Microcontroller Data Sheet. [on line]. Disponível:
http://www.luminarymicro.com [capturado em 4 out. 2007].
[14] LUMINARY MICRO. Application Note. [on line]. Disponível:
http://www.luminarymicro.com [capturado em 15 out. 2007].
[15] Anjos, W. L. F. "USO DO COMPUTADOR PESSOAL NO
DESENVOLVIMENTO DE UM ANALISADOR DE ESPECTRO DE
BAIXA FREQÜÊNCIA", Projeto de Graduação - DEL - CT - UFES, abril de
2004.
69
APÊNDICE A
O código comentado do firmware implementado em C, no µVision , utilizando
as bibliotecas fornecidas pela Luminary Micro. Todas as bibliotecas podem ser
encontradas em [14].
#include "hw_ints.h" //
#include "hw_memmap.h" //
#include "hw_types.h" //
#include "adc.h" //
#include "debug.h" // Inclusão das Bibliotecas
#include "gpio.h" // da Luminary Micro
#include "interrupt.h" //
#include "sysctl.h" //
#include "timer.h" //
#include "uart.h" //
#include "globals.h" //
#include "random.h" //
unsigned char selec;
char adc_buffer1[2000];
int cont0,cont1,cont2,cont_def;
unsigned long total_data, g_ulWheel;
// Interrupção por Timer do ADC
void ADCIntHandler(void)
{
unsigned long ulData;
// Limpa a interrupção do ADC
ADCIntClear(ADC_BASE, 0);
// Leitura do Dado do Conversor AD
ADCSequenceDataGet(ADC_BASE, 0, &ulData);
if (selec == 0) // Habilita escrita no buffer de leitura do ADC
{ // somente se o flag 'selec' valer zero.
cont0++; // incrementa o contador da escala de tempo
// quando o contador da escala atingir o valor definido
70
if (cont0 == cont_def) //
{ //
cont0 = 0; // zera o contador da escala
//Rotina da Luminary para diminuir o erro da leitura
RandomAddEntropy(ulData);
g_ulWheel = ((g_ulWheel * 58982) + (ulData * 6554)) / 65536;
// Transforma o valor adquirido (float) em um char e armazena no buffer
adc_buffer1[cont1] = ((ulData<<22)>>24);
// Ponteiro do buffer é incrementado.
cont1++;
}
}
}
int main(void)
{
int i;
// Configura o Clock do Sistema em 50Mhz
// onde SYSCTL_SYSDIV_4 divide a freqüência do PLL, que é de 200MHz
// por 4, gerando um clock interno de 50Mhz
SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN |
SYSCTL_XTAL_6MHZ);
// Ativa Periféricos
SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC);
// Conversor Analógico Digital
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
// GPIO A -> Pinos da UART0
SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER1);// Timer 1
SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0); // UART0
// Configura o ADC pra amostrar o Sinal Analógico quando o Timer gatilhar
// ADC_TRIGGER_TIMER
// configura o ADC amostrar
// por tempo dado pelo Timer1
ADCSequenceConfigure(ADC_BASE, 0, ADC_TRIGGER_TIMER, 0);
ADCSequenceStepConfigure(ADC_BASE, 0, 0,
ADC_CTL_CH1 | ADC_CTL_IE | ADC_CTL_END);
ADCSequenceEnable(ADC_BASE, 0);
ADCIntEnable(ADC_BASE, 0);
71
IntEnable(INT_ADC0);
// Configura o Timer1 para ser o gatilho da amostragem do ADC
TimerConfigure(TIMER1_BASE, TIMER_CFG_32_BIT_PER);
TimerLoadSet(TIMER1_BASE, TIMER_A, SysCtlClockGet() / 115000);
TimerControlStall(TIMER1_BASE, TIMER_A, true);
TimerControlTrigger(TIMER1_BASE, TIMER_A, true);
TimerEnable(TIMER1_BASE, TIMER_A);
// Configura os Pinos de TX e RX da UART0
GPIODirModeSet(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1,
GPIO_DIR_MODE_HW);
// Configura a operação da UART0 para 460800bps, 8-N-1.
UARTConfigSet(UART0_BASE, 460800,
(UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE |
UART_CONFIG_PAR_NONE));
UARTEnable(UART0_BASE);
cont0 = 0; //
cont2 = 0; // Valores Iniciais
cont_def = 1; //
total_data = 0; //
while(1) // loop infinito
{
if (cont1 == 800)// Se o buffer do ADC estiver cheio
{ //
selec = 1; // Trava escrita no buffer do ADC
for(i = 0; i < cont1; i++)
{
// Envia todo conteúdo do buffer via UART0
UARTCharPut(UART0_BASE, adc_buffer1[i]);
}
// Se houver bytes no buffer de entrada da UART0
while(UARTCharsAvail(UART0_BASE))
{
// cont_def recebe esse dado (Dado referente a escala)
cont_def = UARTCharNonBlockingGet(UART0_BASE);
72
if (cont_def > 200)
{ // caso o byte seja > 200, no caso o único
cont_def = 500; // maior que 200 enviado é 255, que deveria
} // valer 500, mas é enviado 255 pra caber em 1 byte
} .
cont1 = 0; // Zera ponteiro do buffer do ADC
selec = 0; // Destrava gravação de dados no buffer do ADC
}
}
}
73
APÊNDICE B
O código comentado do software implementado em C++, no Borland C++
Builder segue abaixo.
Unit1.c
//---------------------------------------------------------------------------
#include <vcl\vcl.h>
#pragma hdrstop
#include "Unit1.h"
#include "Unit2.h"
HANDLE hComm = NULL;
TRead *ReadThread;
COMMTIMEOUTS ctmoNew = {0}, ctmoOld;
//---------------------------------------------------------------------------
#pragma link "SLScope"
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ComboBox1Select(TObject *Sender)
{
char comport[10];
DCB dcbCommPort;
stop_aquire = 0;
//
StrCopy(comport,Form1->ComboBox1->Text.c_str()); // Abre a ComPort
hComm = CreateFile(comport, //
GENERIC_READ | GENERIC_WRITE, //
0,
74
0,
OPEN_EXISTING,
0,
0);
// Se não for possivel abrir a ComPort selecionada ou se ela ja estiver aberta
// o aplicativo é finalizado.
if(hComm == INVALID_HANDLE_VALUE) Application->Terminate();
GetCommTimeouts(hComm,&ctmoOld); //
ctmoNew.ReadTotalTimeoutConstant = 100; //
ctmoNew.ReadTotalTimeoutMultiplier = 0; // Define os valores de
ctmoNew.WriteTotalTimeoutMultiplier = 0; // TimeOut da comunicação
ctmoNew.WriteTotalTimeoutConstant = 0; //
SetCommTimeouts(hComm, &ctmoNew); //
dcbCommPort.DCBlength = sizeof(DCB); // Define os valoresde configuração
GetCommState(hComm, &dcbCommPort); // da ComPort selecionada.
BuildCommDCB("460800,N,8,1", &dcbCommPort); // BAUD RATE = 460800
SetCommState(hComm, &dcbCommPort); // PARIDADE = NENHUMA
// TAMANHO DA PALAVRA = 8 BITS
// STOP BITS = 1
ReadThread = new TRead(false); // Ativa o THREAD para iniciar a
// comunicação serial.
escala = 10; //
TransmitCommChar(hComm, escala); //
Form1->tamanho1 = 400; // Define os valores Iniciais
Form1->tamanho2 = 800; // para desenho do gráfico.
Form1->aux = 399; //
Label2->Caption = "76,92"; //
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
ReadThread->Terminate(); // Finaliza o Thread e da um delay
Sleep(250); // para que seja terminar a finalização
// Descarta todos os dados do Buffer da ComPort
PurgeComm(hComm, PURGE_RXABORT);
// Restaura a antiga configuração de TimeOut da ComPort
SetCommTimeouts(hComm, &ctmoOld);
75
CloseHandle(hComm); // Fecha a comPort.
}
//---------------------------------------------------------------------------
void __fastcall TForm1::RadioButton5Click(TObject *Sender)
{ // Grandeza de 1 Hz.
escala = 255; // Envia ao microcontrolador a informação de escala que
TransmitCommChar(hComm, escala); // deve ser usada para amostragem do sinal -> no caso 1x500*.
Label2->Caption = "3846,52"; // -----> micro segundos por amostragem.
} // * Nesse caso é enviado 255 para que caiba
// em um char. Mas no firmware da placa esse
// dado é alterado para 500.
//---------------------------------------------------------------------------
void __fastcall TForm1::RadioButton6Click(TObject *Sender)
{ // Grandeza de 10 Hz.
escala = 50; // É enviado ao circuito o valor 50,
TransmitCommChar(hComm, escala); // referente a escala de armazenar apenas
Label2->Caption = "384,62"; // 1 a cada 50 pontos adquiridos.
} // 384,62 uS por amostragem
//---------------------------------------------------------------------------
void __fastcall TForm1::RadioButton7Click(TObject *Sender)
{
escala = 10;
TransmitCommChar(hComm, escala);
Label2->Caption = "76,92";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::RadioButton8Click(TObject *Sender)
{
escala = 5;
TransmitCommChar(hComm, escala);
Label2->Caption = "38,31";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::RadioButton9Click(TObject *Sender)
76
{
escala = 1;
TransmitCommChar(hComm, escala);
Label2->Caption = "7,69";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::RadioButton10Click(TObject *Sender)
{
escala = 1;
TransmitCommChar(hComm, escala);
Label2->Caption = "7,69";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::RadioButton11Click(TObject *Sender)
{
escala = 1;
TransmitCommChar(hComm, escala);
Label2->Caption = "7,35";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::RadioButton12Click(TObject *Sender)
{
escala = 1;
TransmitCommChar(hComm, escala);
Label2->Caption = "7,35";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
float vl_medio;
int i,j,valor_max,trigger_pont;
if (stop_aquire == 1) // verifica se flag de escrita no buffer está travada
{ // stop_aquire = 1, significa que está travada.
/**********************************************************************************
Abaixo é especificado o tamanho do buffer a ser preenchido para exibição do gráfico
77
de acordo com a seleçao da escala de tempo.
* Tamanho1 - é o numero de pontos que serão exibidos no gráfico
* Tamanho2 - é o tamanho do buffer que deve ser acumulado antes de se iniciar o
processo de desenho do gráfico - necessita ser o dobro para poder rodar o
algoritmo de auto trigger e trigger manual.
* aux - é apenas uma variavel q vale -1 do valor de tamanho 1, sua intenção é
facilitar e almentar a velocidade de certos loops poupando-as de mais uma conta
*********************************************************************************/
if (Form1->RadioButton12->Checked)
{
Form1->tamanho1 = 20;
Form1->tamanho2 = 40;
Form1->aux = 19;
}
else
{
if (Form1->RadioButton11->Checked)
{
Form1->tamanho1 = 40;
Form1->tamanho2 = 80;
Form1->aux = 39;
}
else
{
if (Form1->RadioButton10->Checked)
{
Form1->tamanho1 = 200;
Form1->tamanho2 = 400;
Form1->aux = 199;
}
else
{
Form1->tamanho1 = 400;
Form1->tamanho2 = 800;
Form1->aux = 399;
}
}
}
78
if (Form1->RadioButton1->Checked) // Captura Ininterrupta
{
SLScope1->Channels->Channels[ 0 ]->Data->SetYData(buffer1, (Form1->tamanho1) );
stop_aquire = 0;
}
else
{
if (Form1->RadioButton2->Checked) // Captura com auto trigger
{
vl_medio = 0;
for (i = 0; i < aux; i++) //
{ // Cálculo do valor médio
vl_medio = vl_medio + buffer1[i]; // para ajustar o nível do
} //
vl_medio = (vl_medio/aux); //
for (i = 0; i < aux; i++) //
{ //
if ((buffer1[i] <= vl_medio) && (buffer1[i+1] >= vl_medio))
{ // Procurando o ponto
trigger_pont = i; // onde o sinal capturado
i = aux; // corta o valor médio
} // com derivada positiva
} //
j = 0;
valor_max = trigger_pont + (Form1->tamanho1); //
for (i = trigger_pont; i <= valor_max; i++) // Geração de um novo buffer a
{ // partir do novo ponto inicial
buffer2[j] = buffer1[i]; // (trigger) - Ajustado pela
j++; // derivada positiva da onda
} // onde corta o Valor médio
// Desenha os pontos no gráfico
SLScope1->Channels->Channels[ 0 ]->Data->SetYData(buffer2, (Form1->tamanho1) );
stop_aquire = 0;
}
else
{
if (Form1->RadioButton3->Checked) // Captura com trigger manual
{ // Como o trigger é manual, aqui o
vl_medio = Form1->Edit1->Text.ToDouble(); // a variável vl_médio recebe o valor
79
for (i = 0; i < aux; i++) // ajustado na Edit1 - que será o nível
{ // do trigger
if ((buffer1[i] <= vl_medio) && (buffer1[i+1] >= vl_medio)) // Procurando o ponto
{ // onde o sinal capturado
trigger_pont = i; // corta o valor ajustado
i = aux; // em Edit1 com derivada positiva
}
}
j = 0;
valor_max = trigger_pont + (Form1->tamanho1);
for (i = trigger_pont; i <= valor_max; i++) // Geração do novo buffer com os pontos
{ // a partir do ponto onde ocorre o
buffer2[j] = buffer1[i]; // cruzamento com derivada positiva
j++; // do sinal analizado com o nível de
} // trigger desejado
SLScope1->Channels->Channels[ 0 ]->Data->SetYData(buffer2, (Form1->tamanho1) ); // desenha o gráfico
stop_aquire = 0;
}
}
}
stop_aquire = 0; // Flag de escrita no buffer liberado
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Form1->Edit1->Text = Form1->Edit1->Text.ToDouble() + 0.2 ; // Incrementa nível de trigger manual
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Form1->Edit1->Text = Form1->Edit1->Text.ToDouble() - 0.2 ; // Decrementa o nível de trigger
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender) // Captura Única
{
while (stop_aquire == 0); // Espera o buffer estar cheio para só depois desenhar os pontos
SLScope1->Channels->Channels[ 0 ]->Data->SetYData(buffer1, (Form1->tamanho1) );
80
}
//---------------------------------------------------------------------------
void __fastcall TForm1::RadioButton4Enter(TObject *Sender)
{ // Habilita o botão capturar quando
Form1->Button3->Enabled = true; // o radiobutton4 (Captura Única)
} // é ativado
//---------------------------------------------------------------------------
void __fastcall TForm1::RadioButton3Click(TObject *Sender)
{ // Desabilita o botão capturar quando
Form1->Button3->Enabled = false; // algum radiobutton do modo de captura
} // diferente do radiobutton4 é ativado
//--------------------------------------------------------------------------
void __fastcall TForm1::RadioButton2Click(TObject *Sender)
{ // Desabilita o botão capturar quando
Form1->Button3->Enabled = false; // algum radiobutton do modo de captura
} // diferente do radiobutton4 é ativado
//---------------------------------------------------------------------------
void __fastcall TForm1::RadioButton1Click(TObject *Sender)
{ // Desabilita o botão capturar quando
Form1->Button3->Enabled = false; // algum radiobutton do modo de captura
} // diferente do radiobutton4 é ativado
//---------------------------------------------------------------------------
void __fastcall TForm1::Button4Click(TObject *Sender)
{
Edit3->Text = Edit2->Text.ToDouble() * Label2->Caption.ToDouble(); // uS por divisão
Edit4->Text = (1/(Edit2->Text.ToDouble() * Label2->Caption.ToDouble()))*1000000; // Frequência do sinal
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button5Click(TObject *Sender)
{
Form1->Edit5->Text = Form1->Edit5->Text.ToDouble() + 0.1; // Soma 0,1V no ajuste de offset manual
} //---------------------------------------------------------------------------
void __fastcall TForm1::Button6Click(TObject *Sender)
{
Form1->Edit5->Text = Form1->Edit5->Text.ToDouble() - 0.1; // Subtrai 0,1V no ajuste de offset manual
}
//---------------------------------------------------------------------------
81
Unit1.h //---------------------------------------------------------------------------
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include "SLScope.h"
#include <ExtCtrls.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
TSLScope *SLScope1;
TGroupBox *GroupBox1;
TComboBox *ComboBox1;
TGroupBox *GroupBox2;
TRadioButton *RadioButton1;
TRadioButton *RadioButton2;
TRadioButton *RadioButton3;
TStaticText *StaticText1;
TRadioButton *RadioButton4;
TEdit *Edit1;
TStaticText *StaticText2;
TButton *Button1;
TButton *Button2;
TButton *Button3;
TGroupBox *GroupBox3;
TRadioButton *RadioButton5;
TRadioButton *RadioButton6;
TRadioButton *RadioButton7;
TRadioButton *RadioButton8;
TRadioButton *RadioButton9;
TRadioButton *RadioButton10;
TRadioButton *RadioButton11;
TRadioButton *RadioButton12;
TTimer *Timer1;
82
TLabel *Label1;
TLabel *Label2;
TLabel *Label3;
TEdit *Edit2;
TButton *Button4;
TEdit *Edit3;
TEdit *Edit4;
TLabel *Label4;
TLabel *Label5;
TLabel *Label6;
TLabel *Label7;
TEdit *Edit5;
TLabel *Label8;
TButton *Button5;
TButton *Button6;
void __fastcall FormClose(TObject *Sender, TCloseAction &Action);
void __fastcall ComboBox1Select(TObject *Sender);
void __fastcall RadioButton5Click(TObject *Sender);
void __fastcall RadioButton6Click(TObject *Sender);
void __fastcall RadioButton7Click(TObject *Sender);
void __fastcall RadioButton8Click(TObject *Sender);
void __fastcall RadioButton9Click(TObject *Sender);
void __fastcall RadioButton10Click(TObject *Sender);
void __fastcall RadioButton11Click(TObject *Sender);
void __fastcall RadioButton12Click(TObject *Sender);
void __fastcall Timer1Timer(TObject *Sender);
void __fastcall Button2Click(TObject *Sender);
void __fastcall Button1Click(TObject *Sender);
void __fastcall Button3Click(TObject *Sender);
void __fastcall RadioButton4Enter(TObject *Sender);
void __fastcall RadioButton3Click(TObject *Sender);
void __fastcall RadioButton2Click(TObject *Sender);
void __fastcall RadioButton1Click(TObject *Sender);
void __fastcall Button4Click(TObject *Sender);
void __fastcall Button5Click(TObject *Sender);
void __fastcall Button6Click(TObject *Sender);
private: // User declarations
public: // User declarations
float buffer1[2000], buffer2[2000];
83
int stop_aquire,tamanho1,tamanho2,aux;
unsigned char escala;
__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
Unit2.c //---------------------------------------------------------------------------
#include <vcl\vcl.h>
#pragma hdrstop
// YOU MUST INCLUDE THE HEADER FOR UNIT1
#include "Unit1.h"
#include "Unit2.h"
extern HANDLE hComm;
char InBuff[100];
//---------------------------------------------------------------------------
__fastcall TRead::TRead(bool CreateSuspended)
: TThread(CreateSuspended)
{
}
//---------------------------------------------------------------------------
void __fastcall TRead::Execute()
{
float data_in;
char i,j;
DWORD dwBytesRead;
FreeOnTerminate = true;
// Destroi o Thread Object quando o thread terminar
while(1)
{
ReadFile(hComm, InBuff, 50, &dwBytesRead, NULL); // Lê o Buffer da Serial
84
if(dwBytesRead) // Se houver Bytes no buffer
{
for (i = 0; i < dwBytesRead; i++) // Lê 1 a 1 todos os Bytes que houver
{ // no Buffer da ComPort.
data_in = InBuff[i];
/*********************************************************************
Para que o código abaixo seja compreendido vale lembrar que:
*O ADC do MicroControlador da Luminary Micro lê apenas de 0 a 3 Volts com precisão de 10 Bits,
contudo só utilizamos 8 Bits, para agilizar a transferência de dados.
*Como na conversão o valor 0 Volt vale 00000000, o valor logo acima vale 00000001 e assim segue até
3 Volts que é representado por 11111111, é necessário um algoritmo para transformar estas
representações em valores onde:
**0 Volt no ADC deverá valer -20 Volts no gráfico;
**1,5 Volts no ADC deverá valer 0 Volts no gráfico;
**3 Volts no ADC deverá valer 20 Volts no gráfico.
Abaixo Segue o código
********************************************************************/
if (!(InBuff[i] & 0x80))
{
data_in = InBuff[i];
data_in = (data_in/6.4)-20;
}
else
{
data_in = (InBuff[i] & 0x7f);
data_in = (data_in/6.4);
}
// Soma o Offset manual ao sinal de entrada
data_in = data_in + Form1->Edit5->Text.ToDouble();
if (Form1->stop_aquire == 0) // Quandoo flag de aquisição de dados
{ // stop_aquire valer 0, os dados coletados na serial
Form1->buffer1[cont1] = data_in; // passaram a preencher o buffer do gráfico
cont1++;
if (cont1 == Form1->tamanho2)
{ // Quando o numero de pontos coletados for suficiente pra desenhar
cont1 = 0; // o gráfico (tamanho2) o contador zera, e o armazenamento de dados
Form1->stop_aquire = 1; // no buffer do gráfico é interrompido
} // para que o gráfico seja desenhado sem risco
85
} // de alterações inesperadas no conteúdo do buffer.
}
}
}
}
Unit2.h //---------------------------------------------------------------------------
#ifndef Unit2H
#define Unit2H
//---------------------------------------------------------------------------
#include <Classes.hpp>
//---------------------------------------------------------------------------
class TRead : public TThread
{
private:
protected:
void __fastcall Execute();
public:
int cont1;
__fastcall TRead(bool CreateSuspended);
};
//---------------------------------------------------------------------------
#endif
86
APÊNDICE C
Os esquemáticos do circuito do microcontrolador e do CI Serial USB do kit de
desenvolvimento da Luminary Micro, Stellaris LM3S811 Evaluation Board, segue nas
Figuras 47 e 48 respectivamente.
Observa-se na Figura 47 o esquema elétrico do CI LM3S811 utilizando um
cristal de 6 MHz, pode-se visualizar também o pinos da interface JTAG. Os pinos 18 e
17, Tx e Rx respectivamente, referentes a UART0 são os que estão conectados ao CI
FTDI2232c responsável pela comunicação Serial x USB.
Na Figura 48 vale notar que além de 2 portas seriais o Chip Serial USB da
FTDI possui também saídas de interface JTAG a fim de permitir programação e debug
do microcontrolador.
87
Figura 47 - Esquemático do LM3S811 da Kit da Luminary Micro.
88
Figura 48 - Esquemático do CI FTDI2232c do Kit (Serial x USB).