INSTITUTO SUPERIOR TÉCNICO Universidade Técnica de Lisboa Aquisição Local e Processamento Remoto dos Dados Colhidos por um Sensor de Teste Não-Destrutivo João Miguel Sotomayor Calvário Dissertação para a obtenção do grau de mestre em Engenharia Electrotécnica e de Computadores Júri Presidente: Professor Marcelino Bicho dos Santos Orientadores: Professor Artur Lopes Ribeiro Professora Helena Geirinhas Ramos Vogal: Professor Carlos Beltran de Almeida Outubro de 2010
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
INSTITUTO SUPERIOR TÉCNICO
Universidade Técnica de Lisboa
Aquisição Local e Processamento Remoto dos Dados
Colhidos por um Sensor de Teste Não-Destrutivo
João Miguel Sotomayor Calvário
Dissertação para a obtenção do grau de mestre em
Engenharia Electrotécnica e de Computadores
Júri
Presidente: Professor Marcelino Bicho dos Santos
Orientadores: Professor Artur Lopes Ribeiro
Professora Helena Geirinhas Ramos
Vogal: Professor Carlos Beltran de Almeida
Outubro de 2010
II
(Página deixada em branco intencionalmente)
III
Agradecimentos
Em primeiro lugar, gostaria de agradecer aos meus professores orientadores, Professor Artur
Lopes Ribeiro e Professora Helena Geirinhas Ramos, por me terem oferecido a oportunidade de
realizar uma tese de dissertação numa área do meu interesse e por me terem acompanhado ao longo
do período em que estive a realizá-la.
Gostaria por outro lado de agradecer a todos os meus familiares que me apoiaram durante o
período em que realizei a dissertação, e em particular aos meus pais, irmãos e namorada por me
terem apoiado e ajudado em muitas ocasiões ao longo da mesma.
Gostaria também de agradecer a todos os meus amigos, os quais estiveram igualmente
sempre presentes ao longo da realização da dissertação.
Por último gostaria de agradecer a todos as pessoas que fazem parte do Departamento do
Instituto das Telecomunicações no qual eu realizei a tese, pelo apoio que me deram sempre que era
necessário.
IV
Resumo
Esta dissertação encontra-se dividida em três partes. Na primeira foi utilizado um algoritmo de
processamento de sinal chamado Sine-fitting. Este programa traduz-se numa aplicação do método
dos mínimos quadrados. Quando aplicamos este programa estamos a aplicar um método de
regressão na medida em que recolhemos amostras de forma a calcular a amplitude e a fase do sinal.
Aqui todos os sinais foram gerados numa aplicação “Matlab” executada num computador pessoal. Na
segunda parte, foi utilizado igualmente este algoritmo de Sine-fitting, mas neste caso os sinais foram
gerados num gerador de funções, sendo transferidos para o computador por um sistema de aquisição
de dados para posterior processamento. Estas duas partes foram importantes, na medida em que se
ficou a conhecer a frequência de amostragem necessária e a capacidade do canal de transmissão
sem fios de modo que os dados transmitidos de um sensor para um computador, possa ser feito sem
elevados tempos de espera entre transmissões sucessivas. Após serem conhecidos estes valores foi
iniciada a última parte da dissertação, que consiste em aplicar este algoritmo de Sine-fitting, mas
agora utilizando um sistema sem fios, baseado num PIC 18F4550 inserido numa placa de teste.
Nesta última parte, a digitalização do sinal proveniente do gerador de funções vai ser realizada no
PIC, sendo o resultado posteriormente enviado por um sistema sem fios para o computador, onde
será processado através do programa Sine-fitting. Para garantir comunicação sem fios, são utilizadas
portas RS-232, bem como emissores-receptores a funcionar na gama de frequência dos 400 Mhz.
Palavras-chave : Microprocessador, Sine-fitting, Sistema de Aquisição, Transmissão sem fios
V
Abstract
This Master Thesis is divided in three parts. In the first part, an algorithm of signal processing
named sine-fitting was developed. This algorithm reflects an application of the least square method.
When this method is applied, we are performing a regression, in a way that samples are acquired in
order to compute the amplitude and phase shift of a sinusoidal signal that is corrupted by noise. Here,
all the signals were generated in “Matlab”, working in a laptop. In the second part, the sine-fitting
algorithm was also utilized, but signals were generated in a function generator, to further be sent to a
16 bit acquisition board, to be transformed in their digital representation. After the digitalization, signals
are sent to the computer for sine-fitting processing. These two parts were important, to determine the
necessary sampling rate and the full capacity needed in the transmission buffer, so that the data
transmitted through a sensor to a laptop, can be done without delay between consecutive
transmissions. The last part of this Master Thesis consists in an application of the sine-fitting algorithm
using a wireless channel. In this third part, a PIC 18F4550 microcontroller inserted on a testing board
was used. Here, the digitalization of the analog signal from the function generator will be done in the
PIC, and the result should be sent through a wireless channel to the computer for further sine-fitting
processing. To guarantee a good communication, a RS-232 interface is used, together with wireless
Agradecimentos ...................................................................................................................................... III
Resumo .................................................................................................................................................. IV
Abstract.................................................................................................................................................... V
Lista de Tabelas ................................................................................................................................... VIII
Lista de Figuras ...................................................................................................................................... IX
Apêndice 3. Código para o Matlab .................................................................................................... 70
VIII
Lista de Tabelas
Tabela 1 – Resultados obtidos para uma percentagem de ruído de 10 % relativamente à amplitude .................. 18
Tabela 2 – Resultados obtidos para uma percentagem de ruído de 50 % relativamente à amplitude .................. 18
Tabela 3 – Resultados obtidos para uma percentagem de ruído de 100 % relativamente à amplitude ................ 19
Tabela 4 – Resultados obtidos para uma percentagem de ruído de 10 % relativamente à fase ........................... 22
Tabela 5 – Resultados obtidos para uma percentagem de ruído de 50 % relativamente à fase ........................... 23
Tabela 6 – Resultados obtidos para uma percentagem de ruído de 100 % relativamente à fase ......................... 24
Tabela 7 – Resultados finais para a amplitude ...................................................................................................... 27
Tabela 8 – Resultados finais para a fase .............................................................................................................. 28
Tabela 9 – Resultados finais ................................................................................................................................. 28
Tabela 10 – Cálculos auxiliares para controlar o ganho ........................................................................................ 32
Tabela 11 – Tempo de aquisição igual a 1 milissegundo (1 Período adquirido) ................................................... 33
Tabela 12 – Tempo de aquisição igual a 40 milissegundos (40 Períodos adquiridos) .......................................... 34
Tabela 13 – Resultados para a amplitude face aos diferentes níveis de ruído utilizados ...................................... 35
Tabela 14 – Resultados para a diferença de fase face aos diferentes níveis de ruído utilizados .......................... 35
Tabela 15 – Número de amostras necessárias para garantir bons resultados para a fase, e amplitude .............. 38
Tabela 16 – Registos TRIS ................................................................................................................................... 48
Tabela 17 – Registos utilizados para realizar uma transmissão UART ................................................................. 48
Tabela 18 – Registos utilizados para realizar uma conversão A/D........................................................................ 51
Tabela 19 – Registos para controlar os contadores .............................................................................................. 51
IX
Lista de Figuras
Figura 1 – Formação de eddy currents numa placa metálica .................................................................................. 3
Figura 2 – Sensor em forma de panqueca .............................................................................................................. 4
Figura 3 – Sinal inicial mais ruído a serem processados pelo algoritmo de sine-fitting ......................................... 10
Figura 4 – Distribuição normal com média µ e desvio padrão σ ............................................................................ 12
Figura 5 – Esquema de funcionamento do programa ............................................................................................ 14
Figura 6 – Desvio padrão da amplitude, considerando as 300 repetições, e sinais com 10% de ruído da amplitude
Figura 15 – Valores máximos e mínimos da fase das amostras com ruído 10 % ................................................. 23
Figura 16 – Valores máximos e mínimos da fase das amostras com ruído 50 % ................................................. 24
Figura 17 – Valores máximos e mínimos da fase das amostras com ruído 100 % ............................................... 25
Figura 18 – 2 períodos e 3 pontos por período com 10 % de ruído....................................................................... 25
Figura 19 – 10 Períodos e 10 pontos por período com 10% de ruído ................................................................... 26
Figura 20 – 30 períodos e 30 pontos por período com 10% de ruído .................................................................... 27
Figura 21 – Circuito utilizado para adicionar ruído e desfasar o sinal sinusoidal................................................... 31
Figura 22 – Resultados para a amplitude face a diferentes níveis de ruído .......................................................... 36
Figura 23 – Resultados para a fase face a diferentes níveis de ruído ................................................................... 36
Figura 24 – Amplitude de ruído de 10 mV ............................................................................................................. 37
Figura 25 – Amplitude de ruído de 2 V .................................................................................................................. 38
Figura 26 – Esquema geral com os 2 emissores-receptores, o PIC18F4550 e o computador .............................. 40
Figura 27 – Diagrama de blocos referente à escolha da frequência de oscilação ................................................ 41
Figura 28 – Circuito de aplicação do MAX232A .................................................................................................... 45
Figura 29 – Esquema de funcionamento do programa no PIC18F4550 ................................................................ 47
Figura 30 – Número de ciclos TAD numa conversão A/D ..................................................................................... 52
Figura 31 – Cálculo da frequência de amostragem com o auxílio de contadores ................................................. 53
Figura 32 – Amplitude igual a 2 V, frequência de sinal de 1 kHz e offset de 2 V .................................................. 55
Figura 33 – Amplitude igual a 2 V, frequência de sinal de 1 kHz e 2 V de offset .................................................. 56
Figura 34 – Placa de circuito impresso com o circuito de aplicação MAX232A .................................................... 62
1
1. Introdução
Este capítulo tem como objectivo introduzir o trabalho que será apresentado de seguida. Este
trabalho enquadra-se na área dos métodos não destrutivos, mais especificamente no método das
correntes de Foucault ou eddy currents, cujo objectivo é detectar defeitos ou fissuras em placas
metálicas. No início deste capítulo, é feito um enquadramento geral da tese, em que é explicitado
qual o propósito de realizar este estudo. De seguida é analisada a importância dos métodos não
destrutivos e são apresentados alguns trabalhos realizados por diversos autores. Aqui será possível
observar que foram feitos muitos estudos sobre esta área, em que as maiores inovações são ao nível
dos sensores usados no método das Correntes de Foucault. Contudo, a comunicação entre estes
sensores e o computador é normalmente feita por fio e utilizando sistemas de aquisição de grande
porte e de elevado preço, sendo que na literatura referente à área em estudo, não foram encontrados
artigos que utilizassem um PIC18F4550 para realizarem simultaneamente a aquisição e comunicação
sem fios por uma porta série RS-232, aplicados às técnicas dos métodos não destrutivos. É neste
tema relacionado com a comunicação através de uma porta série RS-232 que esta dissertação vai ter
importância e relevância. Após realizado este trabalho, será possível usar um PIC para fazer a
aquisição dos sinais, bem como o envio dos dados para o computador usando um emissor-receptor.
Por último são apresentados os objectivos da tese, bem como a sua estrutura em capítulos.
1.1. Enquadramento do trabalho
Actualmente, com o evoluir da tecnologia, surgiu a necessidade de criar técnicas de análise,
em que fosse possível observar os objectos sem os danificar, ou destruir. Como tal, surgiu um campo
de investigação, ao qual se dá o nome de “métodos não destrutivos”. Como o próprio nome indica,
estes métodos baseiam-se em técnicas intrusivas e não destrutivas, em que não é necessário
danificar os materiais ou objectos em estudo. Uma outra característica fundamental e que caracteriza
fortemente estes métodos é o facto de estes pouparem tempo e dinheiro às empresas e
fornecedores, na medida em que têm uma excelente relação entre controlo de qualidade e custo
efectivo. Estas técnicas são usadas em diversas indústrias, entre as quais se encontram a
engenharia electrotécnica, a engenharia civil, a engenharia espacial e a medicina [1-6] .
Como foi referido no parágrafo anterior, existem diversos métodos não destrutivos, sendo que
só serão abordados os métodos de correntes de Foucault (electromagnéticos), de Radiação por
Raios X e Ultra-sons, dando especial atenção ao método Electromagnético por correntes de Foucault.
2
Os raios X foram descobertos no final do século XIX, e devem a sua descoberta ao físico
alemão Wilhelm Conrad Rontgen. Os raios X encontram-se num dos extremos do espectro
electromagnético, em que as frequências têm valores a rondar os 1020 Hz, o comprimento de onda é
da ordem dos picometros e a energia de um fotão é da ordem das centenas de KeV. Mais
precisamente, o comprimento de onda de um feixe de ondas electromagnéticas de Raios X está
compreendido entre 1 nanometro e 5 picometros. O princípio dos raios X baseia-se em acelerar um
conjunto de partículas electrões contra um alvo de tungsténio [1] . Quando estas partículas são
aceleradas, ganham energia, para posteriormente se darem fenómenos de choque. Quando o feixe
seja ao alvo de tungsténio, é libertada uma radiação, ao qual se dá o nome de Raio-X. Uma das
maiores limitações deste método é que uma elevada exposição a esta radiação provoca danos ao
nível molecular, podendo mesmo provocar cancro [1-3] .
No método não destrutivo baseado em ultra-sons, são utilizadas ondas sonoras de alta
frequência, para fazer medidas sobre falhas em objectos, caracterização de um determinado material,
entre outras. Deste método, importa reter que inicialmente são geradas ondas sonoras de alta
frequência, as quais são passadas através do objecto em estudo [1-3] . Se porventura este objecto
tiver defeitos, as ondas irão propagar-se de maneira diferente, o que permite caracterizar a qualidade
dos materiais, bem como a existência de defeitos e a sua caracterização.
Por último, falta explicar o método não destrutivo baseado em correntes de Foucault. Dos três
métodos mencionados, o método das correntes de Foucault é o único que usa como base os
princípios do electromagnetismo [1-3] . Em meados do século XIX, o físico James Clerk Maxwell,
escreveu quatro equações que definem hoje todo o Mundo do electromagnetismo. Não serão
apresentadas essas equações, visto saírem da órbita do trabalho, mas será explicado o seu princípio
básico. Num material condutor, quando sujeito a um campo magnético variável no tempo, gera-se
uma corrente eléctrica ao qual se dá o nome de corrente eléctrica induzida. Estas pesquisas foram de
uma importância enorme e são a base do método não destrutivo por correntes de Foucault. Neste
método, é necessário um enrolamento de excitação, uma corrente de excitação e um material
condutor. Numa primeira fase, é injectada uma corrente variável no tempo no enrolamento de
excitação, a qual produz um campo magnético também variável no tempo. Por sua vez, na presença
de um condutor (placas de alumínio ou outro condutor), este campo electromagnético vai induzir
correntes no alumínio. A estas correntes dá-se o nome de correntes de Foucault. Por último, estas
correntes dão origem a um segundo campo magnético, o qual vai ser então detectado por um sensor
de campo, que tanto pode ser uma outra bobina, como um sensor de magnetoresistência gigante,
GMR. Na Figura 1 encontra-se exemplificado o princípio enunciado em cima.
3
O GMR é um sensor que é usado para detectar campos magnéticos de baixa intensidade,
provocado pelas falhas que eventualmente possam existir no material. Se não existirem falhas, o
campo detectado pelo GMR permanecerá inalterado. Existem diversas vantagens de usar este
método das correntes de Foucault, sendo as mais relevantes o facto de ser possível detectar
pequenas falhas, o facto de serem produzidos resultados imediatos após uma medição e o facto de o
equipamento ser bastante portátil [7,8,9] .
Posto isto, falta referir que os sinais provenientes do sensor contêm algum ruído, próprio da
alta sensibilidade do método das correntes de Foucault. Como tal, é necessário digitalizar esses
sinais, para posteriormente ser aplicado um algoritmo que os interprete e que, independentemente do
ruído existente, consiga estimar a sua amplitude e fase, para os casos em que a excitação é feita por
ondas sinusoidais. Para tal efeito, foi utilizado um algoritmo de sine-fitting, baseado em [10] e no
estudo realizado pelo autor [11] . Esta explicação será feita no subcapítulo do Estado da Arte.
Resumindo, esta dissertação tem como objectivo transmitir os sinais provenientes dos
sensores utilizados no método das correntes de Foucault por um canal sem fios. Das referências
bibliográficas encontradas na área, não se encontram referências ou artigos relacionados com o tema
“Wireless acquisition systems for detection of cracks in conductive materials”. Como tal, este estudo
assume relevância nesta área, ou seja, na concepção de um sistema sem fios, para ser utilizado na
detecção de fissuras em placas condutoras, usando o método das correntes de Foucault.
Campo Magnético
Eddy Currents
Sensor
Campo de excitação
Placa metálica
Figura 1 – Formação de eddy currents numa placa metálica
4
1.2. Estado da Arte
Nesta secção, começar-se-á por apresentar estudos sobre autores que desenvolveram
diferentes sensores para o método não destrutivo das correntes de Foucault, bem como referências a
aplicações práticas deste mesmo método. Por último será apresentado um algoritmo de sine-fitting,
que será posteriormente utilizado nesta dissertação.
1.2.1. Método das correntes de Foucault
O facto de os sensores usados para o método das correntes de Foucault serem melhorados,
resulta por um lado numa maior precisão na detecção das falhas, e por outro, numa diminuição do
ruído presente nas medições [8] . No estudo [8] , os autores utilizaram um novo sensor, baseado
numa bobina com uma geometria rectangular juntamente com um magnetoresistência de alta
sensibilidade (GMR) para averiguar falhas em zonas soldadas. Num estudo anterior, estes mesmos
autores tinham usado pankake probes, ou sensores em forma de panqueca, concluindo que com este
tipo de sensor era difícil detectar falhas devido ao intenso ruído [8] . Na Figura 2 encontra-se um
sensor em forma de panqueca, juntamente com um sensor magnético, o GMR. Para realizar a
aquisição, foi usada uma placa de aquisição NI PXI-6120, sendo a interface entre a placa e o sensor
feita por fios através do protocolo de comunicação RS-232. Os autores concluíram que com um
sensor com geometria rectangular, já era possível detectar falhas perpendicular e paralelamente às
zonas soldadas.
GMR
Bobina de excitação
Figura 2 – Sensor em forma de panqueca
5
Num outro estudo, os autores [12] utilizaram um sensor diferente, baseado numa segunda
bobina para detectar o campo gerado pelas correntes de Foucault (eddy currents) na presença de
placas metálicas condutoras não magnéticas. O objectivo era detectar falhas em placas metálicas de
alumínio com cerca de 4 milímetros. Neste sensor foi usada uma bobina para gerar o campo de
excitação e duas bobinas para detectar o campo induzido. Os autores concluíram que os resultados
foram positivos, na medida em que com estes sensores é possível detectar falhas superficiais. Em
contrapartida, apesar de os sensores indutivos serem os mais frequentes em testes não destrutivos
baseados em correntes de Foucault, o seu desempenho está longe de ser ideal [9] .
Num outro estudo [9] , os autores em substituição do GMR, que já demonstrou ter capacidade
de detectar com sensibilidade falhas em placas condutoras [8,9] , utilizaram um outro tipo de sensor
magnético, ao qual se dá o nome de GMI (Giant Magneto Impedance). Estes sensores têm a
vantagem de combinar alta sensibilidade, rápida resposta e tamanho diminuto. Após realizarem
diversos testes em materiais ferromagnéticos, os autores concluíram que este sensor com o GMI
produz resultados com elevada precisão na detecção de falhas. Para além das excelentes
capacidades de detecção enunciadas pelos autores, estes ainda acrescentam que com esta
tecnologia é possível detectar campos com pouca intensidade a frequências baixas.
Contudo, um método mais avançado para realizar testes baseados no método de correntes
de Foucault, consiste em usar um conjunto de sensores GMR com sensibilidades independentes da
frequência. Isto resulta num melhoramento ao nível da profundidade de detecção da falha, da rapidez
de detecção e na resolução [13] . Com esta tecnologia, é possível com apenas um varrimento de uma
determinada área, ficar com uma caracterização perfeita do local inspeccionado. Duas outras
vantagens destes sensores magnéticos são o baixo consumo de energia e a sua pequena dimensão
[13] . No estudo [13] , os autores realizaram vários testes, em que o número de GMR’s presentes no
sensor foi de 8 ou 16. Esta tecnologia foi aplicada à caracterização de fissuras em torno de furos de
rebite, bem como à detecção de defeitos que possam existir devido à corrosão entre as camadas
constituintes de uma estrutura em multi-camadas de uma aeronave. A este conjunto de GMR’s num
mesmo sensor também se dá o nome de matrizes de GMR’s.
Num outro estudo ainda mais avançado tecnologicamente [14] que o anterior [13] , foram
desenvolvidos dois tipos de sensores. Neste estudo, para além de terem sido desenvolvidas novas
arquitecturas para os sensores, foram também optimizadas as matrizes. O primeiro sensor que os
autores apresentam, é constituído por 32 elementos, em que cada elemento é constituído por duas
micro bobinas, o que constitui um aumento de 32 vezes face ao estudo [12], na medida em que
nesse estudo foram utilizadas somente duas bobinas para detectar o campo magnético gerado pelas
correntes de Foucault. Com este sensor de 32 elementos foi possível detectar fissuras com cerca de
0,4 milímetros, ou seja, 10 vezes mais pequenas do que no caso [12] . O segundo sensor
apresentado utilizava matrizes de GMR’s. Este segundo sensor continha cerca de 22 GMR’s, o que é
um acréscimo de 6 GMR’s face ao estudo [13] . Com este sensor é possível detectar fissuras com
6
cerca de 0.1 milímetros. Contudo os autores desejam desenvolver mais a tecnologia, de modo a ser
possível detectar falhas com menor dimensão, para que no futuro seja possível usar estes métodos
não destrutivos num maior número de aplicações.
Como tal, esta área é extremamente vasta, pelo que é necessário continuar constantemente
a melhorar a tecnologia utilizada para responder aos novos obstáculos que são colocados. Por outro
lado, com a tecnologia existente, já é possível aplicar estes conhecimentos a situações práticas do
dia-a-dia. No estudo [4] , os autores utilizaram um sensor com uma magnetoresistência (GMR) para
detectar falhas em peças de aviões. Este tipo de estudo é extremamente importante, na medida em
que um dos maiores problemas dos aviões é o aparecimento de falhas junto das zonas em tensão.
Por outro lado, quando se pretende fazer manutenção de aviões, o método das correntes de Foucault
é o método mais económico [15] para detectar falhas. Outros autores [5] , realizaram um estudo com
base em métodos não destrutivos por radiografia, no qual fazem uma inspecção a cabos de média
tensão, observando se estes se encontram nas perfeitas condições para serem usados. Os autores
concluíram que com a ajuda da radiografia conseguem detectar pequenas falhas no interior dos
cabos. Como estes casos práticos apresentados, existem outros em áreas diferentes. Cada vez mais
é importante desenvolver os métodos e técnicas não destrutivas existentes, na medida em que com o
passar dos anos, novas exigências vão aparecer fazendo com que novas tecnologias tenham de ser
implementadas.
1.2.2. Algoritmo de Sine-fitting
Em certas aplicações, por vezes é necessário estimar a amplitude, a fase e a frequência de
um determinado sinal sinusoidal caracterizado por um determinado número de amostras, às quais se
sobrepõe ruído. Por vezes, um destes parâmetros, a frequência, pode ser exactamente conhecido, ou
noutros casos, pode ser simplesmente conhecida uma aproximação deste valor [11] . Uma das
aplicações onde é necessário estimar a amplitude, a fase e por vezes a frequência de amostras de
sinais sinusoidais com ruído é o método não destrutivo com correntes de Foucault [16,17] . Na
literatura [16] , os autores usam uma técnica baseada em correntes de Foucault para detectar falhas
em materiais condutores. A técnica usada consiste na utilização de um sistema de aquisição (DAC)
para posteriormente fazer o processamento do sinal proveniente do sensor, e um algoritmo de sine-
fitting de 3 parâmetros para detectar a amplitude, a fase e a componente DC do sinal proveniente do
sensor. O sensor é constituído por uma bobina de excitação e duas bobinas para detecção do campo
magnético induzido pelas correntes de Foucault. Os resultados obtidos são positivos, mas o método
necessita de aperfeiçoamento de forma a melhorar os resultados. Na literatura [17] , os autores
também utilizaram uma DAC e um algoritmo de sine-fitting para adquirir a amplitude, a fase e a
componente DC dos sinais provenientes do sensor com iguais características à da literatura [16] . A
diferença relativamente à literatura [13] é que neste caso os autores utilizaram um algoritmo de sine-
fitting com 7 parâmetros de forma a conseguir determinar a amplitude, a fase e a componente DC das
duas bobinas que detectam o campo gerado pelas correntes de Foucault. Os autores concluem que a
7
utilização de uma DAC juntamente com um algoritmo de sine-fitting de 7 parâmetros leva a resultados
muito mais precisos, quando comparado com os do algoritmo de sine-fitting com 3 parâmetros.
No estudo realizado pelo autor [11] , a frequência foi fixada e o algoritmo de Sine-fitting usado
foi o de 3 parâmetros, que se encontra igualmente explicado em [10] . O método de sine-fitting
utilizado foi o método dos mínimos quadrados de 3 parâmetros com recurso a operações matriciais.
O objectivo é estimar a amplitude e fase de um sinal sinusoidal representado pelas suas amostras.
A variável () contém as amostras com ruído de um sinal sinusoidal, ao qual se quer estimar
a sua amplitude e fase. NP é o número total de amostras, TS é o período de amostragem e t0 é o
tempo inicial em segundos. Na expressão (1.1) encontra-se um desenvolvimento em série da variável
tempo, em que tn representa uma variável com tempos discretos.
= , + , … , + ∗ (1.1)
Por sua vez, o sinal que se quer estimar, tem a forma da expressão (1.2), em que A é a amplitude, w
a frequência em rad/s e θ é a fase.
() = ∗ sin ( ∗ + ) (1.2)
Posto isto, o problema resume-se a encontrar os valores de A0, B0, C0, que minimizam o somatório
das diferenças ao quadrado que se encontra na equação (1.3). Só depois de calculados estes valores
é que então será possível calcular a amplitude e fase das amostras do sinal sinusoidal com ruído.
[21] Sheldon M. Ross, “Introduction to Probability and Statistics for Engineers and Scientist”, 3ª
Edição, Elsevier/Academic Press, 2004.
[22] A. S. Sedra, K. C. Smith, “Microelectronic circuits”, Oxford University Press, 1997.
62
Apêndice
Apêndice 1. Placa de circuito impresso com MAX232A
Figura 34 – Placa de circuito impresso com o circuit o de aplicação MAX232A
63
Apêndice 2. Código para programa o PIC18F4550
A2.1 Main e funções auxiliares /****************************************************************************/// Autor do código : João Miguel Sotomayor Calvário //Data : Setembro de 2010 //Local: Instituto Superior Técnico – Instituto das Telecomunicações ( IT ) //Professores Orientadores: Prof.Artur Lopes Ribeiro // Prof.Helena Geirinhas Ramos /**********************************************************************************/ // /** I N C L U D E S **********************************************************/ #include <p18cxxx.h> #include “system\typedefs.h” #include “io_cfg.h” #include “delays.h” #include “usart.h” #include “stdio.h” #include “stdlib.h” #define DIM 120 //Dimensão da FIFO. A cada 2 posições corresponde 1 amostras. Unsigned int i=0; unsigned int j=0; unsigned char Buffer_1[DIM];//FIFO do 1ºcanal unsigned char Buffer_2[DIM];//FIFO do 2ºcanal /** Bits de Configuração para a PICDEM FS USB Demo Board com PIC 18F4550***************/ #if defined(PIC18F4550_PICDEM_FS_USB) // PICDEM FS USB Demo Board PIC18F4550 #pragma config PLLDIV = 5 // (20 MHz crystal da PICDEM FS USB board) #pragma config CPUDIV = OSC1_PLL2 #pragma config USBDIV = 2 // Clock source from 96MHz PLL/2. FOSC=48 MHz #pragma config FOSC = HSPLL_HS #pragma config FCMEN = OFF #pragma config IESO = OFF #pragma config PWRT = OFF #pragma config BOR = ON #pragma config BORV = 3 #pragma config VREGEN = ON //USB Voltage Regulator #pragma config WDT = OFF #pragma config WDTPS = 32768 #pragma config MCLRE = ON #pragma config LPT1OSC = OFF #pragma config PBADEN = OFF #pragma config CCP2MX = ON #pragma config STVREN = ON #pragma config LVP = OFF #pragma config ICPRT = OFF // Dedicated In-Circuit Debug/Programming #pragma config XINST = OFF // Extended Instruction Set #pragma config DEBUG = OFF /* Compiles without extra debug code */ #pragma config CP0 = OFF #pragma config CP1 = OFF #pragma config CP2 = OFF #pragma config CP3 = OFF #pragma config CPB = OFF #pragma config CPD = OFF #pragma config WRT0 = OFF #pragma config WRT1 = OFF #pragma config WRT2 = OFF #pragma config WRT3 = OFF #pragma config WRTB = ON // Boot Block Write Protection #pragma config WRTC = OFF #pragma config WRTD = OFF #pragma config EBTR0 = OFF #pragma config EBTR1 = OFF #pragma config EBTR2 = OFF #pragma config EBTR3 = OFF #pragma config EBTRB = OFF
64
#elif defined(PIC18F87J50_FS_USB_PIM) // Bits de configuração para a PIC18F87J50 FS USB Plug-In Module board #pragma config XINST = OFF // Extended instruction set #pragma config STVREN = ON // Stack overflow reset #pragma config PLLDIV = 3 // (12 MHz crystal used on this board) #pragma config WDTEN = OFF // Watch Dog Timer (WDT) #pragma config CP0 = OFF // Code protect #pragma config CPUDIV = OSC1 // OSC1 = divide by 1 mode #pragma config IESO = OFF // Internal External (clock) Switchover #pragma config FCMEN = OFF // Fail Safe Clock Monitor #pragma config FOSC = HSPLL // Firmware must also set OSCTUNE<PLLEN> to start PLL! #pragma config WDTPS = 32768 // #pragma config WAIT = OFF // Commented choices are // #pragma config BW = 16 // only available on the // #pragma config MODE = MM // 80 pin devices in the // #pragma config EASHFT = OFF // family. #pragma config MSSPMSK = MSK5 // #pragma config PMPMX = DEFAULT // #pragma config ECCPMX = DEFAULT #pragma config CCP2MX = DEFAULT #else #error Not a supported board (yet), make sure the proper board is selected in usbcfg.h, and if so, set configuration bits in __FILE__, line __LINE__ #endif /** Variáveis ********************************************************/ #pragma udata /** Protótipos das funções ***************************************/ void sendUART(unsigned char palavra[DIM]); void InitializeUART(void); void InitializePORTS(void); void WriteFIFO1(void); void ADConfigReg_AN1(void); void ADConfigReg_AN2(void); /** V E C T O R R E M A P P I N G *******************************************/ extern void _startup (void); // See c018i.c in your C18 compiler dir #pragma code _RESET_INTERRUPT_VECTOR = 0x000800 void _reset (void) _asm goto _startup _endasm #pragma code #pragma code _HIGH_INTERRUPT_VECTOR = 0x000808 void _high_ISR (void) ; void rx_handler (void); #define BUF_SIZE 22 #pragma code _LOW_INTERRUPT_VECTOR = 0x000818 void _low_ISR (void) ; #pragma code /** Declarações das funcções **************************************************/ #pragma code /****************************************************************************** * Function: void main(void) * * Input: Void * * Output: Nunhum * * Overview: Main do programa. Começo do programa *****************************************************************************/ void main(void) InitializePORTS();
65
InitializeUART(); ADConfigReg_AN1(); while(1) WriteFIFO1(); //end while //end main /****************************************************************************** * Function: void sendUART(unsigned char palavra[20]) * * Input: FIFO com as amostras * * Output: Nenhum * * Overview: Envia para o Buffer de transmissão a FIFO, caracter a caracter *****************************************************************************/ void sendUART(unsigned char palavra[DIM]) unsigned int n=0; while(n<DIM) while(!PIR1bits.TXIF);//Este bit TXIF fica a 1 quando o Buffer do registo TXREG //está cheio e passa a 0 quando o Buffer fica vazio, ou seja, //quando fica disponível para uma outra transmissão TXREG = palavra[n];//Escvreve o caracter no Buffer while(!PIR1bits.TXIF); while(!TXSTAbits.TRMT);//O Bit TRMT passa a 1 quando o registo TSR é limpo n=n+1; /****************************************************************************** * Function: void InitializeUART(void) * * Input: Void * * Output: Nenhum * * Overview: Inicializa a porta série UART, defini a Baud Rate e inicializa os Timers *****************************************************************************/ void InitializeUART(void) RCSTAbits.SPEN=1; //Enable a porta Série TRISCbits.TRISC7=1;//Configuração obrigatório para funcionamento do módulo UART TRISCbits.TRISC6=1;//Configuração obrigatório para funcionamento do módulo UART PIE1bits.TXIE=1; TXSTA = 0x24;// Transmissao activa;BRGH=1;8 bit TX;Assync mode; RCSTA = 0x90;// Activa o Receiver e a porta série SPBRG = 0x71;//0x71; SPBRGH = 0x02;//0x02;// 0x0271 para 48MHz -> 19200 baud BAUDCON = 0x08;// BRG16 = 1 T0CON = 0x08; //Timer0 prescaler 1:2, timer off INTCONbits.TMR0IE = 1; //Interrupção do Timer0 activada INTCON2bits.TMR0IP = 1; INTCONbits.GIE = 1; //Global interrupt enabled TMR0H = 0xFF; //Preload value for 25 kHz and 48 MHz of cristal 65scillator TMR0L = 0x0F; // T0CONbits.T08BIT = 0; /****************************************************************************** * Function: void InitializePORTS(void) * * Input: Void * * Output: Nenhum * * Overview: Configura as portas como inputs(1) ou outputs(0) *****************************************************************************/ void InitializePORTS(void) TRISA = 0b00000001; // INPUT RA0 e RA1 TRISB = 0b00000000; TRISC = 0b00000000; TRISD = 0b00000000; TRISE = 0b00000000; /****************************************************************************** * Function: void ADConfigReg_AN1(void) *
66
* Input: Void * * Output: Nenhum * * Overview: Inicializa as definições ADC do canal 1 *****************************************************************************/ void ADConfigReg_AN1(void) ADCON0 = 0b00000001;// Analog Input RA0 ADCON1 = 0b00001110;// Vss=0; Vdd=5; AN0 como analog input ADCON2 = 0b10001110;//Justificação direita;2 TAD de tempo de aquisição;F0SC/64 /****************************************************************************** * Function: void ADConfigReg_AN2(void) * * Input: Void * * Output: Nenhum * * Overview: Inicializa as definições ADC do canal 2 *****************************************************************************/ void ADConfigReg_AN2(void) ADCON0 = 0b00000101;// Analog Input RA1 ADCON1 = 0b00001101;//Vss=0; Vdd=5; AN0 e AN1 como analog input ADCON2 = 0b10001110;//Justificação direita;2 TAD de tempo de aquisição;F0SC/64 /****************************************************************************** * Function: void WriteFIFO1(void) * * Input: Void * * Output: Nenhum * * Overview: Faz a conversão ADC e escreve o resultado na FIFO *****************************************************************************/ void WriteFIFO1(void) i=0; j=0; while(1) while(i<DIM) ADConfigReg_AN1();//Configurar canal 1 T0CONbits.TMR0ON = 1; //Turn timer0 on ADCON0bits.GO = 1; //Inicializa a conversão while(ADCON0bits.GO); //Aguarda o fim da conversão Buffer_1[i] = ADRESL;//Armazena os bits menos significativos do ADC na FIFO i=i+1; Buffer_1[i] = ADRESH;//Armazena os bits mais significativos do ADC na FIFO i=i+1; while(!INTCONbits.TMR0IF);//Espera até o Timer chegar ao fim INTCONbits.TMR0IF = 0;//Limpar a Flag de interrupão T0CONbits.TMR0ON = 0; //Turn timer0 off ADConfigReg_AN1(); T0CONbits.TMR0ON = 1; //Turn timer0 on ADCON0bits.GO = 1; //Inicializa a conversão while(ADCON0bits.GO); //Aguarda o fim da conversão Buffer_2[j] = ADRESL;//Armazena os bits menos significativos do ADC na FIFO j=j+1; Buffer_2[j] = ADRESH;//Armazena os bits mais significativos do ADC na FIFO j=j+1; while(!INTCONbits.TMR0IF);//Espera até o Timer chegar ao fim INTCONbits.TMR0IF = 0; //Clear interrupt flag T0CONbits.TMR0ON = 0; //Turn timer0 off sendUART(Buffer_1);//Enviar a FIFO com as amostras do 1º canal para o Buffer Delay10KTCYx(1000);//Pequeno delay para não haver enganos sendUART(Buffer_2);//Enviar a FIFO com as amostras do 2º canal para o Buffer i=0; j=0;
67
A2.2 Ficheiros .h
A.2.2.1 IO_CFG.h #ifndef IO_CFG_H #define IO_CFG_H /** I N C L U D E S *************************************************/ #include "C:\Users\CALVARIO\Desktop\Proj_Final\autofiles\initboard.h" /** T R I S *********************************************************/ #define INPUT_PIN 1 #define OUTPUT_PIN 0 #if defined(PIC18F4550_PICDEM_FS_USB) /** U S B ***********************************************************/ #define tris_usb_bus_sense TRISAbits.TRISA1 // Input #if defined(USE_USB_BUS_SENSE_IO) #define usb_bus_sense PORTAbits.RA1 #else #define usb_bus_sense 1 #endif #define tris_self_power TRISAbits.TRISA2 // Input #if defined(USE_SELF_POWER_SENSE_IO) #define self_power PORTAbits.RA2 #else #define self_power 1 #endif /** L E D ***********************************************************/ #define mInitAllLEDs() LATD &= 0xF0; TRISD &= 0xF0; #define mLED_1 LATDbits.LATD0 #define mLED_2 LATDbits.LATD1 #define mLED_3 LATDbits.LATD2 #define mLED_4 LATDbits.LATD3 #define mLED_1_On() mLED_1 = 1; #define mLED_2_On() mLED_2 = 1; #define mLED_3_On() mLED_3 = 1; #define mLED_4_On() mLED_4 = 1; #define mLED_1_Off() mLED_1 = 0; #define mLED_2_Off() mLED_2 = 0; #define mLED_3_Off() mLED_3 = 0; #define mLED_4_Off() mLED_4 = 0; #define mLED_1_Toggle() mLED_1 = !mLED_1; #define mLED_2_Toggle() mLED_2 = !mLED_2; #define mLED_3_Toggle() mLED_3 = !mLED_3; #define mLED_4_Toggle() mLED_4 = !mLED_4; /** S W I T C H *****************************************************/ #define mInitAllSwitches() TRISBbits.TRISB4=1;TRISBbits.TRISB5=1; #define mInitSwitch2() TRISBbits.TRISB4=1; #define mInitSwitch3() TRISBbits.TRISB5=1; #define sw2 PORTBbits.RB4 #define sw3 PORTBbits.RB5 /** P O T ***********************************************************/ #define mInitPOT() TRISAbits.TRISA0=1;ADCON0=0x01;ADCON2=0xBC; /** S P I : Chip Select Lines ***************************************/ #define tris_cs_temp_sensor TRISBbits.TRISB2 // Output #define cs_temp_sensor LATBbits.LATB2 #define tris_cs_sdmmc TRISBbits.TRISB3 // Output #define cs_sdmmc LATBbits.LATB3
68
/** S D M M C *******************************************************/ #define TRIS_CARD_DETECT TRISBbits.TRISB4 // Input #define CARD_DETECT PORTBbits.RB4 #define TRIS_WRITE_DETECT TRISAbits.TRISA4 // Input #define WRITE_DETECT PORTAbits.RA4 /********************************************************************/ /********************************************************************/ /********************************************************************/ #elif defined(PIC18F87J50_FS_USB_PIM) /** U S B ***********************************************************/ // Bus sense pin is RB5 on PIC18F87J50 FS USB Plug-In Module. // Must put jumper JP1 in R-U position to use bus sense feature. #define tris_usb_bus_sense TRISBbits.TRISB5 // Input #if defined(USE_USB_BUS_SENSE_IO) #define usb_bus_sense PORTBbits.RB5 #else #define usb_bus_sense 1 #endif #define self_power 0 /** L E D ***********************************************************/ #define mInitAllLEDs() LATE &= 0xFC; TRISE &= 0xFC; \ LATD &= 0x00; TRISD &= 0x00; // LATD LEDs are on // the HPC Explorer board #define mLED_1 LATEbits.LATE1 // Red RE1 LED on PIM board #define mLED_2 LATEbits.LATE0 // Red RE0 LED on PIM board #define mLED_3 LATDbits.LATD2 // Located on HPC Explorer board! #define mLED_4 LATDbits.LATD3 // Located on HPC Explorer board! #define mLED_1_On() mLED_1 = 1; #define mLED_2_On() mLED_2 = 1; #define mLED_3_On() mLED_3 = 1; #define mLED_4_On() mLED_4 = 1; #define mLED_1_Off() mLED_1 = 0; #define mLED_2_Off() mLED_2 = 0; #define mLED_3_Off() mLED_3 = 0; #define mLED_4_Off() mLED_4 = 0; #define mLED_1_Toggle() mLED_1 = !mLED_1; #define mLED_2_Toggle() mLED_2 = !mLED_2; #define mLED_3_Toggle() mLED_3 = !mLED_3; #define mLED_4_Toggle() mLED_4 = !mLED_4; /** S W I T C H *****************************************************/ #define mInitAllSwitches() TRISBbits.TRISB4=1; TRISBbits.TRISB0=1; #define mInitSwitch2() TRISBbits.TRISB4=1; // On PIC18F87J50 PIM #define mInitSwitch3() TRISBbits.TRISB0=1; // On HPC Explorer #define sw2 PORTBbits.RB4 // On PIC18F87J50 PIM #define sw3 PORTBbits.RB0 // On HPC Explorer /** P O T ***********************************************************/ #define mInitPOT() TRISAbits.TRISA0=1; \ WDTCONbits.ADSHR = 1; \ ANCON0bits.PCFG0 = 1; \ WDTCONbits.ADSHR = 0; \ ADCON0=0x01; \ ADCON1=0xBE; // POT on HPC Explorer /** I 2 C T E M P S E N S E *************************************/ #define mInitI2CPins() TRISC |= 0x18; // RC3 and RC4 are I2C /********************************************************************/ /********************************************************************/
69
/********************************************************************/ //Uncomment below if using the YOUR_BOARD hardware platform //#elif defined(YOUR_BOARD) //Add your hardware specific I/O pin mapping here #else #error Not a supported board (yet), add I/O pin mapping in __FILE__, line __LINE__ #endif #endif //IO_CFG_H
A.2.2.2 initboard.h #ifndef USBCFG_H #define USBCFG_H /** D E F I N I T I O N S *******************************************/ #define MAX_NUM_INT 1 // For tracking Alternate Setting #define EP0_BUFF_SIZE 8 // Valid Options: 8, 16, 32, or 64 bytes. // There is very little advantage in using // more than 8 bytes on EP0 IN/OUT, so 8 is the // recommended value. /* Parameter definitions are defined in usbdrv.h */ #define MODE_PP _PPBM0 #define UCFG_VAL _PUEN|_TRINT|_FS|MODE_PP /* Uncomment only the hardware platform that you are using*/ #define PIC18F4550_PICDEM_FS_USB //#define PIC18F87J50_FS_USB_PIM //#define YOUR_BOARD #if defined(PIC18F4550_PICDEM_FS_USB) #define USE_SELF_POWER_SENSE_IO #define USE_USB_BUS_SENSE_IO #elif defined(PIC18F87J50_FS_USB_PIM) //#define USE_USB_BUS_SENSE_IO //JP1 must be in R-U position to use this feature on this board /*If using the YOUR_BOARD selection, uncomment below section as appropriate for your hardware*/ //#elif defined(YOUR_BOARD) //#define USE_SELF_POWER_SENSE_IO //See MCHPFSUSB Firmware User's Guide //#define USE_USB_BUS_SENSE_IO //(DS51679) for more details about these features. #else #error Not a supported board (yet), See __FILE__, line __LINE__, or double click on this text. //See above commented section. You need to select the features your hardware will be using. #endif /** D E V I C E C L A S S U S A G E *******************************/ #define USB_USE_GEN /* * MUID = Microchip USB Class ID * Used to identify which of the USB classes owns the current * session of control transfer over EP0 */ #define MUID_NULL 0 #define MUID_USB9 1 /** E N D P O I N T S A L L O C A T I O N **************************/ /*
70
* See usbmmap.c for an explanation of how the endpoint allocation works */ /* PICDEM FS USB Demo (using generic usb class template) */ #define USBGEN_INTF_ID 0x00 #define USBGEN_UEP UEP1 #define USBGEN_BD_OUT ep1Bo #define USBGEN_BD_IN ep1Bi #define USBGEN_EP_SIZE 64 #define MAX_EP_NUMBER 2 // UEP2 #endif //USBCFG_H
Apêndice 3. Código para o Matlab
%Autor do código : João Miguel Sotomayor Calvário %Data : Setembro de 2010 %Local: Instituto Superior Técnico - Instituto das Telecomunicações ( IT ) %Professores Orientadores: Prof.Artur Lopes Ribeiro % Prof.Helena Geirinhas Ra mos clear all clc close all %//*-------------------Declaração de variáveis----- ---------------------*// kind=1; aux3=0; x=0; t0=0; f=1000; omega=2*pi*f; Num_Bytes = 120; NTotP = Num_Bytes/2; T=1/f; Samp_Rate=25000; delta=1/Samp_Rate; t=0:delta:2; dn=0.1*randn(size(t)); NPPP=Samp_Rate/f; NP = NTotP/NPPP; %//*-------------------Abertura da porta série----- ---------------------*// s = serial( 'COM4' ); fopen(s); set(s, 'Baudrate' ,19200, 'Databits' ,8, 'Parity' , 'none' , 'Stopbits' ,1, 'Flowcontrol' , 'none' ); set(s, 'Timeout' ,10); %//*-------------------Aquisição dos 2 canais------ --------------------*// while (x<2) Vdd=5; % Valor máximo n=10; % Numero de bits LSB = Vdd/(2^n-1); value2=zeros(Num_Bytes/2,1); flushinput(s); while ( s.BytesAvailable < Num_Bytes ) % Espera até o Buffer estar cheio pause(.1); end
71
value = fread(s,Num_Bytes); %Leitura dos valores do Buffer x=x+1; %% Passar para codigo binário if (value(1) > 3 || value(3) > 3 || value(5) > 3) binary_number=dec2bin(value); nbits=size(binary_number,2); result_biny=zeros(Num_Bytes/2,nbits*2); asci_code1=zeros(Num_Bytes,nbits); for i=1:Num_Bytes for j=1:nbits asci_code1(i,j)=unicode2native(bina ry_number(i,j)); end end %% Criar palavras de 10 bits, juntando as a mostras 2 a 2 j=1; position=1; result_num=zeros(Num_Bytes/2,nbits*2); while (j<=Num_Bytes) for i=1:nbits result_num(position,i)=asci_code1(j +1,i); end for k=1:nbits result_num(position,k+nbits)=asci_c ode1(j,k); end j=j+2; position=position+1; end value2=zeros(Num_Bytes/2,1); for j=1:Num_Bytes/2 for aux=0:2*nbits-1 if (result_num(j,end-aux)==48) result_biny(j,end-aux)=0; end if (result_num(j,end-aux)==49) result_biny(j,end-aux)=1; end end %% Calcular o valor decimal da amostra for aux=0:2*nbits-1 value2(j)=value2(j)+result_biny(j,e nd-aux)*LSB*2^aux; end end else Num_Bytes2=Num_Bytes-2; binary_number=dec2bin(value(2:end-1)); nbits=size(binary_number,2); result_biny=zeros(Num_Bytes2/2,nbits*2); asci_code1=zeros(Num_Bytes2,nbits); for i=1:Num_Bytes2 for j=1:nbits asci_code1(i,j)=unicode2native(bina ry_number(i,j)); end end %% Criar palavras de 10 bits, juntando as a mostras 2 a 2 j=1; position=1; result_num=zeros(Num_Bytes2/2,nbits*2); while (j<=Num_Bytes2) for i=1:nbits result_num(position,i)=asci_code1(j +1,i); end
72
for k=1:nbits result_num(position,k+nbits)=asci_c ode1(j,k); end j=j+2; position=position+1; end value2=zeros(Num_Bytes/2,1); for j=1:Num_Bytes2/2 for aux=0:2*nbits-1 if (result_num(j,end-aux)==48) result_biny(j,end-aux)=0; end if (result_num(j,end-aux)==49) result_biny(j,end-aux)=1; end end %% Calcular o valor decimal da amostra for aux=0:2*nbits-1 value2(j)=value2(j)+result_biny(j,e nd-aux)*LSB*2^aux; end end end aux3=aux3+Num_Bytes/2; [Ahat,Theta,RMS]=sinefit2(value2',omega,0,delta 2); Ahat_(kind)=Ahat; Theta_(kind)=Theta*180/pi; kind=kind+1; end p=1; for kk=0:0 res(p)=Theta_(p+kk)-Theta_(p+kk+1); p=p+1; end fclose(s) delete(s) clear s