• Nenhum resultado encontrado

3.4 API e programa de interface com o utilizador

3.4.2 Descri¸ c˜ ao do programa desenvolvido para interface com o utilizador

O c´odigo do programa desenvolvido para implementar a interface com o utilizador encontra-

se em anexo, no Apˆendice C.1. Grande parte deste c´odigo foi desenvolvido tendo como su-

porte de base uma pequena ferramenta de diagn´ostico da placa de desenvolvimento CESYS

USB3FPGA, fornecida pela CESYS.

No c´odigo do programa que desenvolvemos, come¸ca-se por definir uma classe com duas

fun¸c˜oes, Start() e Duration(), utilizadas para medir o tempo, e consequentemente medir a

taxa de transferˆencia de dados. Esta classe serve-se de duas fun¸c˜oes da API do Windows13, QueryPerformanceCounter() e QueryPerformanceFrequency(), que devolvem respectivamente o valor actual e a frequˆencia do contador de desempenho de alta resolu¸c˜ao. A fun¸c˜ao Start(), quando requisitada, guarda o valor do contador, e o tempo decorrido desde este in´ıcio da contagem, ´e devolvido sempre que se chama a fun¸c˜ao Duration().

A fun¸c˜ao C++ de n´ıvel superior, main() (esta denomina¸c˜ao ´e standard nesta linguagem de programa¸c˜ao), estabelece a ordem pela qual as v´arias fun¸c˜oes subsidi´arias s˜ao requisita- das. Na fun¸c˜ao main(), como j´a foi referido na sec¸c˜ao anterior, inicializa-se a API, atribui-se um apontador (*pDev) ao dispositivo com que se estabelece comunica¸c˜ao e procede-se `a sua abertura, utilizando para isso as fun¸c˜oes adequadas. Posteriormente ´e chamada a fun¸c˜ao Info- Test(), ´e carregado o ficheiro de implementa¸c˜ao do projecto da electr´onica digital de controlo, ´

e programada a FPGA e, por fim, s˜ao chamadas as fun¸c˜oes RegisterTest() e AsyncReadTest(). As fun¸c˜oes InfoTest(), RegisterTest() e AsyncReadTest() s˜ao descritas, com maior detalhe, mais adiante.

A fun¸c˜ao InfoTest() foi copiada na ´ıntegra do c´odigo do programa de diagn´ostico da placa de desenvolvimento. Recorrendo a fun¸c˜oes da classe ceUSB3::ceInfo por interm´edio do apontador devolvido pela fun¸c˜ao GetInfo(), aquela fun¸c˜ao permite imprimir toda a informa¸c˜ao sobre o dispositivo atribu´ıdo. A frac¸c˜ao de c´odigo referente a esta fun¸c˜ao ´e exposta em 3.1.

C´odigo 3.1: Trecho de c´odigo que imprime a informa¸c˜ao sobre o dispositivo. b o o l I n f o T e s t ( c e D e v i c e *pDev )

c o n s t c e I n f o * p I n f o = pDev−>G e t I n f o ( ) ; Log (” D e v i c e i n f o : ”) ;

Log (”−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−”) ; Log (” D e v i c e path : %s ”, p I n f o −>G e t D e v i c e P a t h ( ) ) ; Log (” D e v i c e name : %s ”, p I n f o −>GetDeviceName ( ) ) ; 13

Sistema operativo da Microsoft.

3.4 API e programa de interface com o utilizador

Log (” D r i v e r : %s ”, p I n f o −>G e t D r i v e r I n f o ( ) ) ; Log (” Firmware : %s ”, p I n f o −>G e t F i r m w a r e I n f o ( ) ) ;

Log (”USB path : %s ”, p I n f o −>GetUSBPath ( ) ) ;

Log (” Host c o n t r o l l e r : %s ”, p I n f o −>G e t H o s t C o n t r o l l e r ( ) ) ;

Log (” High s p e e d t r a n s f e r (USB 2 . 0 ) : %s ”, ( p I n f o −>I s H i g h S p e e d ( ) ?” y e s ”:” no ”) ) ; Log (” P i p e c o u n t : %i ”, p I n f o −>G e t P i p e C o u n t ( ) ) ; Log (” P i p e b u f f e r s i z e : %i Byte ”, p I n f o −>G e t P i p e B u f f e r S i z e ( ) ) ; Log (” L a s t f i r m w a r e e r r o r : 0 x%08x ”, pDev−>G e t L a s t F i r m w a r e E r r o r ( ) ) ; Log (”−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−”) ; Log (” ”) ; r e t u r n t r u e; } \ l a b e l { i n f o t e s t c o d e }

As fun¸c˜oes RegisterTest() e AsyncReadTest() foram criadas para permitir testar a comu- nica¸c˜ao e a transferˆencia de dados entre o PC e a FPGA. A fun¸c˜ao RegisterTest() permite

a leitura/escrita singular do registo da FPGA, carregando nele os parˆametros de funciona-

mento dos comparadores e dos pr´e-amplificadores da placa de front-end. Para isso, invoca

as fun¸c˜oes da API ReadRegister() e WriteRegister(), cujos cabe¸calhos s˜ao expostos no C´odigo 3.2.

C´odigo 3.2: Fun¸c˜oes WriteRegister() e ReadRegister(). v o i d c e D e v i c e : : W r i t e R e g i s t e r ( u s h o r t usReg , u s h o r t u s V a l u e ) u s h o r t c e D e v i c e : : R e a d R e g i s t e r ( u s h o r t u s R e g ) Parˆametros:

• usReg Endere¸co do registo.

• usValue Valor da palavra a escrever.

O valor da palavra devolvida pela fun¸c˜ao ReadRegister() ´e comparado com o parˆametro usValue, de modo a confirmar o sucesso da escrita no registo. Se estes valores n˜ao correspon- derem, ´e imprimida a informa¸c˜ao dando conta da ocorrˆencia de um erro no registo.

A fun¸c˜ao AsyncReadTest() permite aceder recursivamente `a mem´oria FIFO para efectuar a sua leitura, gravar num ficheiro os bytes transferidos e imprimir o valor m´edio da taxa de transferˆencia de dados. Para realizar a transferˆencia dos dados da mem´oria FIFO ´e chamada a fun¸c˜ao da API ReadBulk(). O cabe¸calho desta fun¸c˜ao encontra-se no C´odigo 3.3.

Cap´ıtulo 3. Controlo digital

C´odigo 3.3: Fun¸c˜ao ReadBulk(). b o o l c e D e v i c e : : R e a d B u l k ( u c h a r* pucData , u i n t u i S i z e , u i n t u i T r a n s f e r e d , c e A s i n c H a n d l e &AH, u i n t u i P i p e =−1, u i n t u i T i m e O u t=−1 ) Parˆametros:

• *pucData Contentor14 para onde s˜ao lidos os dados.

• uiSize Tamanho, em bytes, do contentor para onde s˜ao lidos os dados.

• uiTransfered N´umero de bytes j´a transferidos.

• AH “Handle”15 para controlo da transferˆencia ass´ıncrona.

• uiPipe “Pipe”16 usado para a transferˆencia.

• uiTimeOut Tempo de espera pelo fim da transferˆencia (este parˆametro ´e

utilizado apenas para transferˆencia s´ıncrona e vale infinito por defeito).

O parˆametro uiSize ´e o tamanho m´aximo de um pacote que pode ser recebido pela fun¸c˜ao

ReadBulk(). Este valor ´e devolvido pela fun¸c˜ao GetPipeBufferSize() da classe ceInfo. O

apontador pucData ´e suficientemente grande para cobrir este valor.

O parˆametro uiTransfered assume o valor devolvido pela fun¸c˜ao da API GetAsyncRe-

sult(&AH). Esta fun¸c˜ao utiliza o apontador &AH como “handle” de controlo da transferˆencia ass´ıncrona, para dar informa¸c˜ao sobre o n´umero de bytes transferidos ap´os completado o

pedido de acesso ass´ıncrono. Quando os parˆametros uiPipe e uiTimeOut valem -1, assumem

respectivamente um “pipe” por defeito e tempo de espera infinito.

De cada vez que a fun¸c˜ao ReadBulk() ´e chamada, devolve o sinal Booleano verdadeiro en-

quanto a sua requisi¸c˜ao estiver pendente. O “handle”eregistada, recorrendo periodicamente

`

a divis˜ao do n´umero total de bytes transferidos pelo tempo decorrido desde que a fun¸c˜ao AsyncReadTest() foi chamada.

14

Regi˜ao de mem´oria tempor´aria utilizada para escrita e leitura de dados.

15

Tipo particular de apontador ”inteligente”, utilizado para fazer referˆencia a blocos de mem´oria controlados por outro sistema.

16

Redireccionamento da sa´ıda de um programa para a entrada padr˜ao de outro.

3.5 Conclus˜ao

3.5

Conclus˜ao

Neste cap´ıtulo foi feita a apresenta¸c˜ao da electr´onica digital de controlo, implementada numa placa de desenvolvimento que inclui uma FPGA como componente principal e, ainda,

algumas mem´orias e um controlador USB como dispositivos subsidi´arios. Foi tamb´em des-

crito o programa que realiza a interface com o utilizador, assente numa API em C++ da

CESYS, e que permite a comunica¸c˜ao entre a FPGA e o computador hospedeiro.

Este sistema electr´onico digital verifica a validade dos eventos gerados nos PMTs, faz a gest˜ao dos sinais de controlo da electr´onica anal´ogica e ret´em os valores de integra¸c˜ao proveni-

entes dos ADCs. A validade dos eventos ´e determinada pela coincidencia temporal dos sinais

provenientes das vias r´apidas da electr´onica anal´ogica, sendo os eventos validados apenas se estes sinais apresentarem uma diferen¸ca temporal na chegada `a FPGA inferior a um per´ıodo do rel´ogio de controlo da electr´onica digital. Se o evento for v´alido, ´e iniciado o processo de convers˜ao em sequˆencia dos valores de integra¸c˜ao; aqui, por interm´edio de sistema de mul- tiplexagem, os sinais das vias lentas s˜ao direccionados para os ADCs, onde s˜ao convertidos,

e posteriormente para a FPGA, onde s˜ao armazenados. Se o evento for inv´alido, procede-

se `a re-inicializa¸c˜ao dos integradores. Os sinais armazenados s˜ao retidos numa mem´oria

FIFO para, posteriormente, serem lidos pelo computador hospedeiro. A comunica¸c˜ao para o

computador ´e feita via USB, assente portanto numa interface de comunica¸c˜ao gen´erica. O programa de interface com o utilizador permite interagir com a FPGA a partir do

computador hospedeiro, utilizando para isso uma API que gere o protocolo de comunica¸c˜ao

via USB. Por esta liga¸c˜ao ´e poss´ıvel escrever num registo da FPGA os parˆametros de con- figura¸c˜ao dos discriminadores e dos pr´e-amplificadores da electr´onica anal´ogica, bem como

Cap´ıtulo 4

Testes e Resultados

4.1

Placa prot´otipo para teste da electr´onica de front-end

Para testar fisicamente o comportamento da electr´onica anal´ogica de ”front-end”, antes

de se proceder ao fabrico da placa integral que a implementa para os 32 canais anal´ogicos

correspondentes aos dois detectores com as matrizes de 4×4 canais, foi fabricada uma pe-

quena placa de circuito impresso para servir como prot´otipo. Esta placa permite poupar nos

recursos, pode ser sujeita a pequenas modifica¸c˜oes e permite estudar altera¸c˜oes aos circuitos caso o sistema n˜ao se adeque aos requisitos de projecto impostos inicialmente.

Figura 4.1: Diagrama de blocos da placa prot´otipo para teste da electr´onica anal´ogica de ”front-end”.

A placa prot´otipo para teste, representada na Figura 4.1, tenta reproduzir, embora em

escala reduzida, a funcionalidade da placa final. Possui 4 canais lentos, ao inv´es dos 32

Cap´ıtulo 4. Testes e Resultados

Cada um dos 4 canais r´apidos partilha do mesmo andar de pr´e-amplifica¸c˜ao com um dos 4 canais lentos, sendo que cada par de canais (1 lento e 1 r´apido) ´e ligado ao mesmo terminal

de cada ˆanodo dos PMTs.

Embora possuindo apenas 4 canais, a placa prot´otipo permite que os dois PMTs se conec-

tem simultaneamente, contendo duas fichas Vertilon1pr´oprias para o efeito. Assim, ´e poss´ıvel fazer testes de coincidˆencia entre canais singulares de cada PMT. A selec¸c˜ao dos terminais

dos ˆanodos de cada PMT que se ligam aos canais da placa prot´otipo ´e feita manualmente

por ”jumpers”.

O facto de se ter concebido uma placa para testes com 4 vias r´apidas, quando apenas

s˜ao necess´arias duas (uma de cada detector) para detectar coincidˆencias, deixa em aberto a possibilidade de no futuro reutilizar a placa para outros fins. Por exemplo, ´e vi´avel a sua reutiliza¸c˜ao como sistema de integra¸c˜ao para um analisador multicanal. Ou, mesmo, para testar outras configura¸c˜oes de montagem do circuito como, por exemplo, utilizar multiplexa- gem discreta dos canais lentos por oposi¸c˜ao `a multiplexagem sequencial. Na multiplexagem discreta, a existˆencia de um canal r´apido por cada canal do PMT permite antever os canais activados, lendo-se apenas os valores da integra¸c˜ao associados a estes e descartando-se os restantes.

O andar de pr´e-amplifica¸c˜ao comum, conforme foi referido na sec¸c˜ao 2.2.2.1, ´e feito utili-

zando o AmpOp LM7171 em montagem n˜ao inversora. Este andar assume diferentes valores

de ganho consoante as condi¸c˜oes referidas na Sec¸c˜ao 2.2.2.3, apresentando os valores referidos na Tabela 2.2. Os andares de compara¸c˜ao e de integra¸c˜ao s˜ao feitos tamb´em utilizando as configura¸c˜oes referidas nas sec¸c˜oes 2.2.1.2 e 2.2.2.2, respectivamente. Os diferentes valores da tens˜ao de limiar do discriminador s˜ao obtidos nas condi¸c˜oes referidas na sec¸c˜ao 2.2.1.3, apresentando os valores mostrados na tabela 2.1.

A multiplexagem dos 4 canais da via lenta ´e feita utilizando o multiplexer OPA4872[24], um multiplexer 4:1 de elevada rapidez da Texas Instruments que possui um atraso entre a activa¸c˜ao e a desactiva¸c˜ao do sinal de sa´ıda e o sinal de selec¸c˜ao de, respectivamente, 6

ns e 25 ns. A convers˜ao anal´ogico-digital fica a cargo do ADC ADC1173 [33] da National

Semiconductor. Trata-se de um ADC com 8 bits que saem em paralelo, com uma taxa de amostragem de 15 MSPS.

1

Fichas especiais para a liga¸c˜ao dos cabos que provˆem de cada PMT.