Você está na página 1de 113

UNIVERSIDADE DE LISBOA

FACULDADE DE CIÊNCIAS
DEPARTAMENTO DE FÍSICA

Controlo Digital e Nova Electrónica para o Banco de Testes


para o Sistema de Alta Tensão dos Fotomultiplicadores do
Tilecal

Rui Miguel Fernandes Marques

Mestrado Integrado em Engenharia Fı́sica

Dissertação orientada por:


Guiomar Gaspar de Andrade Evans
Agostinho da Silva Gomes

Ano 2022
Agradecimentos

Primeiro quero agradecer à minha famı́lia por toda a ajuda que me deram nestes últimos 6 anos,
especialmente aos meus pais por estarem sempre presentes e prestarem todo o apoio que precisei, sem
eles não teria sido possı́vel. Aos meus irmãos por estarem sempre dispostos a apoiar-me e a ouvir-me.
Um grande agradecimento à Faculdade de Ciências da Universidade de Lisboa e a todos os docentes,
por todos estes anos de excelência. Agradecer aos meus orientadores, Guiomar Evans e Agostinho
Gomes, que estiveram sempre presentes no desenvolvimento deste trabalho e sem eles não teria sido
possı́vel.
Quero agradecer à minha namorada e a todos os meus amigos por estarem sempre lá quando foi
preciso, tanto para apoio laboral como moral. Houve muitos momentos difı́ceis que atravessámos todos
juntos, o que simplificou muito o processo, como também houve muitas experiências das quais levo para
a vida.

i
Resumo
O Grande Colisionador Hadrónico (LHC) vai sofrer uma atualização para aumentar a energia e a lu-
minosidade, tornando-se no LHC de alta luminosidade (HL-LHC). O número de colisões por unidade de
tempo irá aumentar, o que fará com que aumentem os nı́veis de radiação. O atual sistema de distribuição
de alta tensão do calorı́metro hadrónico TileCal da experiência ATLAS foi desenvolvido na década de 90
e produzido por volta de ano 2000, pelo que está envelhecido e uma grande parte dos seus componentes
estão obsoletos. Devido à contı́nua exposição a nı́veis de radiação muito elevados, o desempenho do
sistema atual irá ser afetado e não irá conseguir sobreviver com o desempenho adequado no HL-LHC,
logo é necessário a sua substituição. Foi proposto um novo sistema de distribuição remota de alta tensão
em resposta às questões anteriores. Este estará localizado numa caverna que se encontra a 100 m da
caverna da experiência ATLAS. Assim a eletrónica não se encontra exposta à radiação, o que facilita a
sua manutenção. O sistema remoto de distribuição de alta tensão é baseado num par de cartas, a carta HV
Remote que regula e monitoriza individualmente a alta tensão para 48 saı́das e a carta HV Supplies que
gera as HV primárias e fornece as baixas tensões necessárias ao funcionamento da HV Remote. Cada
saı́da de HV alimentará um tubo fotomultiplicador (PMT). O calorı́metro tem cerca de 10000 PMTs pelo
que o sistema terá 256 HV Remote mais 256 HV Supplies. É uma tarefa complicada testar e calibrar
manualmente as 48 saı́das de HV de tantas cartas, assim surgiu a necessidade de ter uma carta que efetua
automaticamente as tarefas de teste e calibração.
O presente trabalho consiste no desenvolvimento de uma carta que monitoriza automaticamente as
saı́das de alta tensão e as baixas tensões, denominada HV Test. A primeira versão já foi desenvolvida
por um colega de equipa, mas devido a problemas funcionais surgiu a necessidade de desenvolver um
segundo protótipo. Este foi desenvolvido para monitorizar 96 saı́das de alta tensão, ou seja, dois pa-
res de cartas HV Remote, e as 4 baixas tensões primárias fornecidas da crate. A crate é o invólucro
eletro-mecânico para 16 pares de cartas que se encontram ligadas a uma carta intermédia, que permite
a conexão adequada entre as cartas de HV Remote e HV Supplies e, que conecta estas a uma carta de
controlo digital baseada numa FPGA. A HV Test permite uma monitorização recorrendo a um ADC
e/ou uma monitorização externa recorrendo a um voltı́metro. Esta foi desenvolvida sobre o protocolo
de comunicação série sı́ncrono, denominado Serial Peripheral Interface (SPI). A interface gráfica do
utilizador para teste e comunicação com a HV Test encontrava-se inacabada pelo que se acabou esta,
desenvolveu-se o código de comunicação entre a interface e a carta, tanto para o 1º como para o 2º
protótipos, e as respetivas classes para o funcionamento e comunicação com os ADCs. O sistema digital
de controlo, baseado num system on chip, permite implementar o protocolo de comunicação SPI, o con-
trolo do teste e calibração das cartas e a comunicação com o sistema de controlo digital da experiência
ATLAS. A implementação de todo o sistema foi efetuada em Python numa carta de desenvolvimento
Raspberry pi 4. Para o sistema de HV do detetor utilizar-se-á Zybo Zinc. Por fim ainda se realizou um
conjunto de testes de estabilidade ao sistema de distribuição de HV no Módulo em teste com feixe de
partı́culas de alta energia no CERN.
Palavras Chave: PMTs, Tilecal, Teste de HV, Automatização de Medidas

ii
Abstract

The current TileCal hadronic calorimeter high voltage distribution system (HVDS) of the ATLAS
experience was developed in the 1990s. A large part of its components is already obsolete and since it
is expected to have performance degraded in the near future due to continuous exposure to very high
levels of radiation, it is necessary to update the HVDS. The new remote HVDS will be placed outside
of the detector, in a region that will not be affected by the radiation, that maximizes the reliability and
robustness of the system. The remote high voltage distribution system is based on a pair of boards,
the HV Remote board that individually regulates and monitors the high voltage for 48 outputs and the
HV Supplies board that generates the primary high voltages and supplies the low voltages necessary for
the HV Remote to work. Each output will supply a photomultiplier tube (PMT). It is a complicated
task to test the 48 high voltage outputs manually, so the need arose to have a board that automatically
monitors the outputs individually. Therefore, the present work consists of the development of a board
that automatically monitors the high voltage and low voltage outputs, that is called HV Test. This was
developed to monitor 96 high voltage outputs, which corresponds to two pairs of HV Remote cards, and
4 low voltages supplied by the crate. The crate is a bin that houses 16 pairs of cards that are connected to
an intermediate card, which connects them to the FPGA digital control card. The HV Test board allows
for internal monitoring using an ADC and/or external monitoring using a voltmeter. This was developed
on the synchronous serial communication protocol, called Serial Peripheral Interface (SPI). The user
interface for communication with the HV Test was developed, and the communication code between
the interface and the card was developed both for the 1st and the 2nd prototypes, and the respective
classes for operation and communication with the ADCs. To control the card, only a device based on
the system on chip system is needed, which allows implementing the SPI communication protocol and
communication with the ATLAS digital control system. In this work, the Raspberry Pi is used. Finally,
a set of stability tests was carried out HV distribution system in the Test Beam Module at CERN.

Palavras Chave: PMTs, Tilecal, HV Tests, Measurement Automation

iii
Índice

Lista de Figuras vi

Lista de Tabelas ix

Siglas xii

1 Introdução 1
1.1 Motivação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.2 Experiência ATLAS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.2.1 Calorı́metro Hadrónico TileCal . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.2.1.1 Geometria e Componentes Óticas . . . . . . . . . . . . . . . . . . . . 5
1.2.1.2 Atual Sistema de Distribuição de HV . . . . . . . . . . . . . . . . . . 6
1.2.1.3 Melhoramento do Sistema de Distribuição de Alta Tensão do TileCal . 6
1.3 Sistema Remoto de Distribuição das Altas Tensões . . . . . . . . . . . . . . . . . . . . 7
1.3.1 HV Supplies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
1.3.2 HV Remote . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
1.4 Carta HV Test . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13

2 Placa HV Test 15
2.1 Monitorização da Alta e Baixa Tensão . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
2.2 Protocolo de Comunicação SPI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
2.3 Controlo Digital da Placa de Monitorização, Calibração e Teste do Sistema de
Distribuição de HV (HV Test) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
2.4 Alimentação da HV Test . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
2.5 Funcionalidades da HV Test . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
2.5.1 Circuito de Carga/PMT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
2.5.2 Leituras de Tensão e Corrente . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
2.5.2.1 Leitura de Tensão . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
2.5.2.2 Leitura de Corrente . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
2.5.3 Teste dos Cabos Longos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
2.6 Desenho da Placa de Circuito Impresso . . . . . . . . . . . . . . . . . . . . . . . . . . 29

3 Interface Gráfica para o Utilizador e Comunicação com a Placa HV Test 33


3.1 Placa HV Test - Primeiro Protótipo . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
3.2 Interface Gráfica para o Utilizador . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
3.2.1 Primeiro Protótipo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
3.2.2 Melhoramento da Janela Principal da GUI . . . . . . . . . . . . . . . . . . . . . 41

iv
ÍNDICE

3.2.3 Baixas Tensões . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42


3.2.3.1 Atualização de Dados e Intervalo de Tempo Entre Medições . . . . . . 44
3.2.3.2 Gráfico e Estatı́stica . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
3.2.3.3 Guardar os Dados . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
3.3 Comunicação da Placa HV Test . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
3.3.1 Expansor Série-Paralelo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
3.3.2 ADCs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
3.3.3 Leitura das Tensões . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
3.3.4 Controlo Digital . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53

4 Desempenho nos Testes do Sistema Remoto de Distribuição das Altas Tensões no Módulo
do Teste com Feixe de partı́culas no CERN 57
4.1 Teste de Calibração e Testes de Carga no LIP . . . . . . . . . . . . . . . . . . . . . . . 58
4.2 Testes de Estabilidade nos Testes com Feixe no CERN . . . . . . . . . . . . . . . . . . 59

5 Conclusões e Trabalho Futuro 62

Appendices 65

A Esquemáticos da HV Test 65

B Código Implementado 79

v
Lista de Figuras

1.1 Cronologia das operações e melhoramentos futuros do Large Hadron Collider (LHC), [2]. 2
1.2 Corte do detetor A Toroidal Large Hadron Collider ApparatuS (ATLAS) e indicação dos
vários componentes, 1-detetor de muões, 2-magneto toroidal, 3-magneto solenoide, 4-
rastreador de transições de radiação, 5-rastreador de semicondutores, 6-detetor de pixeis,
7-calorı́metro de Árgon liquido, 8-calorı́metro Calorı́metro Hadrónico da Experiência
ATLAS (TileCal), [5]. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.3 Corte dos calorı́metros, com a indicação das partes que os constituem, [3]. . . . . . . . . 4
1.4 Estrutura do módulo com as respetivas componentes, o aço, o cintilador, uma Fibra de
Deslocamento de Comprimento de Onda (WLS) e o Foto Multiplicador (PMT), [3]. . . . 5
1.5 Localização dos super-drawers no TileCal e esquema das componentes do super-
drawers, [10]. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
1.6 Esquema geral do sistema remoto de distribuição de Alta Tensão (High Voltage) (HV),
[13]. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.7 Estrutura hierárquica do sistema de regulação de HV, [13]. . . . . . . . . . . . . . . . . 8
1.8 Configuração da Crate, composta por um par de placas e as respetivas saı́das. . . . . . . 8
1.9 Estrutura da carta intermédia da crate, midplane, a verde encontram-se os conetores dos
pares de placas, a laranja encontram-se os conetores das placas de controlo e a vermelho
as alimentações. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
1.10 Carta placa de Fornecimento das Alimentações Primárias à Placa HV Remote (HV Sup-
plies), [14]. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
1.11 Diagrama de blocos funcional da placa HV Supplies, [14]. . . . . . . . . . . . . . . . . 10
1.12 Carta Placa Remota de Regulação de HV (HV Remote), [13]. . . . . . . . . . . . . . . . 11
1.13 Diagrama de blocos dos sinais de comunicação Serial Peripheral Interface (SPI), [13] . . 12
1.14 Circuitos analógicos de controlo on/off de 4 canais. . . . . . . . . . . . . . . . . . . . . 12
1.15 Circuito analógico de regulação da HV. . . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.16 Circuito analógico de monitorização de HV, tensão de teste e sensores de temperatura. . 13

2.1 Esquema ilustrativo do princı́pio de funcionamento dos relés reed, [20]. . . . . . . . . . 16


2.2 Circuito de comutação para o relé. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
2.3 Representação da matriz de relés e as ligações às saı́das de uma HV Remote. . . . . . . 17
2.4 Circuito de condicionamento da Baixa Tensão (Low Voltage) (LV) negativa.
Converteram-se os -12 V em +3 V. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
2.5 Esquema do protocolo SPI, [23] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
2.6 Ilustração das várias fases de comunicação do protocolo SPI entre um Master e um Slave,
[24] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19

vi
LISTA DE FIGURAS

2.7 Possibilidades que o Sinal de Relógio (SCLK) pode assumir, relativamente à polaridade
e à fase do SCLK, [26] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
2.8 Diagrama do controlo digital, SPI. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
2.9 Esquemático associado a um dos expansores, com indicação dos sinais dos respetivos
portos de saı́das. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
2.10 Esquemático do Desmultiplexador (DMUX) de Controlo. (CDMUX), com os respetivos
sinais de entrada (entrada selecionada digitalmente (INP DMUX) e sinais de seleção S0
a S3 ) e saı́das. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
2.11 Esquemático de um dos seis DMUXs que efetuam a seleção dos relés de HV, com os
respetivos sinais de entrada e saı́da. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
2.12 Conetor que permite selecionar o sinal Master Input Slave Output (MISO) (saı́da do
Conversor Analógico Digital (ADC) ou do expansor). . . . . . . . . . . . . . . . . . . . 22
2.13 Esquemático do conversor DC/DC de 3,3 V, com os respetivos sinais de entrada e saı́da. . 23
2.14 Esquemático do conversor DC/DC de -3,3 V, com os respetivos sinais de entrada e saı́da. 23
2.15 Diagrama funcional da placa HV Test . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
2.16 Circuito de Carga/PMT, com as várias ligações possı́veis. . . . . . . . . . . . . . . . . . 25
2.17 Esquemático do ADC, com os respetivos sinais de entrada e saı́da, e a tensão de re-
ferência externa. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
2.18 Circuito de condicionamento da HV. Converteram-se os -1000 V em 2,39 V. . . . . . . . 26
2.19 Esquemático do Multiplexador (MUX) 2x1, e do conetor de verificação dos sinais de
tensão intermédios. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
2.20 Esquemático do circuito que permite efetuar leituras de corrente. . . . . . . . . . . . . . 27
2.21 Esquemático do modo de funcionamento da HV Cable, em ambiente de laboratório. . . . 28
2.22 Esquemático do modo de funcionamento da HV Cable, em ambiente CERN. . . . . . . . 28
2.23 Esquemático do conetor de alimentação da HV Cable. . . . . . . . . . . . . . . . . . . . 29
2.24 Vista 3D da camada superior da Placa de Circuito Impresso (PCB) da HV Test. . . . . . 30
2.25 Vista 3D da camada inferior da PCB da HV Test. . . . . . . . . . . . . . . . . . . . . . 30
2.26 Esquemático das várias camadas que compõem a HV Test. . . . . . . . . . . . . . . . . 31

3.1 Diagrama funcional da placa HV Test PT1. . . . . . . . . . . . . . . . . . . . . . . . . 34


3.2 Diagrama digital da placa HV Test PT1. . . . . . . . . . . . . . . . . . . . . . . . . . . 35
3.3 Código utilizado para a criação do texto e da barra de opções (a) e o resultado do código
implementado (b), [17]. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
3.4 Listagem de todos os objetos utilizados na janela principal da Interface Gráfica para o
Utilizador (GUI). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
3.5 Diagrama funcional da interface gráfica para o utilizador (GUI). . . . . . . . . . . . . . 37
3.6 Janela principal da GUI, [17]. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
3.7 Janela da função Start Full board reading (HV) [17]. . . . . . . . . . . . . . . . . . . . 38
3.8 Imagem dos botões e barra de escrita que aparecem quando o botão Stop é selecionado,
[17]. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
3.9 Janela da função Start Full board reading (HV) na opção Individual Channel Reading,
[17]. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
3.10 Janela inicial da função Individual Channels (HV), [17]. . . . . . . . . . . . . . . . . . 40
3.11 Janela da função Individual channels (HV) após selecionar-se um canal para efetuar a
monitorização, [17]. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41

vii
LISTA DE FIGURAS

3.12 Imagem dos botões e da barra de escrita que aparecem ao selecionar-se o botão Stop na
monitorização individual, [17]. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
3.13 Nova Janela principal da GUI. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
3.14 Recorte da GUI com a matriz de caixas de seleção correspondentes aos ADCs a escolher,
apenas válida para o 1º protótipo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
3.15 Função implementada após a seleção da opção Manual. . . . . . . . . . . . . . . . . . . 43
3.16 Janela inicial das LVs, com as 4 opções de LVs que se podem monitorizar. Também se
tem um botão para retroceder à janela principal da GUI. . . . . . . . . . . . . . . . . . . 43
3.17 Excerto do código implementado na janela principal das LVs, com o código associado a
cada botão. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
3.18 Janela das LVs após selecionado um botão das LVs, com as 4 opções de LVs que se po-
dem monitorizar, o gráfico das leituras efetuadas, as tabelas com a estatı́stica dos mesmos
e os botões de paragem e retrocesso à janela principal. . . . . . . . . . . . . . . . . . . 44
3.19 Excerto de código da função self.update plot data lv, com a seleção do protótipo da
placa, implementação da função de leitura, registo do valor medido e da contagem cor-
respondente, e seleção dos últimos 12 valores medidos para colocar na tabela da janela
principal das LVs. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
3.20 Excerto de código da função read values, com a implementação do gráfico. . . . . . . . 45
3.21 Excerto de código da função self.update plot data lv, com a estatı́stica dos dados. . . . 46
3.22 Recorte da janela das LVs, com demonstração dos botões de continuar, de voltar à janela
principal e a barra de escrita para escrever a pasta e o nome do ficheiro onde se quer
guardar os dados e o respetivo botão de guardar. . . . . . . . . . . . . . . . . . . . . . . 46
3.23 Código da função saave data lv, com a criação de um ficheiro e respetiva escrita. . . . . 47
3.24 Conetor de entrada dos sinais SPI na placa HV Test. . . . . . . . . . . . . . . . . . . . 47
3.25 Esquema dos portos de saı́da do Raspberry pi, com as diversas cores que correspondem
a um protocolo de comunicação, o protocolo SPI corresponde à cor rosa. . . . . . . . . 47
3.26 Código da inicialização dos expansores, com os respetivos objetos necessários e respetiva
configuração. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
3.27 Endereço dos registos SPI do expansor , [30]. . . . . . . . . . . . . . . . . . . . . . . . 49
3.28 Comunicação SPI entre o ADC MCP3201 e o RaspberryPi, Polaridade do Sinal de
Relógio (CPOL)=’0’ e Fase do Sinal de Relogio (CPHA)=’0’, [31]. . . . . . . . . . . . 51
3.29 Comunicação SPI entre o ADC TLV2541 e o RaspberryPi, CPOL=’0’ e CPHA=’1’, [32]. 52
3.30 Configuração das duas variáveis com o conteúdo a enviar aos expansores. A variável
GPIOW1 envia-se ao expansor 1 e a variável GPIOW2 envia-se ao expansor 2. . . . . . 55

4.1 Fotografia da carta de Interface. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57


4.2 Montagem experimental dos testes com feixe no European Organization for Nuclear
Research (CERN). Sobre a plataforma da mesa móvel estão 3 módulos do TileCal, sendo
os dois mais longos do barril central e o mais curto, que está em cima à direita, do barril
extendido. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
4.3 Valores de tensão obtidos pelo ADC do primeiro teste de 2h30. . . . . . . . . . . . . . 60
4.4 Desvio máximo entre medições para todas as 48 tensões de saı́da. . . . . . . . . . . . . 60
4.5 Desvio padrão das medições em função de todas as saı́das. . . . . . . . . . . . . . . . . 61
4.6 Desvio máximo entre medições para todas as 48 tensões de saı́da no segundo teste. . . . 61
4.7 Desvio padrão das medições para todas as 48 tensões de saı́da no segundo teste. . . . . . 61

viii
Lista de Tabelas

2.1 Sinais dos portos de saı́das do expansor de controlo. . . . . . . . . . . . . . . . . . . . 21

3.1 Sinais dos portos de saı́das dos expansores HV Test PT1. . . . . . . . . . . . . . . . . . 50


3.2 Correspondência dos valores da variável lv e os valores de tensão. . . . . . . . . . . . . 53
3.3 Correspondência das chaves do dicionário list adc e os ADCs, PT1. . . . . . . . . . . . 53

ix
x
Siglas

ADC Conversor Analógico Digital

ALICE A Large Ion Collider Experiment

ATLAS A Toroidal Large Hadron Collider ApparatuS

CDMUX DMUX de Controlo.

CEM Calorı́metro Eletro-Magnético

CERN European Organization for Nuclear Research

CH Calorı́metro Hadrónico

CMS Compact Muon Solenoid

CPHA Fase do Sinal de Relogio

CPOL Polaridade do Sinal de Relógio

CS Chip Select ou Slave Select

DAC Conversor Digital Analógico

DCS Sistema de Controlo Digital

DMUX Desmultiplexador

GPIO General Purpose Input/Output

GUI Interface Gráfica para o Utilizador

HL-LHC High Luminosity LHC

HV Alta Tensão (High Voltage)

HV Remote Placa Remota de Regulação de HV

HV Supplies placa de Fornecimento das Alimentações Primárias à Placa HV Remote

HV Test Placa de Monitorização, Calibração e Teste do Sistema de Distribuição de HV

HVS Sistema de Distribuição de Alta Tensão

LHC Large Hadron Collider

xi
Siglas

LHCb Large Hadron Collider beaty

LV Baixa Tensão (Low Voltage)

MISO Master Input Slave Output

MOSI Master Output Slave Input

MUX Multiplexador

PCB Placa de Circuito Impresso

PMT Foto Multiplicador

SCLK Sinal de Relógio

SMD Dispositivo de Montagem em Superfı́cie

SPI Serial Peripheral Interface

TileCal Calorı́metro Hadrónico da Experiência ATLAS

USA15 Sala de Elétrónica da Experiência ATLAS

WLS Fibra de Deslocamento de Comprimento de Onda

xii
xiii
Capı́tulo 1

Introdução

A Organização Europeia para a Pesquisa Nuclear (CERN) foi iniciada no ano de 1954 e tem como
objetivo o estudo da fı́sica de partı́culas. Neste momento esta organização tem cerca de 23 estados-
membros. A inauguração do Large Hadron Collider (LHC) que é o maior acelerador de partı́culas do
mundo, aconteceu em 2008. Este é composto por um túnel circular com 27 km, a 175 m abaixo do solo,
que se encontra situado na fronteira entre França e a Suı́ça. O LHC permitiu testar teorias sobre fı́sica de
partı́culas, descobrir novas partı́culas, por exemplo, o bosão de Higgs, e estudar colisões de hadrões. Isto
só foi possı́vel devido a ter-se atingido colisões de alta energia, na ordem dos 13 TeV e uma luminosidade
de 1034 cm−2 s−1 , [1].
Para a descoberta/teste de novas teorias, o LHC terá de ser melhorado para permitir uma lumino-
sidade ainda maior do que a atual, de cerca de 5 · 1034 cm−2 s−1 . Para isto é necessário que todos os
componentes do acelerador sejam melhorados e atualizados de modo que este cumpra com os novos
requisitos. Este trabalho é sobre monitorizar o sistema remoto de distribuição de alta tensão (HV) do
detetor hadrónico TileCal da experiência ATLAS, como também efetuar testes ao mesmo.

1.1 Motivação
Depois de uma fase em que o LHC funciona com colisões a uma energia até 13 TeV, a fase atual
tem a energia 13,6 TeV. Para se poder explorar melhor a fı́sica subatómica é necessário aumentar a
luminosidade do LHC, tornando-o no High Luminosity LHC (HL-LHC). O aumento de luminosidade
resultará de aumentar o número de colisões por cada cruzamento de pacotes de protões, de 60 para 200
colisões, e de diminuir também o intervalo de tempo entre colisões. Na Figura 1.1 mostra-se a cronologia
das operações e futuros melhoramentos. O aumento de luminosidade é um enorme desafio para o CERN,
pelo que foi necessário um estudo de vários anos para determinar quais as alterações/melhoramentos a
efetuar em toda a infraestrutura do LHC e deteções para atingir os objetivos pretendidos. Para efetuar as
alterações no LHC, que serão extremamente complexas, é necessário que este efetue uma longa paragem,
para os nı́veis de radiação baixarem para depois se substituı́rem componentes diversos e adicionar novas
funcionalidades e novos detetores em todas as áreas necessárias, [2].
Para a experiência ATLAS cumprir com os novos requisitos é necessário realizar um melhoramento
geral. Nesta experiência um dos detetores é o TileCal. Este mede a energia de hadrões e funciona
baseado em telhas cintilantes que respondem consoante a energia depositada pelas partı́culas. O sinal
luminoso emitido é captado por fibra-óticas deslocadoras de comprimento de onda que o transportaram
até aos tubos foto-multiplicadores (PMT). Estes para terem um bom desempenho terão de ter uma tensão
de alimentação tipicamente entre os -500 V e os -950 V. Com o aumento da luminosidade do detetor, é

1
necessário que o TileCal aumente a capacidade de aquisição de acontecimentos interessantes em tempo
real e que mantenha a robustez face ao aumento de radiação. Por outro lado, a eletrónica presente no
detetor encontra-se obsoleta, pelo que é necessário efetuar toda uma substituição das componentes ou
realizar um novo sistema que seja mais eficiente e que cumpra com os novos requisitos. Os nı́veis de
radiação vão aumentar ainda mais no HL-LHC, acelerando a degradação da eletrónica envolvida na
experiência que se encontra na respetiva caverna. É neste contexto que surge o novo sistema remoto de
distribuição de HV dos PMTs do TileCal e por ser remoto beneficia por não estar sujeito à radiação. No
final as HV são ajustadas recorrendo à resposta das células do detetor a uma fonte radioativa de Césio
137. O processo de ajuste das HV só é eficiente se existir um sistema de calibração das tensões aplicadas
aos PMTs, que é objeto desta dissertação.

Figura 1.1: Cronologia das operações e melhoramentos futuros do LHC, [2].

1.2 Experiência ATLAS


O LHC permite colisões entre feixes de protões (p) ou entre feixes de iões pesados (A). O número
tı́pico de protões é 1011 p por pacote. As colisões p-p ocorrem atualmente à energia de 13 GeV e uma
luminosidade até 1034 cm−2 s−1 . Das colisões surge um enorme número de partı́culas que viajam em
todas as direções possı́veis. Para as identificar é necessário medir propriedades, como, por exemplo, o
momento e a energia. Para que os detetores do LHC consigam detetar adequadamente as partı́culas, é
necessário que estes preencham os seguintes requisitos:

• Os detetores têm de ter uma eletrónica rápida e resistente à radiação;

• Os detetores têm de cobrir quase toda a área da colisão, ou seja, é necessário que a maioria das
partı́culas resultantes das colisões incidam nos detetores;

• Têm de ter uma boa resolução na leitura do momento das partı́culas com carga e boa eficiência na
reconstrução da trajetória das partı́culas;

• Existência de boa calorimetria eletromagnética para a identificação de eletrões e protões;

2
• Existência de boa identificação de muões e boa resolução do momento, em condições de fluxo
elevado;

• Existência de um nı́vel elevado de eficiência do seletor (trigger), ou seja, o detetor deve ser efici-
ente a escolher quais os eventos de interesse.

O LHC é composto por 7 experiências, localizadas em pontos de interesse. Sendo que as principais
são o ATLAS, Compact Muon Solenoid (CMS), A Large Ion Collider Experiment (ALICE) e Large
Hadron Collider beaty (LHCb). O ATLAS e o CMS dedicam-se principalmente ao estudo do bosão
de Higgs e a procura de nova fı́sica, enquanto o ALICE estuda o plasma de quarks e gluões e o LHCb
investiga o que aconteceu à antimatéria que aparenta estar em falta no universo tal como o observamos
atualmente, [3][4].

O detetor ATLAS é o maior detetor de partı́culas do mundo. As grandes dimensões de ATLAS permi-
tem observar o resultado das colisões a energias muito elevadas. O detetor tem o formato de um cilindro
com um diâmetro de 25 m e comprimento de 44 m, é simétrico em relação ao eixo axial, direção do
feixe, e o centro coincide com o ponto onde se dão as colisões. Na Figura 1.2 apresenta-se um corte do
detetor ATLAS e dos vários componentes que o constituem.

Figura 1.2: Corte do detetor ATLAS e indicação dos vários componentes, 1-detetor de muões, 2-magneto toroidal, 3-magneto
solenoide, 4-rastreador de transições de radiação, 5-rastreador de semicondutores, 6-detetor de pixeis, 7-calorı́metro de Árgon
liquido, 8-calorı́metro TileCal, [5].

O detetor pode subdividir-se em quatro blocos fundamentais, o detetor interno de traços (4,5,6), os
Calorı́metros (7,8), o espectrómetro de muões (1) e o sistema magnético (2,3). O detetor interno de
traços identifica e segue a trajetória das partı́culas carregadas. Os calorı́metros medem a energia das
partı́culas. O espectrómetro de muões adiciona medições para muões que sejam muito penetrantes. O
sistema magnético faz curvar as partı́culas carregadas no detetor interno de traços e no espectrómetro
de muões para se poder medir o respetivo momento, [3][5]. Este trabalho insere-se na eletrónica do
calorı́metro TileCal pelo que este será descrito com mais detalhe.

3
1.2.1 Calorı́metro Hadrónico TileCal
Os calorı́metros têm como objetivo a medição da energia das partı́culas, absorvendo-as no pro-
cesso. Existem dois calorı́metros na experiência ATLAS, o Calorı́metro Eletro-Magnético (CEM) e o
calorı́metro hadrónico TileCal. Ambos têm o mesmo principio de funcionamento que é a absorção de
energia das partı́culas e a sua deteção. O primeiro detetor é o CEM que deteta partı́culas que interagem
eletromagneticamente. As partı́culas que atravessam o CEM sem serem completamente absorvidas por
este são detetadas pela Calorı́metro Hadrónico (CH). Na figura 1.3 encontra-se o corte dos calorı́metros
com a indicação das várias secções que os constituem.

Figura 1.3: Corte dos calorı́metros, com a indicação das partes que os constituem, [3].

O calorı́metro eletromagnético deteta partı́culas carregadas e fotões. Tem uma precisão elevada na
deteção da quantidade de energia absorvida e no local especı́fico onde a energia foi depositada. Tem o
formato de um cilindro e está centrado com o feixe de partı́culas em torno do ponto de colisão, tem três
partes, uma concêntrica com o eixo e duas que são perpendiculares ao feixe, uma em cada extremidade.
É composto por árgon lı́quido, elétrodos e cobre que absorve grande parte da energia. O árgon é mantido
no estado lı́quido com o recurso a um crióstato.
O calorı́metro de hadrões TileCal está a seguir ao CEM e os hadrões depositam aı́ grande parte da
sua energia. Quando comparado com o CEM é menos preciso, tanto na medição de energia como na
posição de absorção. O material de absorção é o aço, que tem ensanduichados telhas (tile) cintiladoras,
que respondem de acordo com a energia que neles é depositada. Analogamente ao CEM este é composto
por três partes, uma secção longa, Tile barrel, concêntrica com o eixo, e duas secções, Tile extended
barrel, uma em cada extremidade, [3][5]. As telhas encontram-se perpendiculares em relação ao feixe,
[3][6]. Nas próximas secções entra-se em detalhe na geometria e componentes óticas do TileCal, no
sistema de alta tensão, antigo, e quais as propostas para o melhoramento deste.

4
1.2.1.1 Geometria e Componentes Óticas

O TileCal é composto por 3 cilindros posicionados ao longo do feixe de partı́culas (eixo z), com um
raio compreendido entre os 2,28 m e os 4,23 m. Entre os cilindros existe um espaço disponı́vel para
passar cablagem para os outros detetores. Cada cilindro é composto por 64 módulos, cada um cobrindo
um ângulo azimutal de 2π/64 = 0, 1. Cada módulo é dividido em células e cada uma é lida por um
par de PMTs. Assim o TileCal tem cerca de 5000 células e 10000 PMTs. A comunicação entre os
cintiladores e os PMTs é efetuada por fibras de deslocamento de comprimento de onda (WLS), que têm
a particularidade de converter o sinal luminoso coletado num sinal de comprimento de onda superior. A
cada cintilador são acoplados duas WLSs, uma de cada lado do módulo. Todas as WLSs provenientes
de uma célula são acopladas num tubo, que depois se posiciona em frente de um PMT. Na Figura 1.4
mostra-se uma descrição da estrutura do módulo com as respetivas componentes, a estrutura de aço, os
cintiladores, uma WLS e o PMT.

Figura 1.4: Estrutura do módulo com as respetivas componentes, o aço, o cintilador, uma WLS e o PMT, [3].

Os PMT e a eletrónica necessária ao seu bom desempenho encontram-se numa unidade mecânica
denominada super-drawers. O acesso a este sistema é possı́vel, mas apenas quando o ATLAS entra nos
perı́odos de paragem longos ou de fim de ano. A localização destes encontra-se ilustrada na Figura 1.5.
Os super-drawers são compostos por duas secções, uma com um sistema de distribuição de alta-tensão
(HV-board) e outra com a um sistema de leitura dos sinais provenientes do PMT (Mainboard). Para
um bom desempenho dos PMTs, é necessário um sistema de regulação de HV, [7] [8] [9]. Este tem de
cumprir certos requisitos, que serão analisados na secção seguinte.

5
Figura 1.5: Localização dos super-drawers no TileCal e esquema das componentes do super-drawers, [10].

1.2.1.2 Atual Sistema de Distribuição de HV

O Sistema de Distribuição de Alta Tensão (HVS) tem como função a monitorização e ajuste fino da
tensão aplicada a cada PMT. Desta forma este tem de cumprir os seguintes requisitos:

• Fornecer individualmente uma tensão especı́fica a cada PMT, entre os -500 V e os -950 V;

• A incerteza no valor de tensão tem de ser menor que 0,5 V;

• A sensibilidade a variações de temperatura tem de ser menor que 0,2 V/ºC e para valores de humi-
dade até 60%;

• Manter os requisitos a campos magnéticos de 0,1 T;

• Deve fornecer uma corrente até 350 µA a cada PMT;

• Quando necessário, desligar PMTs que estejam com problemas e a provocar ruı́do ou a afetar
PMTs vizinhos.

O sistema atual, em funcionamento na experiência ATLAS, está desenhado tendo por base fontes de
HV primária que se encontram numa sala de eletrónica localizada a 100 metros da caverna do detetor,
denominada USA15. O ajuste de tensão para cada PMT é efetuado individualmente no detetor numa
placa HVopto, que fornece a HV dedicada a 24 PMTs. Os valores variam entre -500 V até -900 V, com
um valor médio de cerca de -750 V. O sistema de controlo digital da carta permite desligar as 12 saı́das
de HV que se encontram à esquerda na carta ou as 12 que se encontram à direita. O sistema inclui 2
sensores de temperatura de modo a monitorizar a temperatura do super-drawer.

1.2.1.3 Melhoramento do Sistema de Distribuição de Alta Tensão do TileCal

O sistema de distribuição de HV do TileCal foi concebido há mais de vinte de anos, ou seja, a maior
parte da eletrónica encontra-se obsoleta. Este não conseguiria cumprir com os requisitos do HL-LHC e

6
deste modo projetaram-se duas opções para o melhoramento e atualização deste. A primeira opção con-
sistia num sistema local de ajuste de HV, tal como o atual, com as fontes primárias de HV localizadas
numa Sala de Elétrónica da Experiência ATLAS (USA15) a 100 m do detetor e as placas de distribuição
de HV encontram-se dentro do detetor TileCal. A grande vantagem desta opção é o número reduzido de
cabos de HV que fazem a ligação entre a sala USA15 e o detetor, mas, em contrapartida, a manutenção
torna-se mais complicada, pois para aceder ao sistema é necessário que o detetor entre em perı́odos de
encerramento prolongado. Por outro lado, a eletrónica que se encontra na caverna do detetor está sujeita
a elevados nı́veis de radiação, que vão aumentar com o HL-LHC. Assim, a escolha de componentes a
utilizar para mitigar a deterioração do sistema não é tarefa fácil visto que não existem muitos compo-
nentes disponı́veis no mercado para nı́veis tão elevados de radiação. A segunda opção, onde se insere
este trabalho, consiste num sistema de distribuição remoto de HV que esteja na USA15. Esta solução
requer a utilização de cabos, com 100 m de comprimento, que transfiram as HVs individuais da sala
USA15 para o detetor. As vantagens desta opção são a fácil manutenção da eletrónica e a minimização
de problemas provenientes do elevado nı́vel de radiação. As maiores dificuldades são o ruı́do, as perdas
e as capacidades parasitas dos longos cabos e a própria instalação dos cabos porque não existe muito
espaço no túnel que liga a USA15 ao detetor, [11][12].

1.3 Sistema Remoto de Distribuição das Altas Tensões


O sistema remoto de HV pretende assegurar uma tensão entre -500 V e -900 V com uma incerteza
máxima de 0,5 V a cada PMT. As HVs são reguladas a partir de placas especı́ficas, uma de fornecimento
das baixas tensões (LVs) e HVs primárias e outra de regulação, juntamente com as cartas de controlo
digital. Toda a eletrónica do sistema de distribuição das HVs estará na USA15. Irá ser necessário o uso
de cabos longos a ligar cada HV de saı́da das placas a cada PMT, o que exige cerca de 20000 fios. Na
Figura 1.6 encontra-se o esquema do sistema de regulação de HV.

Figura 1.6: Esquema geral do sistema remoto de distribuição de HV, [13].

Existem 256 pares de placas, um par é composto por uma HV Remote e por uma HV Supplies. A
HV Remote irá ter como saı́da a alta tensão necessária para 48 PMTs. Para cada 16 pares de placas
existirá uma placa de controlo e será essa que comunicará com o Sistema de Controlo Digital (DCS).
A ligação entre as placas da USA15 e os PMTs do detetor será efetuada por cabos, com cerca de 100 m
de comprimento. Cada cabo será composto por 48 pares de fios, sendo o par compostos pelo fio de HV

7
e pelo fio de retorno. No total serão necessários 256 cabos. Cada cabo irá ligar-se a um módulo onde
existam placas passivas que distribuı́ram a HV aos PMTs. Cada módulo contém até 48 PMTs.
A estrutura hierárquica do sistema é mostrada na Figura 1.7. Um conjunto de 16 pares de placas, HV
Remote e HV Supplies, são alojados numa crate e ligados entre si através do plano central (midplane)
da crate que distribui as baixas tensões primárias disponı́veis e que tem o barramento de controlo digital,
Figura 1.9. Como elemento de controlo é utilizada uma placa de desenvolvimento comercial de uma
FPGA (Zybo Z7-20 Zinq-7000 ARM/FPGA Development Board) da Xilinix, e, uma carta de interface
de ligação e multiplexagem de sinais digitais de controlo, a placa FPGA Bus. A placa FPGA comercial
irá comunicar com o Sistema de Controlo Digital (DCS) via Ethernet e efetuará a monitorização em
tempo real das HV fornecidas e do consumo das fontes de tensão primárias e enviará a informação
especı́fica para cada placa. No total irão existir 16 crates que contabilizam um total de 256 pares de
placas.

Figura 1.7: Estrutura hierárquica do sistema de regulação de HV, [13].

O esquema da Figura 1.8 mostra como se irá dispor cada par de placas. A HV Remote e a HV Sup-
plies estão conectadas entre si por uma placa intermédia denominada midplane, referida anteriormente.

Figura 1.8: Configuração da Crate, composta por um par de placas e as respetivas saı́das.

8
A placa midplane encontra-se esquematizada na Figura 1.9, onde os pares de placas ficam alinhados
nos retângulos verdes, a placa de controlo liga-se nos retângulos laranjas e a vermelho encontram-se as
alimentações. O desalinhamento dos conetores da carta FPGA Bus tem como finalidade evitar ligações
erradas das cartas na crate. A comunicação entre placas e os vários componentes destas será feita se-
guindo o protocolo Serial Peripheral Interface (SPI), que irá ser descrito em mais detalhe no subcapı́tulo
2.2. Cada crate tem 2 sistemas SPI independentes, um para as cartas HV Remote e outro para as HV
Supplies, o que permite o controlo e a comunicação em simultâneo para estes dois tipos de cartas.

Figura 1.9: Estrutura da carta intermédia da crate, midplane, a verde encontram-se os conetores dos pares de placas, a laranja
encontram-se os conetores das placas de controlo e a vermelho as alimentações.

1.3.1 HV Supplies
A placa HV Supplies tem de preencher os seguintes requisitos:

• A carta permite uma tensão de saı́da entre


os 0 V e -1000 V tendo como referência
uma tensão que varia entre 0 e 5 V, con-
trolada pelo sistema de controlo digital da
crate;

• Leitura da tensão e corrente das HVs


primárias;

• Leitura da tensão e corrente das LVs


primárias; Figura 1.10: Carta HV Supplies, [14].

• Monitorização da temperatura;

• Possibilidade de ligar e desligar por


controlo digital a placa HV Remote e
interrupção individual de cada uma das fon-
tes de alimentação primárias (HV e LV);

• Sistema que permite verificar se existe al-


gum impedimento externo e se a ligação en-
tra as HV Remotes e a respetiva HV Sup-

9
plies está efetuada (interlock). Em caso de
erro as HV são desligadas.

A placa HV Supplies fornece duas HVs e as LV à HV Remote. Para além das HVs primárias esta
carta necessita de 4 baixas tensões primárias, 24 V @ 1,2 A, +12 V @ 1 A, -12 V @ 2 A e 3,3 V
@ 1 A. A HV Supplies permite a regulação de duas saı́das de HV através de dois conversores DC/DC
independentes (C12446-12 da Hamatsu), alimentados com 24 V. A regulação destes é possı́vel com a
utilização de dois Conversor Digital Analógico (DAC), que têm como saı́da um sinal entre 0 V e 5 V.
Esta carta é controlada por um circuito integrado que dispõe de DACs e ADCs e que permite fazer o
controlo digital da carta por protocolo SPI para além da monitorização dos sinais de corrente e tensão. A
HV Supplies irá ter duas versões, onde a diferença entre elas é a posição dos conversores DC/DC. Como
exemplificado na Figura 1.11 existem quatros posições para os conversores, mas a placa irá trabalhar
apenas com duas posições ocupadas, colocando-se os conversores nas posições 1-A e 1-B numa versão,
e na outra nas posições 2-A e 2-B. Criaram-se estas duas versões para alternarem na crate de forma aos
conversores não estarem sobrepostos uns aos outros quando as placas estiverem conectadas na Crate. Na
Figura 1.11 encontra-se o diagrama funcional da placa HV Supplies.

Figura 1.11: Diagrama de blocos funcional da placa HV Supplies, [14].

Para além de fornecer as HVs e as LVs primárias, esta placa tem também a funcionalidade de leitura
do consumo de corrente e tensão para as HVs e LVs. Isto tudo apenas é possı́vel graças ao circuito
integrado AMC7836 que contém vários ADC e assim permite efetuar todas as leituras simultaneamente.
Foram colocados na carta dois sensores de temperatura (ADT7310), um perto dos conversores DC/DC
e outro numa área mais isolada. Em todas as entradas das LVs primárias, foram utilizados circuitos
limitadores de tensão e corrente (hot-swaps) que desligam a conexão das fontes de alimentação no caso

10
de a corrente subir acima dos limites predefinidos, permitindo proteger as cartas em questão e manter
o funcionamento correto das restantes cartas da crate. Os circuitos integrados LTC4241-1, TPS25944,
TPS25944 e TPS26600 correspondem aos hot-swaps dos -12 V, 12 V, 3,3 V e 24V, respetivamente. Existe
a opção de desligar a placa, por software ou por hardware, que irá desligar a HV na saı́da do conversor
DC/DC da carta HV Supplies, [14][15]. Este par de cartas dispõe ainda de um sistema de segurança
que desliga também as HV dos conversores DC/DC, caso as cartas não estejam conectadas, designado
por sistema de Interlock. Este sistema de segurança por hardware também impede o funcionamento das
cartas se houver impedimentos externos que cortem o respetivo sinal.

1.3.2 HV Remote
A placa HV Remote é a placa principal do sistema remoto de HV e tem os seguintes requisitos:

• Apresenta 48 saı́das de HV individualmente


reguladas (360 to 1000 V);

• Controlo remoto de on/off para um con-


junto de 4 saı́das de HV;

• Sistema manual de on/off para cada saı́da


de HV;

• Leitura individual de cada saı́da de HV;

• Uma tensão de teste (-1,2 V); Figura 1.12: Carta HV Remote, [13].

• Monitorização da temperatura (2 sensores


de temperatura);

• Um endereço hardware de 16-Bits;

• Sistema de interlock com a respetiva HV


Supplies.

Todas as tensões necessárias ao funcionamento adequado da placa HV Remote (HVs e LVs) são
fornecidas pela respetiva HV Supplies. Esta placa será a placa principal do sistema de distribuição de
HV do detetor TileCal. Esta irá receber os sinais de controlo a partir das placas de comando via protocolo
SPI. Na Figura 1.13 mostra-se o diagrama de blocos do sistema de controlo digital da HV Remote. Para
selecionar qual a placa a receber a informação utiliza-se um interruptor de 8 bits (SN74CB3Q3245),
ativado pelo sinal SPI CS CARD. São necessários dois expansores bidirecionais de 16 bits série-paralelo
(MCP23S17) para obter em paralelo todos os sinais de controlo digital necessários.
Foi adicionado um outro expansor para ler o endereço de hardware de 16 bits da carta. Este endereço
será criado com interruptores-dip e cada placa terá um endereço único que permitirá a sua identificação
em caso de necessidade. O expansor irá converter o endereço num sinal em série, que poderá ser lido
pelo DCS da experiência ATLAS.
Umas das funcionalidades da HV Remote é o controlo de on/off das saı́das de HV. O ideal seria
ter um interruptor controlado digitalmente para cada saı́da de HV, mas para minimizar o consumo de
corrente nos conversores DC/DC, apenas é possı́vel ter um interruptor para um grupo de 4 saı́das de HV.

11
Figura 1.13: Diagrama de blocos dos sinais de comunicação SPI, [13]

A separação entre os sinais de controlo LV e a interrupção da HV é feito através de um optocoupler


(MCT2). Na Figura 1.14 demonstra-se o circuito analógico de controlo on/off.

Figura 1.14: Circuitos analógicos de controlo on/off de 4 canais.

Existe ainda um interruptor individual de fio (jumper) para cada canal, que pode ser desligado na
carta, mas obriga a uma intervenção na mesma no caso de ser necessário. As 48 saı́das de HV têm
de ser reguladas individualmente. Para isso, em cada canal utiliza-se um Conversor Digital Analógico
(DAC) de 12 bits para converter o sinal digital associado à tensão HV desejada para um valor analógico
adequado. Para otimizar o desenho da placa escolheu-se um circuito integrado que contém 8 DACs
(DAC7568IAPWR). A saı́da do DAC corresponde ao sinal de entrada do circuito de regulação da Figura
1.15. Neste circuito o desacoplamento entre a baixa tensão e a alta tensão é também efetuada por um
optocoupler. Os dı́odos de zener (IN5386B), na Figura 1.15 limitam a HV de saı́da ao intervalo [HVin -
360 V, HVi n]. Espera-se que os PMTs funcionem normalmente entre os -950 V e os -500 V.
Para monitorizar as 48 saı́das de HV, a temperatura nos 2 sensores da placa e a tensão de teste
utilizaram-se multiplexadores analógicos e apenas um ADC de 12-Bit (MAX1240). Aplicou-se um
divisor de tensão às HVs antes da sua monitorização. A monitorização das HVs, sensores de temperatura
e sinal de teste, são lidas à vez. O ADC envia as leituras através do protocolo SPI. Na Figura 1.16
encontra-se o circuito analógico de monitorização das várias tensões.
O sistema de interlock é constituı́do por um sinal externo à crate, de 10 V com corrente tı́pica a
rondar 6 mA. Este sinal passa por 4 conetores da HV Supplies mais HV Remote. Se as respetivas
cartas não estiverem conectadas, este sinal é interrompido. Na carta HV Supplies existe um circuito que

12
Figura 1.15: Circuito analógico de regulação da HV.

Figura 1.16: Circuito analógico de monitorização de HV, tensão de teste e sensores de temperatura.

monitoriza a corrente neste sinal e que em caso de corrente nula desliga os conversores DC/DC nas HV
Supplies. Depois da ligação entre as cartas ser efetuada, o DCS irá reiniciar as placas, [13] [16]. A HV
Supplies encontra-se na fase final do projeto do segundo protótipo, enquanto a HV Remote encontra-se
na fase final do terceiro protótipo. Ambas tiveram de levar modificações estruturais entre protótipos para
responder a problemas detetados ou ao aparecimento de novos requisitos.

1.4 Carta HV Test


É necessário testar todas as HV Remotes para saber se estão operacionais e prontas para ir para a sala
USA15. Como efetuar testes manuais demora muito tempo, surgiu a necessidade de se criar um sistema
que efetue a medição de todas as saı́das de HV de cada HV Remote e as LVs necessárias ao funciona-
mento da crate. Este sistema será constituı́do por um conjunto de 8 cartas, uma para 2 pares de cartas. É
necessário ter interruptores de HV para a seleção de qual o canal a ler, e para isso existem duas opções,
utilizar optocoupler ou relés. A discussão sobre qual utilizar será realizada posteriormente. A placa terá
outra função que é distribuir uma tensão externa para um dos 96 canais à disposição. Esta funcionali-
dade será necessária para o teste dos cabos que ligam as saı́das de HV aos conetores de saı́da/entrada dos
PMTs que estão na caverna do detetor ATLAS.
Esta tese irá apresentar uma descrição mais detalhada da placa HV Test, da GUI que irá comunicar
com a placa e do código que efetua a comunicação entre ambos. A placa que irá ser discutida nesta tese

13
será a segunda versão. A primeira versão foi realizada numa dissertação de mestrado anterior, [17]. Esse
primeiro protótipo foi realizado para o teste de duas HV Remotes mas devido ao tipo de componentes
escolhido, levou a um custo e dimensões demasiado grandes. Assim, na segunda versão reduziram-se
componentes, simplificou-se o controlo digital e diminuı́ram-se as dimensões do PCB. Realizaram-se
testes funcionais nas placas HV Supplies e HV Remote, como também ao sistema remoto no módulo de
teste de feixe no CERN. Para além de testes funcionais e de estabilidade das cartas, um dos requisitos é
efetuar testes longos de estabilidade (pelo menos 1 semana) à crate em funcionamento e a temperaturas
elevadas (60 °C). Este, teste, é denominado teste Burn-in.

14
Capı́tulo 2

Placa HV Test

De modo a proceder ao teste funcional das HV Remote foi desenvolvida a placa HV Test. Esta foi
pensada para monitorizar as saı́das de duas cartas HV Remote, totalizando um conjunto de 96 canais de
HV. Para além destas também se irão monitorizar as LVs primárias. A placa terá de cumprir os seguintes
requisitos:

• Leitura da HV de 96 canais;

• 3 possibilidades de leitura da HV, com carga que simula um PMT, com um PMT ligado e sem
carga;

• Leituras das LVs primárias da crate;

• Duas opções de leitura (ADC ou Voltı́metro);

• Possibilidade de leitura de corrente;

• Distribuir HV externa para um canal especı́fico dos 96 disponı́veis na carta.

Neste capı́tulo discute-se qual o tipo de seletor a utilizar para escolher o canal a ler, analisa-se o
sistema de controlo SPI, a alimentação da carta e o diagrama funcional da placa. Apresentam-se as
várias funcionalidades da placa, que consistem nas opções do circuito de carga/PMT, as leituras de
tensão e corrente e o teste dos cabos de longos. Por fim, apresenta-se o desenho da placa de circuito
impresso.
Para controlar qual o sinal a ler é necessário ter na placa um circuito que permita selecionar digi-
talmente, qual a tensão que será monitorizada tendo em conta que será HV. Existem 2 alternativas no
mercado para o componente principal, estes são os relés e os optocouplers. Ambos tem a particularidade
de isolarem os sinais de controlo dos sinais a medir e existem para HV. Ambos os dispositivos, têm uma
boa resposta para baixas frequências e baixas correntes. Os relés são mais caros com dimensões maiores
que os optocouplers. Os relés tem uma resposta linear pois a tensão permanece intacta após a passagem
por este, enquanto que a resposta dos optocouplers pode não ser linear, ou seja, ao existir uma diferença
de tensão entre o coletor e o emissor ir-se-ia obter uma tensão um pouco diferente da original, como o
objetivo desta é realizar a monitorização da HV optou-se por ter o valor original de tensão após o seletor
digital assim optou-se pelos relés, [18] [19]. Por questões de otimização do PCB procurou-se um relé de
montagem em superfı́cie (SMD). Escolheu-se o relé reed (KT24-1A-40L-SMD), este necessita de 24 V
de tensão à entrada da bobina. Estes relés têm dois fios que estão próximos um do outro, mas não em
contacto. Estes 2 fios encontram-se numa cápsula de vidro e em volta desta encontra-se um fio enrolado

15
que irá produzir um campo magnético quando passar corrente por ele. Este campo magnético irá atrair
as duas pontas de fio uma à outra até estes ficarem em contacto. Desta forma separam-se os sinais de
controlo dos sinais principais que apenas transmitem quando ocorrer contacto. Na Figura 2.1 encontra-se
a exemplificação do relé reed.

Figura 2.1: Esquema ilustrativo do princı́pio de funcionamento dos relés reed, [20].

Na Figura 2.2 encontra-se o circuito que permite ligar o sinal de HV a uma saı́da comum (COM1).
A resistência R2 foi adicionada para garantir que se o sinal EN estiver desligado, a tensão na base do
transı́stor será 0 V, colocando-o em modo de corte, ou seja, a HV não está ligada ao sinal da COM1.

Figura 2.2: Circuito de comutação para o relé.

Definiu-se a resistência R2 para 100 kΩ, assim aquando o sinal EN estiver ativado a corrente que flui
em R2 é reduzida. Dimensionou-se o valor de R1 tendo em conta a corrente necessária à comutação do
relé, [21], e os parâmetros do transı́stor, [22].
Também será necessário utilizar na placa relés com saı́da dupla. Para isso escolheu-se o relé finder
(40.51.9.024.0000), também de HV. O circuito é igual ao anterior tirando que se adaptou R1 consoante
os parâmetros do relé, tendo nesse circuito de R1 o valor de 10 kΩ.

2.1 Monitorização da Alta e Baixa Tensão


Cada HV Remote tem 48 saı́das de HV. Para monitorizar 2 duas cartas são necessários 96 circuitos
de comutação, só para as HVs. Para minimizar o número de relés utilizou-se uma distribuição de relés

16
em matriz mantendo-se um terminal de leitura comum. Assim implementaram-se duas matrizes de relés
na placa, cada uma correspondente a uma HV Remote. Cada matriz terá um sinal comum por onde
passará a HV que irá ser lida. Na Figura 2.3 encontra-se o esquemático da matriz de relés 4x12, onde
apenas estão representados os circuitos de comutação.

Figura 2.3: Representação da matriz de relés e as ligações às saı́das de uma HV Remote.

Para conectar as saı́das das cartas HV Remote à HV Test utilizaram-se conetores DB25, que per-
mitem 25 conexões à placa. Analogamente à HV Remote ligaram-se 12 saı́das de HV a cada DB25,
correspondendo os pinos 1 a 12. O pino 13 é ligado ao shield e os restantes pinos, 14 ao 25, são ligados
à massa. Assim são necessários 4 conetores DB25 por cada HV Remote. No total a HV Test precisará
de 8 conetores. O shield será uma massa que virá do próprio detetor TileCal e que não irá ser necessário
monitorizar durante os testes das placas. Como visto previamente, apenas é necessário um sinal digi-
tal único para ativar cada um dos relés, logo será necessário multiplexagem para a matriz de relés. As
leituras serão realizadas individualmente, logo utilizaram-se 6 DMUXs 16:1 (CD74HC4067M) para se-
lecionarem o sinal digital de ativação dos relés. Estes 6 DMUX irão partilhar os sinais de controlo e cada
DMUX terá o seu sinal de ativação. Este controlo digital será detalhado na próxima secção 2.3.
Para efetuar as leituras de LV foi necessário adicionar mais 4 relés, um para cada baixa tensão.
Como existe uma LV negativa, -12 V, teve que se de inverter o sinal porque o ADC apenas efetua leituras
positivas. Devido à HV Test apenas ter 3,3 V e -3,3 V de alimentação, foi necessário aplicar um divisor
de tensão aos -12 V, e depois utilizou-se um amplificador de instrumentação (INA828ID) para inverter o
sinal. Na Figura 2.4 encontra-se o circuito de condicionamento dos -12 V.

Figura 2.4: Circuito de condicionamento da LV negativa. Converteram-se os -12 V em +3 V.

17
Para ligar as LVs à HV Test utilizou-se um conetor de 26 pinos, distribuindo as correntes por vários
pinos conectando cada LV a 6 pinos. Os -12V correspondem aos pinos 1 a 6, as outras três LV correspon-
dem aos pinos 7 a 24 e os pinos 25 e 26 correspondem à massa. A seleção da tensão a ser monitorizada
é efetuada por um sistema de controlo digital análogo ao da leitura da HV.

2.2 Protocolo de Comunicação SPI


O SPI é um protocolo de comunicação série sı́ncrona, que tem uma comunicação bidirecional total,
ou seja, pode enviar e receber dados em simultâneo. A arquitetura do sistema é baseada num dispositivo
de controlo Master e num ou vários dispositivos controlados, Slaves. Este é composto por 4 sinais,
MOSI, sinal de saı́da do controlador (master) e de entrada do dispositivo controlado (slave), MISO,
sinal de entrada do controlador (master) e de saida do dispositivo controlado (slave), SCLK, sinal de
relógio, e Chip Select ou Slave Select (CS), sinal de ativação. O Master é responsável por enviar o
SCLK, e ativar o CS do Slave com o qual quer comunicar. A transmissão de dados será feita pelas outras
duas linhas. Cada Slave terá um CS especı́fico e as outras três linhas serão partilhadas por todos os
Slaves. Cada comunicação começa com a ativação de um CS, ativo em ’0’. Na Figura 2.5 encontra-se
o esquema do potocolo SPI, com uma exemplificação de uma estrutura com um Master e três Slaves.
Este protocolo é muito útil devido ao reduzido número de sinais necessários a ter uma comunicação
bidirecional simultânea e uma taxa elevada de comunicações bem sucedidas.

Figura 2.5: Esquema do protocolo SPI, [23]

Uma das vantagens deste protocolo é que todos os dispositivos estão sempre sincronizados, porque
o SCLK é o mesmo para todos. Na Figura 2.6 ilustra-se a comunicação entre um Master e um Slave.
Verifica-se que se pode dividir o processo em 4 fases. A primeira é quando se ativa o CS, a segunda é
o Master enviar o SCLK e a informação que quer para o Slave, a terceira é o Slave enviar a informação
para o Master e quando a informação já tiver sido toda trocada, desativar o CS. Cada bit é enviado no
flanco ascendente do SCLK. A informação é enviada byte a byte.
O Master irá definir os parâmetros polaridade, CPOL, e a fase, CPHA. Cada dispositivo tem a sua
especificação de funcionamento, logo é preciso ter em atenção estes parâmetros. A polaridade do SCLK
é o nı́vel em que este se encontra quando não está ativado. Quando o CPOL=1 o SCLK encontra-se
desativado no ’1’ digital e o primeiro impulso será descendente, quando o CPOL=0 o SCLK encontra-se
desativado no ’0’ digital e o primeiro impulso será ascendente. Quando a CPHA=0 os dados são enviados
na primeira transição, quer seja ela ascendente ou descendente. Quando a CPHA=1 os dados são envia-
dos na segunda transição, quer seja ela ascendente ou descendente, [24][25]. Neste trabalho utilizou-se a

18
Figura 2.6: Ilustração das várias fases de comunicação do protocolo SPI entre um Master e um Slave, [24]

CPOL = 0 e a CPHA = 0, para certos componentes especı́ficos utilizou-se outra configuração. Na Figura
2.7 encontram-se as 4 possibilidades que a transmissão de dados pode assumir.

Figura 2.7: Possibilidades que o SCLK pode assumir, relativamente à polaridade e à fase do SCLK, [26]

2.3 Controlo Digital da HV Test


A carta HV Test foi desenhada para ter um controlador (Master), um system on chip que permite
implementar o protocolo de comunicação com o DCS, que neste caso será um Raspberry pi 4. Este
controlará todos os sinais SPI de entrada e saı́da na placa. Uma descrição sobre este sistema e o código
implementado será fornecida mais adiante. Na Figura 2.8 encontra-se o diagrama de controlo digital,
com a esquematização dos sinais do protocolo SPI e demonstrando uma hierarquia entre o master e os
vários slaves e a sua distribuição por todos os componentes envolvidos no processo de monitorização.
Tal como já foi referido, foi utilizado um expansor série-paralelo de 16-bit (MCP23S17) que tem
como principal função converter o sinal Master Output Slave Input (MOSI) em 16 saı́das diferenciadas.
Este dispositivo tem várias funcionalidades, mas nem todas serão necessárias para o controlo da placa.
Existem 16 portos dedicados para entrada ou saı́da de sinais. Estes são denominados por General Pur-
pose Input/Output (GPIO) e são divididos em dois grupos de oito, GPA e GPB. Na Figura 2.9 encontra-se

19
Figura 2.8: Diagrama do controlo digital, SPI.

o esquemático de um circuito desenhado em torno de um expansor (MCP23S17). O expansor necessita


de uma alimentação de 3,3 V. Adaptou-se o circuito de modo a poder inicializá-lo manualmente, quando
se conectar as saı́das do conetor Header 2 este efetuará o reset do dispositivo. Os pinos 19 e 20 estão
desconectados, pois a função deles não é necessária ao controlo do dispositivo. Os pinos 15 a 17 são o
endereço por hardware do expansor: ligou-se o A0 a 3,3 V e o A1 e A2 a 0 V. Os endereços de hard-
ware permitem selecionar, em software, entre vários expansores que partilhem o mesmo CS, permitindo
a utilização de 8 expansores ligados às mesmas linhas de controlo e com o mesmo sinal de ativação. Por
fim ligaram-se os sinais do protocolo SPI. Em princı́pio não serão efetuadas leituras com o expansor, por
isso não se conectou diretamente o MISO do expansor ao MISO do Raspberry pi. Mais a frente, nesta
secção, será explicada como será realizada esta conexão.

Figura 2.9: Esquemático associado a um dos expansores, com indicação dos sinais dos respetivos portos de saı́das.

O expansor da Figura 2.9 tem como saı́da 16 sinais de controlo digital para a placa HV Test. Este

20
controla o DMUX de controlo (CDMUX), os 6 DMUXs que selecionam qual o relé de HV a ativar, o
ADC, os seis relés e o MUX de controlo, na tabela 2.1 encontra-se uma descrição dos sinais dos portos
de saı́da. Os pinos de saı́da 21 a 24 do expansor correspondem aos sinais de referência que codificam
as saı́das dos DMUXs de HV. Estes sinais são partilhados por todos os 6 DMUXs. Os pinos 25 a
28 correspondem aos sinais de referência que codificam o CDMUX. O pino 1 corresponde ao sinal de
entrada do CDMUX e o pino 2 corresponde ao sinal de ativação do CDMUX. O pino 3 corresponde
ao sinal de ativação do ADC. Os pinos 4 e 5 correspondem aos sinais de ativação de dois relés, que
permitem selecionar entre os canais comuns de cada matriz. O pino 6 corresponde ao sinal de ativação
de dois relés e um MUX, utilizou-se este sinal para selecionar uma das linhas, HV e LV. Sendo apenas
um sinal que controla vários interruptores, garantindo que apenas um está conectado, acrescentando-se
segurança ao sistema. O pino 7 corresponde ao sinal de ativação do relé que permite efetuar leituras
com o voltı́metro. O pino 8 corresponde ao sinal de ativação que permite ativar o relé, que distribui a
HV externa para um pino especifico dos conetores dB25 que serve para o teste dos cabos de alta tensão
(outra aplicação desta carta) que passa a utilizar os conetores como saı́das.

Expansor Endereço de hardware: 001


Nº do Pino Nome do pino Nome da linha Descrição
21 GPA0 DMUX A0 Sinal de referência dos DMUX de HV A0
22 GPA1 DMUX A1 Sinal de referênciaos DMUX de HV A1
23 GPA2 DMUX A2 Sinal de referência dos DMUX de HV A2
24 GPA3 DMUX A3 Sinal de referência dos DMUX de HV A3
25 GPA4 CDMUX A0 Sinal de referência dos CDMUX A0
26 GPA5 CDMUX A1 Sinal de referência dos CDMUX A1
27 GPA6 CDMUX A2 Sinal de referência dos CDMUX A2
28 GPA7 CDMUX A3 Sinal de referência dos CDMUX A3
1 GPB0 INP CDMUX Sinal de referência do CDMUX
2 GPB1 EN CDMUX Sinal de ativação do CDMUX
3 GPB2 EN ADC Sinal de ativação do ADC
4 GPB3 HVR COM1 Sinal de ativação do relé de segurança nº1
5 GPB4 HVR COM2 Sinal de ativação do relé de segurança nº2
6 GPB5 Switch HVLV Sinal de ativação do relé de dois relés e do MUX
7 GPB6 Switch Volt Sinal de ativação do relé do voltı́metro
8 GPB7 Switch HVIN Sinal de ativação do relé HV IN

Tabela 2.1: Sinais dos portos de saı́das do expansor de controlo.

Como as leituras são realizadas sequencialmente, ou seja, apenas se efetua uma leitura de cada vez,
apenas é preciso selecionar uma saı́da dos 6 DMUXs de HV ou um dos relés das LVs. Assim os sinais de
ativação, CS, destes serão os sinais de saı́da de um desmultiplexador, CDMUX. Na Figura 2.10 encontra-
se o esquemático do CDMUX. Os DMUXs de 16:1 utilizados necessitam de 4 sinais de referência, S0
a S3, que selecionam qual das saı́das irá conectar com o sinal de entrada, pino 1. O sinal de entrada no
CDMUX é controlado pelo expansor porque os relés das LVs são ativados a ’1’ enquanto os DMUXs
são ativados a ’0’. O sinal de entrada dos 6 DMUXs são sempre 3,3 V porque todos os relés de HV
necessitam desse valor para os circuitos de comutação, de modo a conectar a HV a ler com o sinal
comum. Todos os DMUXs são ativados quando o sinal de ativação, EN CDMUX, é colocado a ’0’. Na
Figura 2.11 encontra-se o esquemático de um dos 6 DMUX de HV.

21
Figura 2.10: Esquemático do CDMUX, com os respetivos sinais de entrada (entrada selecionada digitalmente (INP DMUX) e
sinais de seleção S0 a S3 ) e saı́das.

Figura 2.11: Esquemático de um dos seis DMUXs que efetuam a seleção dos relés de HV, com os respetivos sinais de entrada
e saı́da.

Os únicos dois componentes que enviam informação para o sistema de controlo são o expansor e o
ADC. O expansor permite converter o sinal de 16 bits série em 16 sinais de 1 bit utilizados no controlo
digital da carta e o ADC efetua a conversão dos valores de tensão. O ADC é de 12 bits e será detalhado
na secção 2.5.2. O sistema de controlo apenas necessita de receber informação do ADC, mas para testes
pode vir a ser necessário ler o conteúdo registado nos portos de saı́da do expansor. Logo colocou-se um
conetor 2x2 onde se ligou a saı́da do ADC e o sinal MISO do protocolo série do expansor e sinal MISO
da carta. No modo de funcionamento normal conecta-se o pino do ADC ao pino do sinal MISO. Caso
seja necessário ler o conteúdo do expansor pode-se conectar o pino do expansor ao pino do sinal MISO.
Na Figura 2.12 encontra-se o esquemático do conetor referido.

Figura 2.12: Conetor que permite selecionar o sinal MISO (saı́da do ADC ou do expansor).

Analogamente ao circuito utilizado nos relés, Figura 2.2, todos os sinais de ativação, por questões de
segurança, têm por omissão o valor ’1’ ou ’0’ consoante o caso (circuito de push-pull ou push-down), ou
seja, uma resistência ligada a 3,3 V ou à massa. Por exemplo, todos os DMUXs são ativados a ’0’, logo

22
terão por omissão o valor ’1’ no sinal de ativação. Teve-se em atenção o valor de resistência utilizado
neste circuito para não aumentar muito o consumo da placa.

2.4 Alimentação da HV Test


A placa para funcionar adequadamente necessita de 3 fontes de alimentação, (24 V @2A, 3,3 V
@1A e -3,3V @300mA). Os 24V são para alimentar os circuitos dos relés. Todos os componentes de
controlo, MUXs, DMUXs, ADC e expansor são alimentados com 3,3 V. Por fim, todos os amplificadores
de instrumentação (INA828ID) são alimentados com ±3,3 V. De modo a reduzir o número de fontes
externas à placa, apenas se utilizou, uma fonte externa de 24 V, que fornece até 2 A de corrente. A
ligação à placa é realizada através de um conector de 8 pinos, utilizou-se este para dividir a corrente que
passa por cada pino. Os primeiros 6 conectam os 24 V e os últimos 2 conectam a GND. Para os ±3,3 V
utilizaram-se dois conversores DC/DC. Para o caso dos 3,3 V utilizou-se o conversor MEZD71201A-F,
que fornece até 1 A de corrente. Na Figura 2.13 encontra-se o circuito implementado para o conversor
de 3,3 V. O circuito implementado é bastante simples, apenas contem 3 pinos, o Vin onde se ligam os 24
V, o Vout onde está disponı́veis os 3,3 V e a GND.

Figura 2.13: Esquemático do conversor DC/DC de 3,3 V, Figura 2.14: Esquemático do conversor DC/DC de -3,3
com os respetivos sinais de entrada e saı́da. V, com os respetivos sinais de entrada e saı́da.

Para o caso dos -3,3 V como este não necessita de correntes muito elevadas devido a apenas fornecer
alimentação a 3 amplificadores de instrumentação, utilizou-se o conversor MAXM15465EVKIT, que
fornece até 300 mA de corrente. Este conversor gera uma tensão fixa de saı́da de 3,3V. Logo, se a massa
da placa estiver ligada ao pino de saı́da do conversor, então o pino de GND do conversor terá -3,3 V.
Assim obtém-se um conversor que fornece os -3,3 V necessários para as alimentações referidas.

2.5 Funcionalidades da HV Test


Para compreender melhor todas as funcionalidades da placa efetuou-se um diagrama de blocos, Fi-
gura 2.15. Como dito anteriormente, cada matriz de 48 entradas (matrizes de relés) irá ligar-se a um sinal
comum, obtendo-se assim COM1 e COM2. Por questões de segurança, apenas se ativa o relé da HV Re-
mote que se quer ler e nunca se juntam duas HVs provenientes de HV Remote diferentes. A segurança
é reforçada por software, que assegura que após uma leitura desconecta todos os relés e verifica-se que
a saı́da tem o valor 0 V antes de iniciar a leitura seguinte. Após a seleção do sinal COM1 e COM2
encontra-se um outro relé, o Relé Finder HV IN, que apenas irá ser usado para o teste dos cabos e não
para o teste da crate. Este teste dos cabos utiliza a carta HV Test para distribuir uma HV externa para
uma das 96 saı́das disponı́veis. O sinal selecionado será denominado COM HV. Este sinal encontra-se
ligado ao circuito de carga do PMT. Este permite 3 modos de leitura, uma com um PMT ligado, outra
com uma carga que simula um PMT e outra que o coloca em circuito aberto, Figura 2.16.

23
Figura 2.15: Diagrama funcional da placa HV Test

No caso das LVs cada uma está conectada a um relé especı́fico, onde a LV negativa terá um divisor de
tensão e um inversor antes do relé. Os 4 relés de LV ligam-se a um sinal comum denominado COM LV.
Em cada sinal comum (COM HV e COM LV) colocou-se um ponto de leitura de corrente, CORR. Para
conseguir-se efetuar leituras com o voltı́metro, quer de HV quer de LV, selecionam-se um dos dois
sinais comuns de HV e LV, através do relé Finder HVLV. Como nem sempre se quer fazer leituras com
o voltı́metro, colocou-se o relé Finder Volt para ativá-lo quando desejado. Para efetuar leituras com
o ADC tiveram de se inverter e reduzir os sinais porque o ADC apenas lê sinais positivos e o valor
da sua referência externa é 2,5 V. Então utilizou-se o relé Finder ADC para efetuar a seleção. Assim
aplicou-se a cada sinal um circuito que irá dimensionar as tensões para os valores desejados. Após o
dimensionamento, utilizou-se um MUX 2x1 para selecionar o sinal a medir pelo ADC. Por fim utilizou-
se um MUX analógico, ao invés de um relé, devido à HV e LV estarem numa escala adequada e este
permitir tensões de entrada até 3,3 V. Por questões de segurança utilizou-se o mesmo sinal de ativação
para todos os relés que selecionam os caminhos de HV e LV e que é denominado Switch HVLV. Desta
forma nunca se irá ter HV sobreposta com LV ou vice-versa. O texto a vermelho por baixo dos relés
corresponde ao nome do sinal de ativação de cada relé.

2.5.1 Circuito de Carga/PMT


As saı́das de HV da HV Remote terão um comportamento diferente se estiverem em circuito aberto,
se estiverem com carga passiva, ativa, ou se estiverem a alimentar um PMT. De modo a poderem testar-se
estas 3 possibilidades colocou-se um conetor na HV Test que permite efetuar essa seleção manualmente.
A alta tensão é aplicada aos PMTs do detetor através de placas divisoras da HV. A HV de entrada
é dividida ao longo da cadeia de dı́odos do PMT para aplicar os campos elétricos adequados entre cada
par de dı́odos. As placas dos divisores de tensão localizam-se na parte traseira dos PMTs e incluem
também um filtro RC para a HV e os conetores para a extração do sinal do PMT. No sistema antigo

24
os divisores são constituı́dos apenas por resistências e condensadores (divisores passivos). De modo a
cumprir com os novos os requisitos do HL-LHC, o desenho do circuito foi alterado, adicionando-lhe
transı́stores (divisores ativos). Com o novo protótipo atingiram-se os novos requisitos, logo deve-se
testar a HV Remote ligada a este novo circuito de divisores, para verificar se os requisitos para o sistema
remoto de distribuição das HVs são cumpridos, [27][28].
Para testar todas as opções de configuração e não estar a sobrecarregar o controlo digital, utilizou-se
um conetor que permite selecionar qual das opções a utilizar. Na Figura 2.16 encontra-se o conetor e um
circuito de carga passiva.

Figura 2.16: Circuito de Carga/PMT, com as várias ligações possı́veis.

Para ter a opção de circuito aberto basta deixar o pino 2, que corresponde à HV, desconectado. Para
colocar o circuito com uma carga resistiva, deve-se ligar, ao pino 2, um conjunto de resistências de
potência, e conecta-las aos pinos 1 e/ou 3, que correspondem à massa. Conectou-se ao pino 4 o circuito
que simula o divisor passivo de HV que está acoplado aos PMTs. Conectando-se o pino 2 ao pino 4
obtém-se, então, a HV com carga passiva. Para efetuar os testes com o novo circuito de divisores ativos
de HV, ter-se-á de ligar este ao pino 2 e conectar a GND do divisor à GND do conetor. Por fim, para
efetuar a monitorização com as componentes que estarão no TileCal, basta ligar os divisores ativos de
HV e o PMT ao pino 2.

2.5.2 Leituras de Tensão e Corrente


2.5.2.1 Leitura de Tensão

A placa HV Test terá duas opções de leitura, uma externa efetuada pelo voltı́metro e controlado por
um software externo ao implementado para a carta HV Test e outra interna efetuada com recurso ao ADC
interno da carta. O voltı́metro a utilizar na carta terá de ser de HV.
Escolheu-se o ADC (MCP3201) de 12-bit e com uma interface série para fazer as leituras de tensão.
Para funcionar este necessita de uma tensão de alimentação de 3,3 V e uma tensão de referência externa,
e de receber os sinais SCLK e CS. Quanto melhor for a tensão de referência, melhor será a exatidão do
ADC. Assim, para a tensão de referência utilizou-se o componente REF3325AIDCKT, que é alimentado
com uma tensão de 3,3 V sendo a sua tensão de referência de 2,5 V com uma variação de tensão muito
baixa em relação a variações de temperatura. Na Figura 2.17 encontra-se o ADC com os respetivos
sinais de entrada e saı́da, e a respetiva referência externa. O ADC irá efetuar a leitura da tensão do
sinal ADC IN. O sinal de saı́da será um conjunto de 16 bits, onde 4 não correspondem à medição,
sendo valores a descartar. O ADC é ativado a ’0’. O erro de quantificação do ADC depende da tensão
V f
de referência e da respetiva resolução, sendo: ∆V = ± 12 VLSB = ± 12 212re−1 = 12 4095
2.5
≈ 0, 31 mV. Assim
teremos um erro máximo de 0,31 V, que é ao ter uma tensão no valor máximo de -1000 V.

25
Figura 2.17: Esquemático do ADC, com os respetivos sinais de entrada e saı́da, e a tensão de referência externa.

As tensões a ler tem que ser adaptadas ao valor de tensão de referência do ADC de 2,5 V. No caso das
HVs, tiveram de se redimensionar as tensões para o valor desejado e depois inverter-se o sinal. Admitiu-
se que o valor mı́nimo que as HVs, VHV , é -1000 V. Utilizou-se um divisor de tensão para diminuir
esta. Definiu-se R1=100 MΩ e R2=240 MΩ, obtém-se que a tensão de saı́da na entrada negativa do
R2
amplificador é, V− = VHV R1+R2 = −2, 39V . Para a inversão dos sinais utilizou-se o amplificador de
instrumentação (INA828ID) com ganho unitário, a tensão de saı́da do amplificador de instrumentação é
dada pela seguinte forma, Vout = G(V+ − V− ) + Vre f , tendo-se o ganho unitário a tensão de referência e
a tensão da entrada positiva nulas obtém-se que consoante a tensão de entrada tem o simétrico a saı́da,
se V− = −2, 39V então tem-se Vout = 2, 39V . Na Figura 2.18 encontra-se o esquemático do circuito de
condicionamento da HV. Optou-se por dar uma margem ao sinal de entrada no ADC, para não se ter o
valor máximo de entrada muito próximo do sinal de referência do ADC. Utilizaram-se resistências de
HV e de 0,1% de tolerância.

Figura 2.18: Circuito de condicionamento da HV. Converteram-se os -1000 V em 2,39 V.

Utilizou-se um circuito análogo às HVs para dimensionar as LVs. Aplicou-se um divisor de tensão
seguido de um amplificador de instrumentação com ganho unitário para adaptação de impedâncias.
Admitiu-se que o valor máximo que as LVs, VLV , podiam ter era 24 V. O circuito é análogo ao da Figura
2.18 tendo em conta a conversão desejada. A conversão para os valores reais de tensão será efetuada
pela interface do utilizador desenvolvida para automatizar as medidas efetuadas, que será detalhada no
capı́tulo 3.
Após a adaptação dos dois sinais de forma a poderem ser lidos pelo ADC teve de se utilizar um MUX
2x1 (TS5A4624DCKR) para selecionar a leitura HV ou de LV, ou seja, o sinal de entrada do ADC. O
sinal responsável por esta seleção é Switch HVLV. Quando o sinal Switch HVLV está a ’0’ a entrada
do ADC encontra-se conectada à HV que se pretende ler e quando o sinal está a ’1’ a entrada do ADC

26
encontra-se conectada à LV que se pretende ler. Na Figura 2.19 encontra-se o esquemático do MUX, e
um conetor que permitirá medir as respetivas tensões com um voltı́metro se for necessário.

Figura 2.19: Esquemático do MUX 2x1, e do conetor de verificação dos sinais de tensão intermédios.

2.5.2.2 Leitura de Corrente

Para efetuar leituras de corrente, tanto na HV como na LV, utilizou-se uma resistência de 1 Ω com
tolerância de 1%, a cujos os terminais se ligaram a um conetor 2x1. Como a resistência é de 1 Ω a
queda de tensão aos seus terminais será igual à corrente que passa pela resistência. Será necessário um
voltı́metro para efetuar as leituras de tensão. Como a queda de tensão aos terminais da resistência é muito
pequena, esta não irá influenciar as leituras de tensão. Quando não se deseja efetuar leituras de corrente,
apenas é necessário conectar os dois terminais do conetor com um cavalete (jumper). Na Figura 2.20
encontra-se o circuito correspondente à leitura de corrente. Para a leitura de corrente das LVs utilizou-se
um circuito idêntico.

Figura 2.20: Esquemático do circuito que permite efetuar leituras de corrente.

2.5.3 Teste dos Cabos Longos


Terão de se efetuar testes aos cabos de 100 m que distribuem a HV da sala USA15 até a caverna
do ATLAS onde se encontram os PMTs. É necessário testar a continuidade dos cabos e as alterações e
a fenómenos de capacidade parasita, assim como, possı́vel interferência entre cabos. Desta forma será
desenvolvida uma placa, HV Cable, para efetuar os referidos testes. Este trabalho será realizado no
âmbito de outra tese, [29].
Esta placa terá como requisitos:

• Teste de 96 cabos;

• Testes de continuidade, em ambiente de laboratório e em experiência ATLAS, CERN;

27
• Possibilidades de leitura da HV, com carga passiva, ativa, com ou sem um PMT ligado e sem
carga;

• Testes de isolamento;

• Contém um conversor DC/DC de -1500 V como HV primária.

Esta placa está a ser desenhada para o teste em dois ambientes diferentes, o primeiro é em ambiente
de laboratório, onde os cabos são ligados entre a HV Test, que permite a distribuição automática de HV
primária a apenas um cabo de cada vez e, a carta HV Cable que monitoriza os resultados do teste. O
segundo é em ambiente CERN onde se coloca o inı́cio dos cabos ligados às cartas HV Test e HV Cable
e estes estarão conectados na caverna da experiência ATLAS. No primeiro modo a placa HV Cable irá
fazer a monitorização da HV após passar pelo cabo e monitorizará todos os outros cabos, de modo a
perceber-se se há erro na ligação ou algum tipo de interligação entre os fios (que não deve existir se
todos os isolamentos funcionarem corretamente). Logo foi necessário colocar 96 circuitos idênticos para
fazer a monitorização de todos os canais. Analogamente à HV Test, ir-se-á colocar um circuito igual ao
bloco da carga/PMT onde será possı́vel efetuar os diferentes modos de leitura. Na Figura 2.21 encontra-
se o diagrama de blocos de utilização da HV Cable. No segundo modo apenas se irá testar a continuidade
dos cabos, visto que no CERN o acesso ao detetor não é possı́vel para testes. Caso a conexão aos PMTs
esteja incorreta, o circuito de monitorização dedicado a estes irá medir uma tensão diferente da esperada.
Na Figura 2.22 encontra-se o bloco funcional da HV Cable, com os circuitos utilizados em ambiente
CERN. As leituras de tensão na HV Cable serão realizadas por um ADC, tal como as leituras de HV da
carta desenvolvida neste trabalho.

Figura 2.21: Esquemático do modo de funcionamento da Figura 2.22: Esquemático do modo de funcionamento da
HV Cable, em ambiente de laboratório. HV Cable, em ambiente CERN.

As alimentações necessárias à HV Cable são 24 V e ±3,3 V. Estas serão fornecidas pela HV Test,
tenso sido adicionado um conector 20x2, para ligar à HV Cable, assim neste tipo de testes o número de
fontes externas é mitigado. Na Figura 2.23 encontra-se o esquemático do conetor de alimentação à HV
Cable. Como para testar os cabos são necessárias as duas cartas, HV Test e HV Cable, será utilizado o
mesmo controlador, Raspberry pi, para as duas placas, ou seja, os sinais de controlo SPI de comunicação
serão partilhados. Cada placa tem um expansor série–paralelo de 16 bits dedicado, que irão partilhar o

28
CS mas cada um terá o seu endereço de hardware único. Assim, quando se quer comunicar com uma
das cartas, o código terá esse endereço.

Figura 2.23: Esquemático do conetor de alimentação da HV Cable.

Quando a carta HV Test é utilizada nos testes das cartas HV Remote, no qual as HVs de cada canal
são aplicadas nos conetores dB25, estes funcionam como conetores de entrada. No teste dos cabos a
HV primária gerada pelo conversor DC/DC disponı́vel na carta HV Cable será distribuı́da pelos 96 cabos
conectados aos conetores dB25 que neste caso são conetores de saı́da. A utilização da HV Test apenas
permite a não replicação das matrizes de relés e o respetivo controlo digital na carta HV Cable.

2.6 Desenho da Placa de Circuito Impresso


Depois de todos os esquemáticos estarem definidos e os componentes devidamente selecionados,
(Apêndice A), procedeu-se à implementação de todos os componentes na Placa de Circuito Impresso
(PCB). Utilizou-se o Altium Designer para implementar, quer os esquemáticos, quer a PCB. Nesta fase
já se tem em consideração as dimensões dos componentes, para além das caracterı́sticas internas. A placa
terá várias áreas com HV daı́ ter-se tido uma atenção redobrada na elaboração da PCB para não haver
nenhum erro que comprometa a performance da HV Test. Teve-se em atenção as distâncias mı́nimas
entre pistas e planos massa e de alimentação (clearences), regras de espaçamento e técnicas de desenho,
de modo a minimizar possı́veis erros e interferências. Assim, no desenvolvimento da PCB tiveram-se em
atenção os seguintes tópicos:

• Isolar os sinais de HV - de modo que não ocorra nenhum curto-circuito que comprometa os outros
componentes, nem a PCB;

• Minimizar fontes de ruı́do - O ruı́do é originado de várias formas, desde o ruı́do intrı́nseco dos
componentes utilizados, a ruı́do de interferência entre os diferentes blocos do circuito e elemen-
tos externos. Existem diversos componentes que são muito sensı́veis ao ruı́do, desta forma foi
necessário implementar soluções que mitigassem o ruı́do de modo a não comprometer a perfor-
mance dos mesmos;

• Condensadores de desacoplamento de ruı́do - É necessário utilizar vários condensadores de de-


sacoplamento de ruı́do juntos às alimentações dos circuitos integrados. Quanto mais próximo
os condensadores estiverem dos respetivos pinos de alimentação dos circuitos integrados melhor,
logo, em alguns casos, tiveram de ser colocados no lado oposto da placa face ao respetivo integrado
para cumprir com os objetivos de proximidade.

29
De modo a otimizar e mitigar o seu tamanho fı́sico, colocaram-se, na carta, 48 relés de HV na camada
superior (Top Layer) e os outros 48 relés de HV na camada inferior (Bottom Layer). Colocou-se os 4
conetores dB25 de cada lado na placa, em camadas opostas, de forma a que os que se encontram na
camada superior correspondem a todos os relés da camada superior e vice-versa, Figuras 2.24 e 2.25.
Na parte de cima da Figura 2.24 encontram-se os relés de controlo e todos os componentes necessários
ao controlo da placa. A carta deverá ter uma fixação vertical no laboratório, o que facilita também a
manipulação de todos os cabos necessários.

Figura 2.24: Vista 3D da camada superior da PCB da HV Figura 2.25: Vista 3D da camada inferior da PCB da HV
Test. Test.

A placa terá 6 camadas, na Figura 2.26 encontra-se o esquema das várias camadas da HV Test.
Definiram-se as terceira e quarta camada como massa e plano de alimentação, respetivamente. Teve-se
em atenção que na quarta camada estarão os 3 planos de alimentação necessários e distribuı́ram-se estes
planos ao longo da camada de modo a ser necessário o menor número de vias. Na segunda e na quinta
camada encontram-se as HVs, cada uma correspondente à HV proveniente da camada superior e inferior,
respetivamente. Como a HV apenas irá ser necessária junto aos relés, aproveitou-se estas camadas para
a passagem de sinais digitais em zonas isoladas de HV. Por fim, a primeira e a sexta são camadas para
os sinais de controlo e monitorização. Na camada superior estará a maior parte dos componentes de
controlo, como os conetores das LVs, e o ADC.
Para além do referido, foram tidas em conta no desenho da placa outros fatores. O primeiro é a
orientação dos componentes, os componentes iguais foram todos orientados no mesmo sentido. Isto foi
mais utilizado devido ao elevado número de relés e componentes a eles associados. Esta técnica facilita
a soldadura dos componentes e o teste da carta.
O segundo tem a haver com o mapeamento, ou seja, nunca colocar componentes demasiado
próximos, pois um deles pode aquecer e provocar o aquecimento do vizinho. Assim convém isolar

30
Figura 2.26: Esquemático das várias camadas que compõem a HV Test.

componentes que se saibam, a priori, que aquecem. Outro ponto em atenção é a indução de sinais, não se
devendo colocar pistas de sinais digitais próximas das pistas com sinais analógicos, pois estes podem in-
terferir e comprometer o funcionamento da placa. Também é importante ter bons planos de alimentação
e de massa, permitindo a mitigação do ruı́do, o que ajuda no desempenho da placa.
O último ponto é a disposição dos componentes digitais. Tentou-se colocar todos os componentes
digitais o mais próximos possı́veis de modo que os sinais MOSI, MISO, SCLK percorram a menor
distância nas pistas, reduzindo simultaneamente a interferência entre eles.
Após ter-se estes pontos todos em consideração efetuou-se a disposição de todos os componentes e a
seguir efetuaram-se-se todas as ligações. Este processo é auxiliado pelas funcionalidades da ferramenta
Altium. Como se tem várias pistas com HV, efetuou-se a colocação um marcador em todos os sinais
de HV nos esquemáticos, assim estes quando são desenhados na PCB apresentam logo um espaçamento
muito maior entre pistas, do que as pistas comuns. Também se teve em atenção ao espaçamento dos
dielétricos que separam as camadas de HV das outras camadas e a largura das respetivas pistas, Figura
2.26. No final a PCB foi validada pelo Altium e corrigiram-se todos os erros, obtendo-se assim a imagem
3D da placa nas Figuras 2.24 e 2.25.
A seguir, com o auxı́lio do Altium, gerou-se a lista de materiais, (BOM), e as gerber files, os ficheiros
com as informações do mapeamento de cada camada. Estes dois são os ficheiros necessários para enviar a
PCB para fabrico. O fabrico da placa será efetuado por duas empresas, a primeira é a EUROCIRCUITS,
esta irá produzir a placa sem os componentes, a segunda é a SYSTION ELETRONICS Lda, esta irá
efetuar a montagem dos componentes. A carta desenvolvida neste trabalho não foi fabricada uma vez
que se está a agendar o teste funcional do 1º prototipo para efetuar correções que sejam necessárias. O
1º protótipo aguarda a soldadura dos componentes, uma vez que devido à pandemia alguns deles não se
encontram disponı́veis no mercado. Como não foi possı́vel testar a carta procedeu-se ao desenvolvimento
de uma interface utilizador e à implementação do código necessário à automatização dos testes de 2

31
conjuntos, HV Remote + HV Supplies, para ambos os protótipos. No próximo capı́tulo estas tarefas são
descritas em detalhe.

32
Capı́tulo 3

Interface Gráfica para o Utilizador e


Comunicação com a Placa HV Test

Neste capı́tulo irá ser descrita a Interface Gráfica para o Utilizador (GUI) que facilitará a
comunicação com a placa HV Test e, também, irá ser detalhada a comunicação entre o controlador,
a carta de desenvolvimento (Raspberry pi), e a placa HV Test. Como dito anteriormente, a placa desen-
volvida nesta dissertação é o segundo protótipo, a GUI foi desenvolvida noutra dissertação, [17]. A GUI
desenvolvida em [17] apenas tinha a sua componente gráfica operacional, pelo que se teve de acrescentar
funcionalidades, como a secção das baixas tensões (LV), entre outras. Todo o código de comunicação
entre a GUI e a placa HV Test e a análise de dados, teve de ser desenvolvida. A interface foi também
testada com os dados simulados. A interface está desenhada para efetuar a monitorização de duas pla-
cas HV Remote, tendo a opção de efetuar leituras sequenciais de todos os canais de uma placa, como,
também, monitorizar a leitura de um canal especı́fico. Por fim, está também preparada para efetuar a
monitorização das LVs. O controlo digital entre o primeiro e o segundo protótipo não é idêntico, pelo
que se tiveram de produzir dois códigos distintos, um para cada versão. Para se entender bem a GUI,
é necessário não só perceber o segundo protótipo da placa HV Test, PT2, descrita nesta dissertação,
como também, é necessário conhecer o primeiro protótipo da placa HV Test, PT1, a qual se passará a ser
descrita seguidamente.

3.1 Placa HV Test - Primeiro Protótipo


O primeiro protótipo tem, praticamente, os mesmos requisitos que o segundo, diferindo apenas no
facto de o primeiro protótipo ter também como objetivo o teste de vários componentes de modo a verificar
qual o componente que cumpre melhor com os requisitos propostos. Assim utilizaram-se 5 tipos de
relés (uns eletromecânicos tradicionais e outro do tipo reed) e 4 tipos de Conversor Analógico Digital
(ADC), com o propósito de testar o desempenho deles de modo a verificar quais são mais adequados
para os requisitos da placa. A placa, inicialmente, foi desenhada para monitorizar 4 cartas HV Remote
em simultâneo, mas devido a problemas dimensionais teve-se de reduzir o número para metade. Por
cada 24 entradas de HV utilizou-se um tipo de relé. Todos os relés são de HV e necessitam de uma
tensão de alimentação de 24 V. Para efetuar as leituras tem-se à disposição 4 ADCs, um monitorizará
as LVs enquanto os outros 3 monitorizaram as HVs. Apenas os ADCs enviam informação para a carta
Raspberry pi, tendo sido utilizado o protocolo SPI. Como nesta placa existem 4 ADCs tem-se quatro
saı́das de dados, pelo que se utilizou um MUX para selecionar qual o canal a conectar ao sinal MISO do

33
protocolo. Tal como as cartas HV Remote e HV Supplies utilizaram-se expansores série-paralelos de 16
bits. Os sinais de saı́da dos expansores permitem controlar todos os sinais de ativação e de referência dos
DMUXs, utilizados no controlo das matrizes de relés. Neste caso apenas se utiliza o modo de escrita do
expansor, este tem outras funcionalidades que não iram ser necessárias. Uma dessas funcionalidades é a
leitura dos estados das saı́das, que não irá ser utilizada no normal funcionamento da carta, mas caso seja
necessário, por exemplo, na altura de testes da placa, os portos de saı́da do expansor podem ser lidos ao
se conectar o sinal de saı́da da interface série do expansor ao sinal MISO da carta. A primeira versão tem
os seguintes requisitos:

• Monitorização de 96 saı́das de HV;

• 2 tipos de leitura, interna (ADCs) e externa (voltı́metro);

• 3 modos de leitura, em circuito aberto, com carga passiva e com um PMT ligado;

• Possibilidade de distribuição de HV externa por uma das 96 saı́das disponı́veis.

No primeiro protótipo foram utilizados componentes true hole e devido ao elevado número de compo-
nentes, às dimensões e a todos os componentes encontrarem-se na camada superior (top layer), obteve-se
uma PCB de elevadas dimensões, pouco prático de utilizar.
Na Figura 3.1 encontra-se o diagrama funcional da placa HV Test PT1. Esta tem uma estrutura
semelhante ao diagrama da placa HV Test PT2, que se encontra na Figura 2.15. Este difere na parte final
onde ocorre a monitorização. No 1º protótipo existem vários ADCs que podem efetuar a mesma medição
e existe um especı́fico que efetua a monitorização das LVs. O voltı́metro pode efetuar todas as leituras,
HVs e LVs.

Figura 3.1: Diagrama funcional da placa HV Test PT1.

Como no 1º protótipo existem mais componentes foi necessário utilizar dois expansores série pa-
ralelo de 16-bit para o controlo digital. Para além do controlo necessário para ativar as HVs e LVs,

34
comparativamente ao 2º protótipo, existem mais 3 sinais de CS, um para cada ADC, e mais quatro sinais
para controlar o MUX de saı́da. Na Figura 3.2 encontra-se o diagrama de blocos do controlo digital da
placa HV Test PT1.

Figura 3.2: Diagrama digital da placa HV Test PT1.

Utilizou-se o mesmo CS para os dois expansores, diferindo entre eles o endereço fı́sico, que é dife-
rente para cada um. A descrição detalhada da placa encontra-se em [17].

3.2 Interface Gráfica para o Utilizador


Criou-se a GUI para testar ambos os protótipos da carta HV Test, tendo sido implementada em
linguagem Python. A GUI permite a comunicação entre a placa HV Test e a carta de controlo, Raspberry
pi 4. O Raspberry pi é um computador de custo reduzido, com um tamanho de um cartão de crédito, que
tem o seu próprio sistema operativo e para funcionar apenas necessita de um ecrã, um rato e um teclado.
Utilizou-se a versão mais recente da linguagem Python, V.3.7.9. Esta linguagem tornou-se muito
vantajosa por ter uma enorme variedade de bibliotecas, onde, neste caso, se tirou partido das bibliotecas
de desenvolvimento gráfico, como também, das bibliotecas que permitem efetuar a comunicação entre
vários tipos de dispositivos, por exemplo, a biblioteca spidev que permite efetuar comunicação entre o
Raspberry pi e a biblioteca RPI.GPIO. Esta biblioteca fornece uma classe para o controlo de entradas e
saı́das, General Purpose Input/Output (GPIO), que permite programar a informação de entrada e saı́da
dos sinais de comunicação entre periféricos e microcontroladores, no Raspberry pi. Para o desenvolvi-
mento da interface utilizou-se a biblioteca PyQt 5. Outra biblioteca usada foi a Qt, que é um conjunto
de plataformas que cruzam com as bibliotecas da linguagem C++, que costumam ser implementadas nas
aplicações de interface, Application Programming Interface (APIs). O PyQt5 é um conjunto variado de
ligações do Python para as bibliotecas Qt versão 5. O PyQt5 tem 35 módulos que permitem implementar
aplicações em Python em alternativa às aplicações que costumam ser desenvolvidas em C++.
Todo o projeto tem sido desenvolvido com recurso à programação orientada a objetos, método muito
prático e útil, devido a ser mais fácil de utilizar e reutilizar. Em programas maiores torna-se simples,
pois a reutilização de código é extremamente dinâmica, e quando se altera um objeto os restantes não são
afetados. Devido às vantagens, elaborou-se todo o código de comunicação da placa HV Test tendo por
base este método. Definiu-se a interface como uma classe, neste caso como a classe principal, e escreveu-

35
se todo o código que permite implementar todas as funções que esta efetua. Para não sobrecarregar
esta classe e tendo em consideração a programação orientada a objetos, criaram-se novas classes para
desempenhar as funções. Por exemplo, todo o código de comandos de comunicação com a placa está
desenvolvido noutra classe, assim ao efetuar uma instrução, chama-se esta classe e dá-se como entrada
os parâmetros necessários. Neste método, os objetos tanto são variáveis do código, como podem ser
classes com parâmetros especı́ficos.
A partir da biblioteca PyQt5, criou-se a janela principal. De inı́cio esta é criada com um tamanho
arbitrário e consiste apenas um retângulo em branco sem nenhuma função e nenhum botão. Para de-
senvolver a GUI vão ser utilizados vários objetos que irão preencher a janela principal. Esta tem várias
opções desde caixas para colocar texto, botões, caixas de seleção, a barras de opções. Na criação da
janela principal definiram-se as dimensões desta, a seguir começaram-se a adicionar as funcionalida-
des. Cada funcionalidade, como texto, botões, caixas de texto, ou barras de opções, tem um comando
especı́fico para inicializar. Por exemplo, para criar uma frase utiliza-se o comando QLabel() e depois
define-se o texto que se quer implementar. De modo a simplificar a estrutura, agruparam-se as funciona-
lidades referentes a um determinado parâmetro num objeto, para quando adicionado à janela principal,
ser apenas preciso chamar o objeto que contem todas as caracterı́sticas daquela funcionalidade. Na Fi-
gura 3.3 encontra-se o exemplo com todo o texto e as funcionalidades a serem adicionadas ao objeto
self.time layout. Neste caso definiu-se este como uma caixa retangular com opções pré-definidas, mas
existem mais opções consoante o tipo de classe que se utiliza. Todas as classes que se utilizaram serão
detalhadas mais à frente na descrição das funções da GUI.

Figura 3.3: Código utilizado para a criação do texto e da barra de opções (a) e o resultado do código implementado (b), [17].

Sempre que se tem uma funcionalidade e, se al-


tera o seu estado, irá ser chamada uma função para
alterar o parâmetro especifico ou, por exemplo, abrir
uma nova janela. No caso da Figura 3.3 ao alterar-
se o tempo de intervalo, irá ser chamada a função
self.selectionchange. No final adicionam-se todos os
objetos, que contêm as funcionalidades requeridas,
como o self.time layout, e colocam-se na ordem dese-
jada. Toda a estrutura da janela principal tem a mesma
hierarquia que o exemplo acabado de referir, e na Fi- Figura 3.4: Listagem de todos os objetos utilizados na
janela principal da GUI.
gura 3.4 encontram-se os comandos de todos os objetos
utilizados na janela principal da GUI.

36
3.2.1 Primeiro Protótipo
A versão provisória da GUI (PT1) foi desenvolvida em [17]. Nesta secção, o trabalho desenvolvido
em [17] vai ser apresentado em detalhe porque é extremamente relevante para o código de comunicação
com a placa. A GUI foi desenvolvida em redor de 3 funções principais. A primeira consiste em efetuar
uma medição sequencial de todas as saı́das de HV de uma placa HV Remote, ou de várias existindo na
interface a opção de efetuar monitorizações até 4 placas HV Remote sendo as leituras sempre sequenci-
ais. A segunda função consiste em efetuar a monitorização num canal especı́fico de uma HV Remote,
analogamente à primeira opção, também se tem as 4 cartas HV Remote de opção. Por fim a última função
efetua as monitorizações das LVs, caso em que o utilizador escolhe qual a LV a monitorizar. Na Figura
3.5 encontra-se o diagrama funcional de blocos da GUI. A partir da janela principal, Main Window, será
possı́vel escolher o tipo de monitorização entre os 3 disponı́veis e depois realizar-se-á a análise e recolha
de dados, e no fim poder-se-á iniciar outro tipo de monitorização.

Figura 3.5: Diagrama funcional da interface gráfica para o utilizador (GUI).

Na Figura 3.6 encontra-se uma imagem da janela principal. No canto superior direito definiram-se
3 botões, que estão em quase todas as janelas de uma interface gráfica. Tem-se o botão de minimizar a
janela, o botão de definir a janela em todo o ecrã e/ou minimizar para o tamanho original e o botão de
fechar a janela, que quando selecionado termina o programa. Todas as janelas desta interface terão estes
3 botões no canto superior direito. A janela principal tem dois parâmetros a definir para as medições e
tem 3 opções de leitura. O primeiro parâmetro é o intervalo de tempo entre medições, definiu-se este
como uma barra de opções. Colocaram-se 4 opções, [0,1; 0,5; 1; 10] s. O utilizador irá escolher uma
opção, mas definiu-se 0,1 s como o valor por omissão. O segundo parâmetro é definir o número de placas
a monitorizar. Criou-se uma grelha 4x1 com 4 caixas de seleção, em que cada uma corresponde a uma
placa HV Remote. Este parâmetro está diretamente relacionado com a primeira função, Start Full board
reading (HV). Esta função só é executada se pelo menos uma das caixas de seleção estiver selecionada.
A seguir, existem 3 botões em que cada um corresponde a um tipo de monitorização. A primeira, Start
Full board reading (HV), corresponde à monitorização sequencial de todos os canais de uma, ou várias,
placas HV Remote. Para a função ser executada tem de estar pelo menos uma placa selecionada. A
segunda, Individual channels (HV), corresponde à monitorização de um canal especı́fico de uma das
placas. A última, Low voltages, corresponde à monitorização das baixas tensões.

37
Figura 3.6: Janela principal da GUI, [17].

Apenas se efetuará uma breve descrição das funções, Start Full board reading (HV) e Individual
channels (HV), porque estas já estavam efetuadas. A função Low Voltages não estava feita e, como tal,
será detalhada na secção Baixas Tensões, 3.2.3. A função Start Full board reading (HV) irá monitorizar
sequencialmente todos os canais das placas, selecionadas previamente, e serão monitorizadas pela ordem
em que aparecem na janela principal. Ao premir-se o botão desta função irá abrir-se uma nova janela,
Figura 3.7, onde aparece o texto a indicar quais as placas a ser monitorizadas, o intervalo de tempo entre
medições e a que placa pertencem os dados que estão a ser mostrados.

Figura 3.7: Janela da função Start Full board reading (HV) [17].

38
A seguir é mostrado um gráfico com as leituras que se realizaram, com os valores de todas as saı́das
de HV de uma placa. Na Figura 3.7 os valores mostrados correspondem a valores simulados e não a
dados reais. As setas que se encontram à esquerda e à direita do gráfico servem para alternar entre
gráficos que correspondem a placas diferentes. O gráfico irá mostrar as últimas 100 medições realizadas.
No caso mostrado na figura 3.7, está-se a observar os dados da placa 1 e estão a ser monitorizadas as 4
placas. Na tabela que aparece à direita do gráfico estão os dados estatı́sticos referente à placa em questão.
Indica-se a média total, a média das últimas 100 medições, o desvio padrão, os valores máximo e mı́nimo,
respetivamente. Na tabela que aparece por baixo do gráfico encontram-se os dados referentes às últimas
medições realizadas, onde se indica a placa, o canal e o valor de tensão medido. Os últimos dois botões,
Stop e Main Window, permitem parar a monitorização e voltar à janela principal, respetivamente. Quando
se para a monitorização obtém-se, no lugar dos dois botões, Stop e Main Window, um conjunto de botões
e uma barra de escrita, Figura 3.8.

Figura 3.8: Imagem dos botões e barra de escrita que aparecem quando o botão Stop é selecionado, [17].

O primeiro botão, Continue, permite continuar a monitorização, do ponto onde se parou. O segundo
botão, Main Window, permite voltar à janela principal. A barra de escrita permite escrever a pasta e
o nome do ficheiro onde se quer guardar os dados monitorizados. O terceiro botão permite guardar
no ficheiro desejado todos os dados de todas as placas monitorizadas até à data. Finalmente, o quarto
botão, permite guardar no ficheiro desejado os dados correspondentes à placa em questão. Nesta função
de leitura existe a funcionalidade de gravação automática, que efetua a gravação dos dados a cada 48
leituras e atualiza os valores num ficheiro. Este ficheiro gerado automaticamente terá como nome, o
número de segundos que já passaram desde a data/hora (1 de Janeiro 1970, 00:00:00 (UTC)), ou seja,
um ficheiro guardado no dia 11 de Novembro de 2021 às 17:09, na Hora de Portugal, terá o nome de
“data 1636650563.txt”. Os ficheiros em que se guardam os dados são do formato “.txt”.
Nesta função existe mais uma funcionalidade que é a possibilidade de analisar um canal especı́fico.
No canto superior esquerdo existem duas opções, a Reading e a Individual Channel Reading. Todas
as caracterı́sticas detalhadas anteriormente estão na opção Reading. Caso se queria analisar um canal
especı́fico seleciona-se a opção Individual Channel Reading, Figura 3.9. Nesta opção ter-se-ão duas
barras de opções, a primeira para selecionar a placa e a segunda para selecionar o canal. O gráfico
mostra os valores obtidos neste canal. Analogamente à opção Reading, tem-se do lado direito do gráfico
uma tabela com a estatı́stica dos dados e, por baixo, outra tabela com as últimas medições realizadas.
A função Individual channels (HV) irá monitorizar um canal especı́fico. Ao selecionar-se o botão
desta função ir-se-á obter a janela da Figura 3.10. No canto superior esquerdo estão as opções de alternar
entre placas, existem 4 opções de placas. A seguir aparece texto a indicar para o utilizador escolher
um dos 48 canais disponı́veis. Criou-se uma matriz de 8x6 botões e ao selecionar-se um botão irá
começar a monitorização do canal selecionado. Por baixo da matriz de botões encontra-se texto a indicar
que nenhum canal é monitorizado e por baixo deste encontra-se o botão Main Window, que serve para
retornar à janela principal. Ao selecionar-se um canal, de uma placa, irá obter-se a janela da Figura 3.11.
Esta apenas difere da janela inicial, na posição do gráfico que é mostrado por baixo da matriz de botões.
O gráfico mostra os valores medidos do canal. Por baixo do gráfico aparece um novo botão, Stop, que
efetuará a paragem da monitorização. Por baixo deste continua o botão Main Window. Analogamente
aos gráficos que aparecem na outra função tem-se do lado direito do gráfico uma tabela com a estatı́stica

39
dos dados e por baixo outra tabela com as últimas medições realizadas.

Figura 3.9: Janela da função Start Full board reading (HV) na opção Individual Channel Reading, [17].

Figura 3.10: Janela inicial da função Individual Channels (HV), [17].

Após selecionar-se o botão de paragem, Stop, obtém-se 4 botões e uma barra de escrita, Figura 3.12.
O primeiro, Continue, permite continuar a leitura do ponto de paragem. O segundo, Reset Channel
Data, permite reiniciar a leitura no mesmo canal. O terceiro, Main Window, permite retornar à janela
principal. A barra de escrita permite escrever a pasta e o nome do ficheiro onde se quer guardar os dados
monitorizados. O último botão, Save Channel Data, permite guardar os dados no ficheiro. Nesta função
não existe a gravação automática dos dados.

40
Figura 3.11: Janela da função Individual channels (HV) após selecionar-se um canal para efetuar a monitorização, [17].

Figura 3.12: Imagem dos botões e da barra de escrita que aparecem ao selecionar-se o botão Stop na monitorização individual,
[17].

3.2.2 Melhoramento da Janela Principal da GUI


A GUI iniciada para o primeiro protótipo ficou inacabada, pois ficou a faltar fazer a função das LV.
Para além desta função adicionaram-se outras informações como, a versão da HV Test em utilização, o
modo de leitura, para o caso de se monitorizar com o ADC ou com o voltı́metro, ou por ambos, e para
o primeiro protótipo tem de se escolher quais os ADCs a utilizar nas leituras. A janela principal foi
atualizada para ambos os protótipos atuais da placa HV Test, Figura 3.13. A primeira funcionalidade que
se adicionou foi a seleção do protótipo da HV Test que será testada. Adicionou-se uma barra de opções,
através do comando QComboBox(), com duas opções, HVTest PT1 e HVTet PT2, e predefiniu-se a opção
HVTest PT1. A alteração desta opção da barra irá ativar a função que altera a variável responsável pelo
protótipo da HV Test. A segunda funcionalidade que se adicionou foi o modo de leitura, onde analo-
gamente à primeira interface, se adicionou uma barra de opções. Pré-definiu-se o modo Both/Sequen-
cial que indica que cada medição será primeiramente realizada pelo ADC e, de seguida, efetuada pelo
voltı́metro. Os outros dois modos, ADC e Voltmeter, correspondem a efetuar as medições com o recurso
exclusivo do ADC ou do voltı́metro, respetivamente. Criou-se uma variável para guardar o estado do

41
modo de leitura. A terceira funcionalidade adicionada foi o modo de leitura dos ADCs. Foram adiciona-
dos botões de seleção, através do comando QCheckBox(). O modo Automatic encontra-se pré-definido e

Figura 3.13: Nova Janela principal da GUI.

a escolha do ADC que efetua a medição é automática, sendo o primeiro ADC responsável por 48 saı́das,
enquanto os outros dois são responsáveis pelas restantes 48 saı́das, 24 para cada um. Se apenas se quer
utilizar um ou dois ADCs especı́ficos seleciona-se a caixa de seleção Manual, e após a seleção, obtém-se
uma matriz de 3x1 com 3 caixas de seleção onde cada uma corresponde a um ADC, Figura 3.14. Na
Figura 3.15 encontra-se a função acionada quando a seleção da caixa de seleção é Manual. Criou-se uma
variável para guardar o estado do modo de leitura, self.auto e criou-se uma lista que guarda o estado de
quais os ADCs a serem utilizados. Quando se seleciona um dos ADC implementa-se uma função que
altera o valor da lista correspondente ao número do ADC. Após selecionados, pode-se selecionar qual
o tipo de monitorização a realizar. Esta terceira funcionalidade não se encontra disponı́vel quando se
seleciona a opção de testar o segundo protótipo da placa, uma vez que o 2º protótipo da HV Test tem
apenas um ADC e não vários como o primeiro protótipo.

3.2.3 Baixas Tensões


Após selecionados todos os parâmetros associados ao protótipo em teste, escolhe-se o modo de lei-
tura que se deseja. No caso de se pretender monitorizar as LVs, seleciona-se o último botão da GUI.
Ao premir este obtém-se uma nova janela, implementada pela função low voltage read. Na Figura 3.16
encontra-se a imagem da nova janela. Esta é composta por 4 botões principais, em que cada um cor-
responde à leitura de uma das baixas tensões primárias da placa. Utilizou-se o mesmo principio de
construção de objetos para o desenvolvimento desta janela. No fim da janela adicionou-se o botão Main
Window, que retrocede à janela principal da GUI. Ao selecionar-se este botão implementa-se a função
Restart. Esta reinicia todos os temporizadores que efetuam a aquisição de dados e volta a executar a

42
Figura 3.14: Recorte da GUI com a matriz de cai-
xas de seleção correspondentes aos ADCs a esco-
lher, apenas válida para o 1º protótipo.

Figura 3.15: Função implementada após a seleção da opção Ma-


nual.

janela principal da GUI. Nesta ainda é mostrado o texto a indicar para se escolher um botão e outro que
aparece a baixo dos botões a dizer que nenhuma leitura é efetuada. Cada botão das LVs executa a função
self.read values(x,y), responsável pela atualização dos dados. A variável x é um inteiro que representa o
valor da tensão, existindo 4 possibilidades, e a variável y é um inteiro que indica o ı́ndice da LV, ou seja,
indica qual o relé a ativar. Na Figura 3.17 encontra-se um excerto do código implementado na janela
principal das LVs, com a definição de cada botão.

Figura 3.17: Excerto do código implementado na janela princi-


pal das LVs, com o código associado a cada botão.
Figura 3.16: Janela inicial das LVs, com as 4
opções de LVs que se podem monitorizar. Também
se tem um botão para retroceder à janela principal
da GUI.

Após selecionar-se um botão de LV, aparece uma nova janela indicada na Figura 3.18. Esta contı́nua
com o mesmo texto e botões iniciais, e depois indica qual a LV que se monitoriza, além de dispor de
um gráfico das leituras efetuadas. Também apresenta à direita do gráfico uma tabela com a estatı́stica

43
Figura 3.18: Janela das LVs após selecionado um botão das LVs, com as 4 opções de LVs que se podem monitorizar, o gráfico
das leituras efetuadas, as tabelas com a estatı́stica dos mesmos e os botões de paragem e retrocesso à janela principal.

dos dados registados até à data, a média, o desvio padrão, o máximo, o mı́nimo e após 100 medições
apresenta a média das últimas 100 medições. A seguir ao gráfico é apresentada uma tabela com os
últimos valores registados. A aplicação permite medir mais do que uma baixa de tensão. Os dados são
reiniciados ao premir-se um dos botões de LV. Após o inı́cio da aquisição de dados aparecem dois botões
na parte de baixo da janela, os botões de Stop e Main Window, que param a aquisição de dados e retornam
à janela principal, respetivamente.

3.2.3.1 Atualização de Dados e Intervalo de Tempo Entre Medições

A função self.read values comanda o inı́cio do relógio com o tempo atual, e é responsável por colo-
car todos os objetos que correspondem à janela das LVs, desde os botões até o gráfico. A atualização de
dados é feita de acordo com o intervalo de tempo definido pelo utilizador, pré-selecionado na janela prin-
cipal da GUI (Time Interval), sendo um temporizador da biblioteca Qt, predefinido em milissegundos.
Os comandos, start e stop, permitem inicializar e parar o temporizador.
A função self.update plot data lv também foi utilizada e permite, para além de inicializar o tempo-
rizador, efetuar a atualização de dados, e registar todos os parâmetros que são necessários. Esta começa
por chamar a função, reading func(self,...), que efetua a leitura do canal desejado. Consoante o protótipo
da placa HV Test utiliza-se uma classe distinta, Reading Code, para efetuar a leitura, que será deta-
lhada mais a frente. Após obter-se o valor, este é guardado, assim como a variável que conta quantas
medições já se efetuaram, para poder mostrar a estatı́stica dos dados. Criou-se um matriz de 2x(nº de
valores adquiridos), denominada value lv, para na primeira coluna guardar o valor médio e na outra
guardar o respetivo valor adquirido. Na Figura 3.19 encontra-se um excerto do código com a função
self.update plot data lv. Utiliza-se esta para fornecer os dados ao gráfico, mostrar os últimos dados na
tabela e por fim efetuar a estatı́stica dos mesmos.

44
Figura 3.19: Excerto de código da função self.update plot data lv, com a seleção do protótipo da placa, implementação da
função de leitura, registo do valor medido e da contagem correspondente, e seleção dos últimos 12 valores medidos para
colocar na tabela da janela principal das LVs.

3.2.3.2 Gráfico e Estatı́stica

O gráfico foi definido na função read values e implementa-se com o recurso à biblioteca pyqtgraph,
simplificando assim o processo de programação. Definiu-se que os dados que o iriam compor eram os
da matriz de valores adquiridos, value lv. Assim à medida que se adicionam valores à lista estes vão
aparecendo no gráfico. Os valores das contagens correspondem ao eixo das abcissas e os valores das
medições correspondem ao eixo das ordenadas. Na Figura 3.20 encontra-se o código de implementação
do gráfico. A variável self.penlv corresponde à cor com que vem a linha do gráfico, azul no caso da
Figura 3.18.

Figura 3.20: Excerto de código da função read values, com a implementação do gráfico.

Efetuou-se a estatı́stica dos dados adquiridos na função self.update plot data lv porque esta muda à
medida que se adquire uma nova medição. Na Figura 3.21 encontra-se a maior parte do código da função
self.update plot data lv, que contém vários comandos para efetuar a estatı́stica de todos os dados. Criou-
se uma lista com as últimas 12 medições e a primeira condição do código efetua o registo destes na lista
last values. A segunda condição cria as 5 estatı́sticas no dicionário dic ind stats e após existir a primeira
leitura, começa-se a fazer a estatı́stica dos dados. Para a média total e para a média das últimas 100
medições recorreu-se à função mean da biblioteca statistics e para o desvio padrão recorreu-se a função
pstdev. Para o máximo e para mı́nimo recorreu-se apenas à função max e min do python. Por fim, quando
a aquisição de dados passa as 100 medições é necessário implementar um deslocamento no gráfico para
este não ficar fixo na origem. Para isso regista-se sempre qual foi o valor centésimo anterior para defini-lo
como origem do gráfico.

45
Figura 3.21: Excerto de código da função self.update plot data lv, com a estatı́stica dos dados.

3.2.3.3 Guardar os Dados

Após selecionar-se o botão stop, a aquisição de dados pára e surgem na parte de baixo da janela 3
botões e uma barra de escrita. Os botões servem para continuar com as leituras, voltar à janela inicial e
guardar os dados registados até à data, encontrando-se estes botões na Figura 3.22.

Figura 3.22: Recorte da janela das LVs, com demonstração dos botões de continuar, de voltar à janela principal e a barra de
escrita para escrever a pasta e o nome do ficheiro onde se quer guardar os dados e o respetivo botão de guardar.

Após a indicação da diretoria e do nome do ficheiro na barra de escrita pressiona-se o botão


Save Channel Data, que irá implementar a função save data lv que irá guardar o nome do ficheiro,
adicionando-lhe a extensão ”.txt”, e escrever os dados num formato pré-definido. Coloca-se em tı́tulo
a LV que se esteve a adquirir e na linha seguinte escreve-se todos os valores registados em linha, com
espaço entre eles. Após a gravação dos dados surge na janela das LVs uma indicação que os dados foram
guardados no ficheiro. Na Figura 3.23 encontra-se o excerto de código que implementa esta função.

46
Figura 3.23: Código da função saave data lv, com a criação de um ficheiro e respetiva escrita.

Todas as funcionalidades da interface gráfica para o utilizador foram testadas com valores simulados.

3.3 Comunicação da Placa HV Test


A interface gráfica para o utilizador já tinha uma primeira versão, mas o código de comunicação
e teste com as cartas HV Test não estava efetuado, tendo sido uma componente importante para este
trabalho.
Como referido anteriormente, a comunicação com a placa HV Test será efetuada através do controla-
dor da placa Raspberry pi 4. Adicionou-se no 2º protótipo da HV Test, um conetor para efetuar a ligação
entre o Raspberry pi e a placa, esquematizado na Figura 3.24. Na Figura 3.25 mostra-se o mapa dos
pinos de entrada/saı́da do Raspberry pi. Os pinos a rosa são os usados no protocolo de comunicação SPI.
Os portos de saı́da utilizados na placa Raspberry pi são o pino 21 (GPIO 9), que corresponde à linha de
comunicação MISO, o pino 19 (GPIO 10), que corresponde ao sinal MOSI, o pino 23 (GPIO 11), que
corresponde ao sinal de relógio SCLK e, por fim, o pino 13 (GPIO 27), que corresponde ao sinal CS que
ativa a comunicação com a placa HV Test, ativando o expansor série-paralelo responsável pelo controlo
digital da placa e o Raspberry pi.

Figura 3.24: Conetor de entrada dos


sinais SPI na placa HV Test.

Figura 3.25: Esquema dos portos de saı́da do Raspberry pi,


com as diversas cores que correspondem a um protocolo de
comunicação, o protocolo SPI corresponde à cor rosa.

47
Tendo-se as conexões de comunicação, é possı́vel controlar e testar a placa HV Test. A biblioteca
SpiDev permite configurar a comunicação entre a placa e o Raspberry pi através do protocolo SPI. No
inı́cio do código é necessário declarar esta biblioteca como um objeto para se poder utilizar ao longo
deste. A inicialização do objeto é realizada pelo comando:

spi var = spidev.SpiDev()

De seguida é necessário selecionar quais os pinos a utilizar para o protocolo desejado, neste caso já se
definiram os pinos que são os 19, 21 e 23 que são os predefinidos do protocolo SPI no Raspberry pi. Esta
definição é efetuada por:
spi var.open(0, 0)

A polaridade, CPOL e fase, CPHA, do protocolo SPI são definidas por:

spi var.mode = 0b00

O primeiro bit corresponde à CPOL e o segundo à CPHA . Por fim é necessário definir a velocidade de
comunicação, utilizando o comando:

spi var.max speed hz = 2MHz

Para efetuar a comunicação utiliza-se o comando

spi var.x f er2([0, 0])

Este irá enviar o comando necessário à placa HV Test e esperar, caso necessário, a resposta do mesmo.
Este comando tem como entrada um array do número de bytes que se espera receber do slave. Esta
função apenas controla as linhas do SCLK, MISO e MOSI. O estado do CS tem de ser definido ex-
ternamente. A biblioteca RPi.GPIO também é necessária no código de comunicação porque é preciso
definir os nomes associados aos portos do Raspberry pi. Desta forma é necessário importar a biblioteca
e inicializar esta como um objeto, pelo comando:

GPIO = RPi.GPIO

De seguida faz-se a declaração dos números dos portos, pelo comando

GPIO.setmode(GPIO.BOARD)

Assim para selecionar um porto apenas é necessário chamar pela numeração deste, como na Figura 3.25.
Após a criação e especificação destes objetos é possı́vel criar o objeto do tipo expansor, que será
descrito mais em detalhe no item Expansor Série-Paralelo. Na inicialização é necessário passar como
parâmetros o objeto spi var, o endereço de hardware do expansor, o pino de reset, que neste caso vai
indicado como sendo o pino -1, pois a reinicialização é feita recorrendo a hardware, o pino de CS, e
por fim o objeto GPIO. Após a inicialização do objeto expansor é necessário configurá-lo e para isso,
chama-se a função configureMCP(). A GUI irá comunicar tanto com a HV Test PT1, como com o PT2.
Para isso poder acontecer foi necessário definir três expansores distintos, os dois primeiros para a HV
Test PT1 e o último para a HV Test PT2.

48
Figura 3.26: Código da inicialização dos expansores, com os respetivos objetos necessários e respetiva configuração.

3.3.1 Expansor Série-Paralelo


Será através do expansor série-paralelo de 16 bit, MCP23S17, que se irão definir todos os sinais
necessários ao controlo digital da placa. Através destes é possı́vel executar todas as operações definidas
pela GUI, desde efetuar as medições com o ADC e/ou voltı́metro das HVs/LVs, como fornecer a HV
externa a uma saı́da especı́fica, que apenas será utilizada na interface da placa HV Cable. A comunicação
com o expansor foi facilitada devido à existência da classe desenvolvida pelo colega de equipa do LIP
Filipe Cuim. Esta foi adaptada de um módulo RPiMCP23S17 fornecido pelo fabricante que é um open
source.
A comunicação com o MCP23S17 começa com a transição do CS de 1 para 0 e, seguida do envio
de 3 bytes. O primeiro byte, denominado byte de controlo, tem os primeiros 4 bits fixos, os próximos
3 são os do endereço de hardware do expansor, A2 a A0, e o último define o comando como sendo de
escrita ou leitura, sendo que ’0’ corresponde a uma operação de escrita, enquanto ’1’ corresponde a uma
operação de leitura. O segundo byte corresponde ao registo de endereço, que dependente da tarefa a
executar. A Figura 3.27 representa a estrutura dos dois primeiros bytes. O último byte corresponde aos
valores que são para escrever no endereço indicado. Caso seja uma operação de leitura, este byte não é
importante para a comunicação, pois a intenção é receber os dados do dispositivo. Após o envio destes 3
bytes é que o CS é alterado para 1, no caso de leitura a alteração é após a receção dos dados provenientes
do dispositivo.

Figura 3.27: Endereço dos registos SPI do expansor , [30].

A classe MCP23S17 V3 utilizada é dependente das bibliotecas SpiDev e RPi.GPIO, pois é necessário
fornece-las à classe para definir-se o protocolo e os pinos de comunicação. Para trabalhar com esta classe
é necessário definir alguns parâmetros, como definir a fase e a polaridade do protocolo SPI. Estes passos
são executados com as duas funções da classe MCP23S17 V3, MCP23S17(self.spi var, 0b000, -1, 13,
self.GPIO), que chama a função init () que é o construtor da classe, e configureMCP(). O construtor

49
recebe o objeto spidev(), o endereço hardware do expansor em binário, o pino do sinal reset, o pino do
sinal CS e por fim o objeto GPIO. Este coloca todas as linhas a zero e define a CPOL e a CPHA a 0,
assim, o sinal de relógio começa no estado 0 e a transferência de bits é efetuada na transição de 0 para 1.
A função configure() define todos os pinos como saı́das.
A tabela 3.1 tem a descrição dos pinos dos dois expansores da HV Test PT1. Omitiu-se a referência
dos pinos do expansor da HV Test PT2 porque já foram indicados na Tabela 2.1.
Após inicializar e configurar a classe esta pode ser utilizada. Apenas serão utilizadas duas funções,
a writeGPIO(data) e a digitalwrite(pin, level). A função writeGPIO(data) define os valores a colocar
nos 16 portos de saı́da do expansor. O parâmetro data é um inteiro de 16 bits onde cada um corresponde
a uma saı́da, como medida de segurança testa-se este de modo a verificar que não tem mais do que os
16 bits. A função digitalwrite(pin, level) define o valor a colocar numa determinada saı́da. O parâmetro
pin corresponde ao ı́ndice da saı́da, e o parâmetro level corresponde ao estado em que se quer colocar a
saı́da. Como segurança, esta função testa se o parâmetro pin corresponde aos GPIOs pré-definidos e se
o parâmetro level é um 0 ou um 1. Ambas as funções não retornam nenhum parâmetro.

Expansor 1 Endereço de hardware: 000


Nº do Pino Nome do pino Nome da linha Descrição
21 GPA0 DMUX A0 Sinal de referência dos DMUX de HV A0
22 GPA1 DMUX A1 Sinal de referência dos DMUX de HV A1
23 GPA2 DMUX A2 Sinal de referência dos DMUX de HV A2
24 GPA3 DMUX A3 Sinal de referência dos DMUX de HV A3
25 GPA4 EN DMUX HV1 1 Sinal de ativação do DMUX1 da HV1
26 GPA5 EN DMUX HV1 2 Sinal de ativação do DMUX2 da HV1
27 GPA6 EN DMUX HV1 3 Sinal de ativação do DMUX3 da HV1
28 GPA7 EN DMUX HV2 1 Sinal de ativação do DMUX1 da HV2
1 GPB0 EN DMUX HV2 2 Sinal de ativação do DMUX2 da HV2
2 GPB1 EN DMUX HV2 3 Sinal de ativação do DMUX3 da HV2
3 GPB2 EN ADC 1 Sinal de ativação do ADC1
4 GPB3 EN ADC 2 Sinal de ativação do ADC2
5 GPB4 EN ADC 3 Sinal de ativação do ADC3
6 GPB5 HVR COM1 Sinal de ativação do relé de segurança nº1
7 GPB6 HVR COM2 Sinal de ativação do relé de segurança nº2
8 GPB7 Switch V RD Sinal de ativação do relé HV IN

Expansor 2 Endereço de hardware: 111


Nº do Pino Nome do pino Nome da linha Descrição
21 GPA0 Switch LV1 Sinal de ativação do relé da LV1
22 GPA1 Switch LV2 Sinal de ativação do relé da LV2
23 GPA2 Switch LV3 Sinal de ativação do relé da LV3
24 GPA3 Switch LV4 Sinal de ativação do relé da LV4
25 GPA4 EN ADC LV Sinal de ativação do ADC das LV
26 GPA5 Read Relay Sinal de ativação do relé do Volt
27 GPA6 EN MUX OUT Sinal de ativação do Mux de saı́da
28 GPA7 MOUT 0 Sinal de referência do MUX de saı́da A0
1 GPB0 MOUT 1 Sinal de referência do MUX de saı́da A1
2 GPB1 MOUT 2 Sinal de referência do MUX de saı́da A2
3-8 GPB2-GPB7 N/C Não conectado

Tabela 3.1: Sinais dos portos de saı́das dos expansores HV Test PT1.

50
Os DMUXs serão controlados digitalmente, sendo que o controlo destes é relativamente simples.
Apenas é necessário ativar o sinal de ativação e determinar a saı́da que se pretende selecionar a partir
dos 4 sinais de referência. De relembrar que o sinal de ativação dos DMUXs é ativado a 0. Quanto ao
DMUX de controlo é necessário definir o sinal de entrada que será variável consoante a ativação dos
DMUXs ou a ativação dos relés. O MUX de saı́da da HV Test PT1 tem um funcionamento análogo ao
do DMUX, é necessário definir o sinal de ativação, o sinal de saı́da e para definir a entrada é necessário
definir os sinais de referência.

3.3.2 ADCs
Os ADCs utilizados têm uma interface de comunicação série sendo os sinais de ativação um dos
sinais dos portos de saı́da do expansor. Todos eles partilham do mesmo principio de funcionamento,
diferindo em algumas caracterı́sticas que serão discutidas de seguida. Os ADCs MCP3201, o MAX1240
e o TLV2541 têm apenas 3 sinais de comunicação série, o CS, o SCLK e o MISO. Estes não necessitam
de receber nenhuma configuração para funcionar. A comunicação SPI destes encontra-se indicada na
Figura 3.28. A comunicação começa com a colocação do CS a zero, de seguida é enviado um sinal
de relógio e a cada transição de 0 para 1 o ADC efetua uma leitura de um bit, e na transição seguinte,
de 1 para 0, este envia o valor do bit. No final são enviados (para a placa RaspberryPi) dois bytes de
informação. Cada ADC tem a sua própria configuração do protocolo SPI, pelo que é necessário definir
a CPOL e a CPHA. Como os ADCs são de 12 bits é necessário selecionar quais os bits relevantes da
leitura. No caso da Figura 3.28, relativa ao ADC MCP3201, os bits de interesse são os últimos 5 bits do
primeiro byte e os primeiros 7 bits do segundo byte, sendo que o bit mais significativo é o quarto bit do
primeiro byte e o bit menos significativo o penúltimo bit do segundo byte. A polaridade e a fase são ’0’
para este ADC.

Figura 3.28: Comunicação SPI entre o ADC MCP3201 e o RaspberryPi, CPOL=’0’ e CPHA=’0’, [31].

A classe do ADC MAX1240 já tinha sido criada pela Equipa do Lip pelo que não foi necessário criar
uma nova. A única diferença, a nı́vel do princı́pio de operação em relação à classe MCP3201, diz respeito
aos bits de interesse dos dois bytes recebidos. O primeiro byte tem os últimos sete bits correspondentes
à leitura e o segundo byte tem os restantes 5 bits seguidos de 3 bits a zero. O MAX1240 opera com
os parâmetros CPOL e CPHA a ’0’. O TLV2541 difere um pouco no princı́pio de funcionamento, para
funcionar corretamente, necessita de receber um sinal de SCLK antes de se transitar o CS de ’1’ para
’0’ e de seguida efetua-se o mesmo processo que no MCP3201. Após o CS mudar de ’0’ para ’1’ é

51
necessário enviar um sinal de SCLK. Este conversor necessita de ter a polaridade a ’1’ e a fase a ’0’. Os
bits de interesse, são os 8 bits do primeiro byte e os primeiros 4 bits do segundo byte.
O ADS7229, ao contrário dos outros, tem 4 sinais de comunicação, o CS, o SCLK, o MOSI e
o MISO. Este necessita de receber informações do controlador, pois tem vários modos de aquisição.
Necessita de receber um comando de dois bytes de inicialização e outro de leitura. O comando enviado
ao ADC é composto por duas partes, a primeira, composta pelos quatro primeiros bits, corresponde à
função que o ADC irá executar, para o trabalho realizado apenas se utilizam duas, o Write CFR, utilizada
na inicialização, e a Read data, utilizada nas leituras. A segunda parte do comando corresponde aos
outros 12 bits, que apenas são relevantes na inicialização para definir os parâmetros desejados. Na
leitura estes 12 bits são ignorados pelo que se colocaram todos a ’0’. O processo de leitura é análogo ao
dos ADCs MCP3201 e MAX1240, onde apenas se envia o comando de leitura à medida que se recebe
os dados da aquisição. Na Figura 3.29 encontra-se esquematizada a comunicação SPI, e é de notar que
a transmissão de dados do ADC acaba primeiro que a receção porque este ADC é de 12 bits, ou seja, os
últimos 4 bits não interessam para a leitura. Assim, os bits de interesse são os 8 bits do primeiro byte e
os primeiros 4 bits do segundo byte. Este conversor precisa de ter a polaridade a ’0’ e a fase a ’1’.

Figura 3.29: Comunicação SPI entre o ADC TLV2541 e o RaspberryPi, CPOL=’0’ e CPHA=’1’, [32].

Todas as classes criadas para cada ADC têm a mesma estrutura, são compostas por 3 funções, a
init , a readVoltage e a setupSPI. A função init , corresponde ao construtor da programação ori-
entada a objetos e inicializa todos os parâmetros necessários, tais como os sinais dos portos de saı́da
do expansor, a biblioteca SpiDev, etc. A função setupSPI define o modo da comunicação, ou seja,
o CPOL e o CPHA e deve ser chamada quando se efetua a comunicação com o ADC. A função read-
Voltage executa a comunicação entre o RaspberryPi e o ADC, ou seja, altera o CS, chama o comando
spi var.x f er2([0, 0]), processa os dados recebidos e por fim retorna o valor convertido.

3.3.3 Leitura das Tensões


Após a criação de todas as classes associadas aos componentes utilizados no processo de leitura das
tensões HV e LV, é necessário criar uma classe que execute todos os comandos. Esta classe chama-se
Reading code para o PT1 da HV Test e Reading code2 para o PT2. As classes são análogas, mas a pri-
meira versão tem um pouco mais de complexidade devido à existência de mais componentes no processo.
Primeiro mostra-se em detalhe a Reading code e depois explicar-se-ão as diferença na implementação
da classe Reading code2.
A classe Reading code é composta por 4 funções: init , reading func, HV IN e setupSPI. A
função init recebe como parâmetros a biblioteca SpiDev, dois objetos da classe expansores e a bibli-
oteca RPi.GPIO, estes todos foram inicializados na classe interface. Nesta função criaram-se os objetos

52
dos vários ADCs, chamando-se os construtores de cada classe. Armazenaram-se os 4 objetos dos ADCs
num dicionário de modo a facilitar o seu acesso. Analogamente às classes dos ADC existe a função
setupSPI, onde se define o modo da comunicação SPI, que deve ser utilizada antes de se chamar um
comando para o expansor. A função principal desta classe é a reading func, que irá analisar todos os
parâmetros que o utilizador definiu e irá executar o comando de modo a corresponder às escolhas do
utilizador, que foram detalhadas no subcapı́tulo 3.2.2. Esta função irá receber 6 parâmetros: board,
channel, lv, type read, auto, list adc. Os parâmetros board e channel correspondem à placa e ao canal,
respetivamente, sendo que a variável placa pode tomar 2 números, 1 ou 2, e o canal está compreendido
entre 0 e 47. A variável lv define o tipo de leitura de LV ou HV que é para realizar, podendo tomar
valores de -1 a 3 consoante a tensão a ser monitorizada. A correspondência entre a variável e a tensão é
a indicada na tabela 3.2.
Tabela 3.2: Correspondência dos valores da variável lv e os valores de tensão.

lv -1 0 1 2 3
Tensão(V) HV -12 12 24 3.3

A variável type read corresponde ao modo de leitura. Um valor 0 representa uma leitura simultânea
com ADC e voltı́metro, o valor 1 corresponde à leitura com recurso ao ADC e o valor 2 corresponde
à leitura com o voltı́metro. A variável auto representa a seleção do ADC para efetuar a monitorização.
Caso seja escolhido o modo automático esta variável fica com o valor True, caso a seleção seja definida
pelo utilizador esta variável fica com o valor False, caso a leitura seja apenas com o recurso ao voltı́metro
esta variável é ignorada. A variável list adc corresponde aos ADCs selecionados pelo utilizador e um
dicionário com os valores de 0 a 2, e associado a cada chave são associados os valores booleanos,
True ou False. Na tabela 3.3 encontra-se a correspondência das chaves do dicionário com os ADCs.
Analogamente à variável auto, esta é ignorada caso a leitura seja apenas com o recurso ao voltı́metro
e/ou caso a variável auto tendo o valor True.
Tabela 3.3: Correspondência das chaves do dicionário list adc e os ADCs, PT1.

list adc 0 1 2
ADC MAX1240 TLV2541 MCP2301

3.3.4 Controlo Digital


Todo o controlo digital da placa é realizado pelos sinais dos portos de saı́da dos dois expansores.
Desta forma é necessário processar toda a informação recebida em 4 bytes, 2 de cada expansor. Para
isso definiram-se várias variáveis a ser utilizadas consoante o nome do sinal listado na tabela 3.1 e a sua
função. Por exemplo, criou-se a variável DMUX A que corresponde aos sinais de entrada de seleção dos
DMUXs de HV. Para codificar estes consoante o canal a selecionar utilizou-se a seguinte equação:

DMUX A = 15 − channel%16

se o número associado ao canal pelo 0, o resultado será 15 que corresponde ao número binário 0b1111.
À medida que se aumenta o canal o valor da variável desce até o valor 0 que corresponde à primeira saı́da
do DMUX de HV, Figura 2.11. O cálculo do resto por 16 permite efetuar a codificação até ao canal 47 e
é oportuno relembrar que a identificação das saı́das de HV estão numeradas de 1 a 48 para o utilizador,
mas no código estão de 0 a 47.

53
Para selecionar qual o DMUX a utilizar criou-se a variável EN DMUX, definida pela equação:

EN DMUX = 63 − 2 ∗ ∗((board − 1) ∗ 3 + ((channel)//16))

O valor 63 corresponde ao número binário 0b111111 fazendo com que os 6 DMUX se encontrem de-
finidos. Para ativar um deles é necessário colocar a zero um dos bits e o cálculo do valor associado ao
bit concreto é efetuado pela segunda parte da equação onde se tem em consideração a placa e o canal,
multiplica-se por 3 o parâmetro placa, pois existem 3 DMUXs associados a uma placa, de seguida é
efetuado ao canal a divisão inteira por 16 para adicionar uma unidade por cada 16 canais. Apenas um
DMUX se encontra ativo à vez, logo colocou-se 2 elevado ao resultado de modo a se ter transições de bit
a bit.
Os sinais de ativação dos ADCs apenas são ativados no momento da medição, pelo que por omissão
estes devem estar a ’1’. Para garantir que é isso que se passa, criou-se a variável EN ADC e no estado
inicial igualou-se a 7, que corresponde ao número 0b111.
A variável HVR COM, que representa os relés COMX, é igualada ao parâmetro board, com o valor
binário 0b01 caso seja à placa 1, ativando-se o relé associado ao sinal COM1, e caso seja a segunda
placa o valor em binário é 0b10, ativando-se o relé associado ao sinal COM2. O relé para ativar a tensão
de entrada externa está sempre a ’0’ na aquisição de medições, switch V RD = 0 e apenas se utiliza
se a placa estiver a ser utilizada no teste dos cabos em conjunto com a placa HV Cable. A variável
SWITCH LV corresponde à ativação do relé associado à monitorização das LVs. Desta forma, quando se
adquire HV esta variável é nula e quando se adquire LV esta variável é igual a 2 elevado ao número do
parâmetro lv:
SW ITCH LV = 2 ∗ ∗lv

Analogamente ao sinal de ativação dos ADCs de HV, também se coloca sempre o sinal de ativação do
ADC de LV a ’1’. O sinal de saı́da do MUX está sempre ativado, EN MUX = 0. Por fim codifica-se a
entrada do MUX pelos sinais de referência. Ligam-se por ordem os ADCs às entradas, de modo a ser só
igualar o ı́ndice do dicionário à variável dos sinais de referência do MUX.
Para selecionar qual o ADC a utilizar implementou-se uma máquina de estados, que analisa os
parâmetros type read, auto, list adc e tem em consideração o tipo de leitura que se realiza, ou seja,
o valor da variável lv, Tabela 3.2. Apenas é necessário utilizam a máquina de estados no modo de leitura
sequencial ou ADC. Caso se tenha selecionado o modo ADC em automático, o MAX1240 adquire da-
dos da placa HV Remote 1, o TLV2541 adquire dados dos primeiros 24 canais da placa 2 e o MCP3201
adquire os outros 24 canais da placa 2. Caso seja selecionado o modo manual verifica-se o número de
ADCs selecionados na variável list adc. No caso de haver apenas um selecionado, todas as leituras de
HV serão realizadas por este, caso sejam dois selecionados define-se um para a placa 1 e outro para a
placa 2 e caso sejam 3 acontece a mesma distribuição que no modo automático.
Toda a informação referida é implementada na variável GPIOWX, que terá 16 bits, correspondendo
aos valores que se pretendem inserir nos portos de saı́da dos expansores. Na construção destas variáveis
utilizaram-se dois operadores: o operador de deslocamento de bits, << e o operador OU para bits, |.
O operador de deslocamento de bits irá adicionar à variável que se encontra à esquerda do operador o
número, em zeros, que se encontra à direita do mesmo. Por exemplo, na equação seguinte, 0b1101 <<
2 = 0b110100, o operador adicionou dois ’0’ à direita do número. Com estes dois modelaram-se as
variáveis descritas de modo a ter-se no fim a variável de 16 bits desejada a enviar para o expansor. Na
Figura 3.30 estão as duas variáveis para enviar a cada expansor, respetivamente.
Para efetuar a leitura chama-se a função readVoltage. Esta está presente em todas as classes dos

54
diferentes ADCs, pelo que apenas é necessário escolher qual o ADC que fará a leitura. Por fim, após se
efetuar todo o processamento e respetiva leitura, a função retorna o resultado da medição do ADC. Caso
o modo de leitura seja apenas com o voltı́metro, a função retorna um resultado nulo.

Figura 3.30: Configuração das duas variáveis com o conteúdo a enviar aos expansores. A variável GPIOW1 envia-se ao
expansor 1 e a variável GPIOW2 envia-se ao expansor 2.

Adicionaram-se algumas regras ao código de modo a tentar minimizar erros na utilização da GUI ou
nas leituras das tensões. A primeira foi enviar um alerta caso o parâmetro board ou channel estiver fora
do intervalo especificado. A segunda é efetuar, antes de selecionar uma das leituras desejadas, uma leitura
de modo a verificar se todos os relés associados à leitura das HVs estão efetivamente desconectados das
entradas de HV da placa, ou seja, que a tensão lida nos sinais COM1 e COM2 é nula. Caso se detete uma
leitura não nula, é enviado uma mensagem e o processo de leitura é interrompido. Esta funcionalidade
é muito importante a fim de se evitar a junção de duas saı́das de tensão, pois caso acontecesse poderia
danificar a placa. A terceira é que apenas é permitido a leitura de um valor de tensão, HV ou LV.
Criou-se outra classe, Reading code2, para o segundo protótipo da placa HV Test. Esta é muito
idêntica à explicada anteriormente, terá as mesmas 4 funções: init , reading func, HV IN e setupSPI.
A função init define os parâmetros da biblioteca SpiDev e RPi.GPIO, apenas configura um expansor
e inicializa a classe do ADC MCP3201. Analogamente às outras classes esta tem uma função setupSPI
para efetuar a comunicação. Como este protótipo só tem um ADC todos os parâmetros que estavam rela-
cionados com a escolha de leituras entre vários ADCs desaparecem e assim a função reading func irá re-
ceber menos parâmetros,. Sendo assim recebem-se os parâmetros, board, channel, lv e type read, ou seja,
qual a placa e o canal a monitorizar, se é uma leitura de HV ou LV e se é para fazer uma monitorização
com recurso exclusivo ao ADC ou ao voltı́metro ou aos dois. Criaram-se as várias variáveis que re-
presentam os sinais dos portos de saı́da do expansor que se podem ver no esquemático da Figura 2.9.
Definiu-se a variável DMUX A que, como na classe Reading code, corresponde à codificação do canal
nos DMUXs de LV. A variável CDMUX A corresponde à codificação dos sinais de entrada de seleção
do DMUX de controlo, sendo igual à segunda parte da equação da variável EN DMUX:

CDMUX A = (board − 1) ∗ 3 + ((channel)//16)

Esta acrescenta uma unidade por cada 16 canais. A variável INP DMUX corresponde ao sinal de en-
trada do DMUX de controlo e tem o valor ’0’ quando se querem ativar os DMUX de HV e o valor ’1’
quando se quer ativar os relés de LV. As Figuras 2.15 e 2.8 têm os diagramas do segundo protótipo
da placa HV Test que ajudam na análise das variáveis a ativar do código. As variáveis EN DMUX
e EN ADC correspondem ao sinal de ativação do DMUX de controlo e do ADC, respetivamente. A
variável HVR COM, que representa os relés COMX, é igualada ao parâmetro board, como na classe
Reading code. A variável Switch HVLV corresponde à ativação do relé que seleciona a leitura de HV
ou LV. Caso seja HV, a variável é igualada a ’0’ e caso seja LV a variável é igualada a ’1’. A variável
Switch Volt é igualada a ’0’ e apenas é ativada (colocada a 1) quando se quer efetuar uma leitura com
o voltı́metro. Por fim, a variável Switch HVIN é definida a zero, pois apenas a tem o valor 1 na função
HV IN. Analogamente à classe Reading code agruparam-se todas as variáveis descritas numa variável
para enviar para o expansor.
A função HV IN foi implementada com o propósito de utilizar esta carta, juntamente com a carta

55
HV Cable, no teste dos cabos de 100 m que irão distribuir as HVs aos PMTs do TileCal que estão
localizados na Caverna da experiência ATLAS. Com esta funcionalidade a HV é um sinal de entrada que
é distribuı́do aos diferentes cabos em teste que são conetados aos conetores DB25, que neste contexto são
conetores de saı́da. O processo é semelhante, embora o sentido seja o inverso, sendo selecionado o cabo
que incide a HV e que estará a ser testado. Esta irá acionar o relé HV IN, e irá codificar os expansores
para definir qual a saı́da a ativar. A função recebe dois parâmetros, board e channel, que correspondem
à placa e ao canal, respetivamente. Analogamente à função reading func, codificaram-se os DMUX pelo
mesmo raciocı́nio, criando variáveis que correspondem aos sinais de ativação, aos sinais de codificação,
etc. Todo o controlo encontra-se no primeiro expansor para a ativação do caminho da HV externa, e por
isso inativaram-se todas as funcionalidades do segundo expansor. Esta função tem como segurança a
verificação dos parâmetros recebidos e caso os valores estejam fora do intervalo de interesse, a função
não é implementada.
A partir do código implementado é possı́vel comunicar em pleno com ambos os protótipos da placa
HV Test. Infelizmente, devido à falta de componentes no mercado, os protótipos da placa não ficaram
acabados a tempo de se poder testar, por isso, não se conseguiu testar a totalidade do código. Para a parte
da interface desenvolveu-se, primeiramente, o código compatı́vel com um PC, e após desenvolvida a
maioria deste adaptou-se este ao Raspberry pi. As maiores alterações são ao nı́vel das bibliotecas utiliza-
das pelo Raspberry pi, como a biblioteca RPi.GPIO e a SpiDev que não são compatı́veis com as dos PCs.
Desta forma, as classes Reading code e Reading code2 e todas as que estão dependentes delas, apenas
funcionam no Raspberry pi. Quanto aos testes das classes Reading code e Reading code2 implementou-
se um circuito de teste no laboratório que irá replicar o circuito que estará presente nas placas HV Test,
com um expansor e dois expansores e vários LEDs de modo validar o código implementado.

56
Capı́tulo 4

Desempenho nos Testes do Sistema


Remoto de Distribuição das Altas Tensões
no Módulo do Teste com Feixe de
partı́culas no CERN

Neste capı́tulo irá abordar-se o desempenho nos testes realizados ao sistema remoto de distribuição
de HV, quer no Laboratório de Instrumentação e Fı́sica Experimental de Partı́culas (LIP), quer no módulo
de teste com Feixe de partı́culas (Test Beam) no CERN.
Como a Crate ainda não está estava testada, foi necessário desenvolver uma carta de Interface, Figura
4.1, para substituir a carta midplane, referida na Figura 1.9. Esta fornece as baixas tensões primárias à HV
Supplies, conecta as HVs primárias e LVs da HV Supplies para a HV Remote e os sinais de comunicação
para as duas cartas. Esta placa ainda tem um conetor para cada baixa tensão primária para a possibilidade
de corte destas para a HV Supplies. Nesta fase ainda se utiliza a carta de controlo digital Raspberry Pi
ao invés da carta FPGA Develoment Board.

Figura 4.1: Fotografia da carta de Interface.

Para estes testes, foram utilizadas duas cartas da segunda versão da HV Remote, duas cartas da HV
Supplies e duas cartas de Interface. Neste capı́tulo serão analisados os seguintes testes:
• Teste de calibração e testes de carga no LIP;

57
• Testes de estabilidade no módulo de teste com feixe de partı́culas no CERN.

Os testes sequenciais e calibração serão analisados brevemente, visto que este foi realizado em deta-
lhe no âmbito de outra dissertação, [29].
Todos os valores de alta tensão são negativos, de modo a simplificar os cálculos e a não sobrecarregar
a exposição dos mesmos. Utiliza-se aqui no módulo de tensão.

4.1 Teste de Calibração e Testes de Carga no LIP


Antes de enviar a carta HV Remote, e as respetivas cartas HV Supplies e Interface, para o módulo
do teste com feixe de partı́culas no CERN, é necessário calibrar cada saı́da de HV. Esta calibração
é realizada com recurso ao sistema de regulação e monitorização de cada saı́da e com um voltı́metro
externo ligado à saı́da e a uma carga ativa. A calibração consiste em colocar várias tensões diferentes
para cada canal na interface utilizador e para cada uma delas monitorizar, por um determinado intervalo
de tempo, os valores de tensão de saı́da do respetivo canal. A seguir, com os valores medidos para cada
canal, efetuam-se regressões lineares para fazer corresponder o valor a definir para o DAC com o medido
pelo ADC e com o valor obtido pelo voltı́metro.
As saı́das de HV têm uma resposta diferente consoante o tipo de carga que se encontra ligada a cada
saı́da. Foram efetuados vários testes de modo a analisar quais os diferentes tipos de resposta. O teste
consiste no envio de uma tensão e na leitura com um osciloscópio do sinal de saı́da do respetivo canal.
Quando monitorizado sem carga, ou seja, liga-se apenas a ponta do osciloscópio diretamente à saı́da,
observam-se flutuações na ordem dos 30 V. Testou-se para várias saı́das e os resultados foram sempre
análogos. Estes valores podem ser tão elevados devido à ponta do osciloscópio, cuja atenuação é de
100x e à inexistência de filtro RC adequado. Num dos ensaios do teste com feixe, haviam saı́das que
não tinham PMTs ligados e observaram-se flutuações na ordem dos 10 V, o que faz apontar a causa da
oscilação para a falta de filtro RC adequado.
Com carga passiva, ligaram-se 5 resistências de 1 MΩ em série à saı́da de HV de cada canal, onde
se ligou a ponta do osciloscópio à última transição entre a quarta e quinta resistência. Desta forma já se
pode utilizar a ponta do osciloscópio de ganho 10x. Observaram-se flutuações de 14 a 18 V, na maioria
dos canais. Notou-se que quanto maior a resistência de carga aplicada, menor a amplitude das flutuações.
Com carga ativa, liga-se um circuito integrado composto por resistências, condensadores, transı́stores
e dı́odos (circuito idêntico ao que estará instalado no TileCal). Observaram-se, no máximo, flutuações
na ordem dos 0,9 V. Este máximo apenas é atingido quando o sinal de SCLK está ativo, gerando ruı́do
na HV. Quando este não está ativo as flutuações são da ordem dos 0.3V. Ligou-se um PMT ao circuito
de carga ativa e os resultados observados são análogos aos observados com o circuito de carga ativa sem
PMTs. Por fim colocou-se um LED a piscar em frente ao PMT. Observou-se que por cada flash a tensão
desce 1 a 2 V e volta ao seu valor inicial. Esta variação deve-se ao PMT gerar um pulso de resposta.
Desta forma efetuou-se a calibração com carga ativa de modo a replicar as condições que estarão no
módulo de teste com feixe no CERN.
As tensões são escolhidas na Interface utilizador da HV Remote, através do número de contagens que
se enviam para os DACs. Para a calibração foram escolhidos 2500 e 3000 contagens como os valores de
referência. Cada canal teve um tempo de monitorização de 15 minutos, escolheu-se este tempo pois sabe-
se de testes realizados previamente que o sistema se encontra estavel rápidamente e permanece estavel
durante várias horas, sendo que 15 min demonstram essa estabilidade. Configurou-se a HV Supplies para
produzir uma HV primária de -800 V. Como a HV Supplies tem um desvio de 20 V, na realidade, a HV

58
Remote recebe como HV primária -780 V em vez dos -800 V. Obtiveram-se fatores de calibração muito
idênticos para todos os canais, para os DACs na ordem dos 0,24 V/contagem e para os ADCs na ordem
dos 0,25 V/contagem. Quanto aos desvios, oscilaram um pouco mediante o canal. Durante os testes
descobriu-se que a saı́da 28, que corresponde ao PMT 32, não tem o circuito de regulação a funcionar,
provocando uma tensão fixa à saı́da de -420 V.
Para comprovar que não se adicionam erros ao efetuar as regressões apenas com dois pontos, efetuou-
se um teste a dois canais aleatórios para aplicar uma regressão de 5 pontos e comparar os dados obtidos.
Assim adicionaram-se os pontos correspondentes a 2250, 2750 e 3250 contagens. Após a realização
da monitorização de todas as tensões, efetuaram-se as regressões lineares e após comparar os valores
obtidos, tanto do fator de calibração como do desvio, verificou-se que o desvio é na ordem do quarto
algarismo significativo, ou seja, apenas provoca um desvio máximo de 0,1 V quando se coloca a tensão
máxima na saı́da, -950 V, o que é desprezável. Assim concluiu-se que a calibração pode ser realizada
apenas recorrendo a 2 tensões. A análise destes testes encontra-se mais aprofundada noutra dissertação,
[29].

4.2 Testes de Estabilidade nos Testes com Feixe no CERN


A carta HV Remote, e as respetivas cartas HV Supplies e Interface, foram testadas num módulo
do TileCal nos teste com feixe no CERN. Neste teste utilizaram-se 2 módulos de TileCal equipados
com eletrónica original e um módulo central equipado com 45 PMTs e eletrónica atualizada para o HL-
LHC. Na Figura 4.2 mostram-se os módulos nos testes com feixe. Os PMTs do módulo central foram
conectados à HV Remote através dos cabos de HV. Os PMTs foram depois calibrados através de uma
fonte de 137 Cs que atravessa todas as telhas cintilantes de cada célula, para definir qual a tensão necessária
para cada PMT. Após a calibração, os módulos são expostos a feixes de partı́culas de diferentes e analisa-
se a resposta dos mesmos.

Figura 4.2: Montagem experimental dos testes com feixe no CERN. Sobre a plataforma da mesa móvel estão 3 módulos do
TileCal, sendo os dois mais longos do barril central e o mais curto, que está em cima à direita, do barril extendido.

Após estabelecer-se a comunicação entre o DCS e o sistema de controlo digital da HV Remote e da

59
HV Supplies é possı́vel começar o teste de feixe. O primeiro teste teve uma duração de 7 horas. Após uma
análise descobriu-se que 2 saı́das apresentaram flutuações na ordem dos 10 V, o que não era esperado.
Após completado o teste, abriu-se o módulo e descobriu-se que estes PMTs não se encontravam ligados.
As saı́das que correspondem aos PMTs 41/42/43/44 apresentaram um desvio de 5 V, devido a um erro
de calibração no laboratório. De resto, as outras saı́das apresentaram o comportamento esperado.
Após corrigidos os erros referidos, efetuaram-se 2 testes, cada um com uma duração de 2h30, onde
se efetuou uma paragem entre eles para efetuar uma reinicialização ao sistema. Os resultados mostraram
na, generalidade, variações de 0,75 V a 1 V, com exceção da primeira leitura onde a HV se encontrava
ainda a aumentar antes de estabilizar no valor final, podendo ver-se um exemplo na Figura 4.3 (a) conr-
respondendo ao PMT 7. Na Figura 4.3 (b) encontram-se os dados obtidos pela leitura dos valores do
ADC da saı́da que corresponde ao PMT 38. Neste caso optou-se por retirar o primeiro valor para visua-
lizar melhor a distribuição dos dados. Verifica-se uma distribuição de bandas em todos as saı́das, com a
distância entre bandas a corresponder à redução do circuito de monitorização.

(a) PMT 7 com um valor médio de 672,7 V. (b) PMT 38 com um valor médio de 723,6 V.

Figura 4.3: Valores de tensão obtidos pelo ADC do primeiro teste de 2h30.

Na análise estatı́stica seguinte decidiu-se retirar a primeira medição, para todas as saı́das, visto o
sistema ainda estar a estabilizar quando a primeira medição. Na Figura 4.4 encontra-se o desvio máximo
de todas as saı́das, e na Figura 4.5 encontra-se o desvio padrão de todas as saı́das. Na generalidade,
verificou-se que todas apresentam um desvio máximo de 0,75 V a 1 V, e um desvio padrão entre 0,15 V
e 0,20 V.

Figura 4.4: Desvio máximo entre medições para todas as 48 tensões de saı́da.

A saı́da 32 apresenta um desvio máximo muito superior a todas as outras, isto deve-se a esta não ter o
seu circuito de regulação a funcionar e, assim, coloca apenas 420 V à saı́da. Este valor, não é controlado
pelo circuito de regulação, mas sim, pelos dı́odos de zenner, indicados na figura 1.15, assim apresentam

60
Figura 4.5: Desvio padrão das medições em função de todas as saı́das.

oscilações bem superiores a todos os outros canais. Esta saı́da parece influenciar um pouco a saı́da 33,
pois este acaba por ter um desvio padrão um pouco maior que todas as outras.
Quando analisado o segundo teste, após a reinicialização do sistema, os valores são muito semelhan-
tes. As saı́das apresentam a mesma distribuição de bandas com oscilações na ordem dos 0,75 V e 1 V. Na
Figura 4.6 encontra-se o desvio máximo de todos os canais, e na Figura 4.7 encontra-se o desvio padrão
de todos os canais. Neste caso parece que o canal 32 tem uma maior influência no canal 33, pois o desvio
máximo aumentou para 1,25 V e o desvio padrão aumentou ligeiramente. Esta influência deverá ser alvo
de um estudo mais detalhado.

Figura 4.6: Desvio máximo entre medições para todas as 48 tensões de saı́da no segundo teste.

Figura 4.7: Desvio padrão das medições para todas as 48 tensões de saı́da no segundo teste.

Os valores obtidos para as saı́das, que estavam a funcionar nas condições expetáveis, estão de acordo
com os requisitos de estabilidade do sistema de distribuição de alta tensão que consistia numa incerteza
menor ou igual a 0,5 V.

61
Capı́tulo 5

Conclusões e Trabalho Futuro

A grande parte do trabalho proposto, foi realizado. Infelizmente, devido a problemas relacionados
com a Pandemia e à falta de componentes eletrónicos nos fornecedores, não foi possı́vel ter pronto para
testes o primeiro protótipo da carta HV Test. Apesar de não se ter efetuado ainda os testes funcionais
deste, avançou-se para um segundo protótipo. Este surgiu de modo a colmatar certos problemas que
surgiram no 1º protótipo. O primeiro foi a utilização de vários componentes, nos relés optou-se por
utilizar relés do tipo SMD para conseguir-se colocar estes em ambos os lados da carta, reduzindo assim,
a carta para cerca de metade do tamanho do 1º protótipo. Apenas se utilizou um ADC, ao contrário dos
4 utilizados na primeira versão. Assim simplificou-se o controlo digital, o que levou a uma redução do
número de componentes utilizados. Sendo assim não foi possı́vel testar a comunicação com os vários
componentes, relés e ADCs, bem como os testes do controlo digital da carta e a calibração dos vários
ADCs e dos circuitos de adaptação. Foram efetuados testes com cargas diferentes nas saı́das das HVs e
concluiu-se que é necessário utilizar um divisor de tensão do TileCal para se obter tensões estáveis.
Foi desenvolvida a interface gráfica de utilizador e a comunicação para as várias cartas HV Test.
Como o controlo digital foi alterado entre protótipos, teve-se de efetuar códigos distintos para cada um.
Apesar de não ter sido possı́vel ter as cartas para fazer os testes completos do software, foi feita uma
simulação de obtenção de dados para testar grande parte da interface.
Foram realizados vários testes ao sistema remoto de distribuição de HV, tanto testes com vários tipos
de cargas como teste em ambiente com feixe de partı́culas no CERN. Verificou-se que consoante o tipo
de carga a que os canais de HV estão ligadas a estabilidade do sinal é variável. Os valores oscilam
muito quando não existe carga, mas quando é aplicado um divisor ativo o sinal torna-se muito estável e
apresenta oscilações na ordem dos 0,5 V o que acaba por cumprir com os requisitos do CERN. Quando
analisado o teste de estabilidade no módulo de teste de feixe no CERN verificou-se que o sistema cumpriu
com os requisitos, mantendo as HVs estáveis como nos testes com divisor ativo, mas tendo os PMTs a
funcionar durante várias horas.
Para o futuro, após produção das cartas HV Test será necessário testar as classes desenvolvidas
para os novos ADCs que ainda não foram testados previamente. Caso existam no mercado todos os
componentes para o 1º protótipo, a sua produção e teste permitirá ainda otimizar o 2º protótipo. Caso
existam mudanças no controlo digital será necessário efetuar uma revisão no código implementado.

62
Bibliografia

[1] CERN Accelerating science. URL: https://home.cern/about/who-we-are/our-history.


[2] Expected performance of the ATLAS detector at the High-Luminosity
LHC. Rel. téc. All figures including auxiliary figures are available at
https://atlas.web.cern.ch/Atlas/GROUPS/PHYSICS/PUBNOTES/ATL-PHYS-PUB-2019-005.
Geneva: CERN, jan. de 2019. URL: https://cds.cern.ch/record/2655304.
[3] The ATLAS Collaboration et al. “The ATLAS Experiment at the CERN Large Hadron Collider”.
Em: Journal of Instrumentation 3.08 (ago. de 2008), S08003–S08003. DOI: 10 . 1088 / 1748 -
0221/3/08/s08003. URL: https://doi.org/10.1088/1748-0221/3/08/s08003.
[4] Large Hadron Collider. Jul. de 2021. URL: https : / / en . wikipedia . org / wiki / Large _
Hadron_Collider.
[5] ATLAS experiment. Jul. de 2021. URL: https : / / en . wikipedia . org / wiki / ATLAS _
experiment.
[6] J.G. Saraiva. “Calibration and performance of the tile calorimeter of ATLAS with cosmic ray
muons”. Em: (2010). URL: http://hdl.handle.net/10451/2454.
[7] Aaboud M et al. “Operation and performance of the ATLAS Tile Calorimeter in Run 1”. Em:
(2018). URL: https://link.springer.com/article/10.1140/epjc/s10052-018-6374-
z#citeas.
[8] A. Henriques. “The ATLAS tile calorimeter”. Em: 2015. URL: https://ieeexplore.ieee.
org/document/7465554.
[9] Jasmin Abdallah et al. The optical instrumentation of the ATLAS Tile Calorimeter. Jan. de 2013.
DOI : 10.1088/1748-0221/8/01/P01005.

[10] Upgraded Electronics of the ATLAS Hadronic Tile Calorimeter for the High Luminosity LHC.
URL : https://cds.cern.ch/record/2712379/plots.

[11] Fabrizio Scuri. “Upgrade of the ATLAS Tile Calorimeter for the High Luminosity LHC”. Em:
Journal of Physics: Conference Series 1162 (jan. de 2019), p. 012017. DOI: 10 . 1088 / 1742 -
6596/1162/1/012017.
[12] D. Calvet et al. “The High Voltage distribution system of the ATLAS Tile Calorimeter and its
performance during data taking”. Em: Journal of Instrumentation 13.08 (2018), P08006–P08006.
DOI : 10.1088/1748-0221/13/08/p08006.

[13] G. Evans e Equipa LIP. “HV Remote”. Em: (2020). documentação interna.
[14] R. Fernandez e Equipa LIP. “HV Supplies”. Em: (2020). documentação interna.
[15] R. Fernandez. “Low noise power supplies for the high voltage board of the TILECAL calorime-
ter”. Em: 2019. URL: http://hdl.handle.net/10451/40598.

63
[16] F. Cuim. “Functional tester for high voltage boards of the TILECAL calorimeter”. Em: 2019. URL:
http://hdl.handle.net/10451/41488.
[17] P. Rato. “Test system for the remote high voltage distribution system of the Tilecal”. Em: 2021.
[18] Reed Relay & Reed Switch. URL: https : / / www . electronics - notes . com / articles /
electronic_components/electrical- electronic- relay/what- is- a- reed- relay.
php.
[19] Photocouplers, Opto-couplers & Opto-isolators. URL: https://www.electronics- notes.
com / articles / electronic _ components / transistor / what - is - a - photocoupler -
optocoupler-optoisolator.php.
[20] Reed Relay Basics. URL: https : / / www . pickeringrelay . com / introduction - reed -
relay-basics-part-1/.
[21] Reed Relay. KT24-1A-40L-SMD. Standex Meder Eletronics. 2011.
[22] NPN Multi-Chip General-Purpose Amplifier. MMPQ2222A. FAIRCHILD. 2015.
[23] SPI. URL: https://www.fpgakey.com/wiki/details/13.
[24] Serial Peripheral Interface (SPI). URL: https://learn.sparkfun.com/tutorials/serial-
peripheral-interface-spi/all.
[25] Introduction to SPI Interface. URL: https : / / www . analog . com / en / analog - dialogue /
articles/introduction-to-spi-interface.html.
[26] SPI Tutorial. Mai. de 2017. URL: https://www.corelis.com/education/tutorials/spi-
tutorial/.
[27] Ryan Mckenzie. “Upgrade of ATLAS Hadronic Tile Calorimeter for the High Luminosity LHC”.
Em: The Ninth Annual Conference on Large Hadron Collider Physics - LHCP2021 (2021).
[28] Michael Heifets e Pavel Margulis. “Fully active voltage divider for PMT photo-detector”. Em:
2012 IEEE Nuclear Science Symposium and Medical Imaging Conference Record (NSS/MIC)
(2012), pp. 807–814.
[29] C. Pereira. “Performance of the TileCal High Voltage Upgrade System”. Em: 2022.
[30] Microchip Technology Inc. “MCP23S17, 16-Bit I/O Expander with Serial Interface”. Em: (2016).
URL : https://www.microchip.com/en-us/product/MCP23S17.

[31] Microchip Technology Inc. “MCP3201, 2.7V 12-Bit A/D Converter with SPI Serial Interface”.
Em: (2011). URL: https://www.microchip.com/en-us/product/MCP3201.
[32] Texas Instruments. “TLV2541, 2.7-V TO 5.5-V, LOW-POWER, 12-BIT, 140/200 KSPS, SE-
RIAL ANALOG-TO-DIGITAL CONVERTERS WITH AUTOPOWER DOWN”. Em: (2011).
URL : https://www.ti.com/product/TLV2541.

64
Apêndice A

Esquemáticos da HV Test

65
1 2 3 4
ADCREF1
COADC REF1
1 2 3.3V
3.3V PIADC REF101
IN OUT PIADC REF102
PIC0Ref01 COC0ADC1
C_ADC1
3 PIC0Ref01 2 COC0Ref01 COADC
ADC
PIC0Ref02 1 GND PIADC REF103 C_Ref_1 GND PIC0ADC102 PIC0ADC101

PIC0ADC01 COC0ADC01
PIC0ADC021
PIC0Ref02 REF3325AIDCKT 10V 1 8 C_ADC_1 COC0ADC02
C_ADC_2
COC0Ref02
PIADC01
VREF VCC PIADC08
NLSCLK 10V
C_Ref_2 4.7µ ADC IN PIADC02
2 7 SCLK PIC0ADC01 2 100n
+INPUT CLK PIADC07
NLADC0OUT PIC0ADC02 4.7µ
A 3 6 ADC_OUT A
PIADC03
-INPUT D PIADC06
NLEN0ADC
GND 4 5 EN_ADC
GND PIADC04
GND CS/SHUTDWN PIADC05

POEN0ADC GND
EN_ADC
MCP3201-CI/SN POSCLK
SCLK
POADC0OUT
ADC_OUT
COD0R0Volt
D_R_Volt GND
PID0R0Volt01 PID0R0Volt02

NLColetor0Volt
Coletor_Volt
24V PIC0 INV02
COC0P0INV02
C_P_INV_2 PIC0P INV01 2
COC0P0INV01
C_P_INV_1
2µ2 PIC0P INV01 COAMP0INV
AMP_INV
22n
A2
PIRL0Volt0A2
A1
PIRL0Volt0A1
3.3V
PIC0 INV021 7
PIAMP0INV07
+VS 1 RG
1
PIAMP0INV01
12 COM_ADC 8 GND
NLCom0HVLV
PIRL0Volt012
2 RG PIAMP0INV08

POCOM0HVLV Com_HVLV PIRL0Volt011


11 14
COM_HVLV PIRL0Volt014
3
CORL0Volt i HV_clear GND PIAMP0INV03
+ PIC0N V021
RL_Volt 6 ADC_HV
B Read final HV
COR0DT01
R_DT_1 2
PIAMP0INV06

COC0NP0INV02
C_NP_INV_2 B
Clearance Constraint [Clearance = 30mil]
PIR0DT0101 PIR0DT0102 PIAMP0INV02
- 2µ2 PIC0NP INV01 2 COC0NP0INV01
100M Ohms 1kV C_NP_INV_1
COBlack0j
Black_j CORed0j
Red_j PIR0DT20 PIC0N V02 PIC0NP0INV01 22n
1 1 COR0DT02
R_DT_2 5 4
GND PIBlack0j01 PIRed0j01

240k Ohms 1kVGND


PIAMP0INV05
REF -VS PIAMP0INV04
-3.3V
23.3200-21 23.3200-22 PIR0DT201 INA828ID

GND 3.3V

PIC0P INV0L 201


PIC0 NV0L 1
COD0R0ADC
D_R_ADC COC0P0INV0LV02
C_P_INV_LV_2 COC0P0INV0LV01
C_P_INV_LV_1
PID0R0ADC01 PID0R0ADC02 PIC0P INV0L 20 22n 2µ2
24V
PIC0 NV0L 12
NLColetor0adc
Coletor_adc Clearance Constraint [Clearance = 30mil]
HV_clear COAMP0LV
AMP_LV
COR0LV01
R_LV_1
A2 A1 i Read final LV 7 1
PIRL0ADC0A2 PIRL0ADC0A1
NLRead HV
finalHV
PIR0LV0101 PIR0LV0102 PIAMP0LV07
+VS 1 RG PIAMP0LV01
12 Read final 8 GND GND
NLCOM0ADC
PIRL0ADC012
NLRead LV
finalLV 2 RG PIAMP0LV08
COM_ADC 11
PIRL0ADC011
14
PIRL0ADC014
Read final 1M Ohm
C 3 C
i CORL0ADC
RL_ADC COADC0IN
ADC_IN
PIAMP0LV03
+ 6 ADC_LV PIC0N VL021
PIAMP0LV06
HV_clear 2 COC0NP0INV0LV02
C_NP_INV_LV_2
PIR0LV20 GND PIAMP0LV02
- 2µ2 PIC0NPINV0L 102
COC0NP0INV0LV01
C_NP_INV_LV_1
PIC0N VL02
1
2

Clearance Constraint [Clearance = 30mil] COR0LV02


R_LV_2 PIC0NPINV0L 10 22n

3.3V
2
MUXADC
COMUX
PIMUX ADC02
ADC
V+
PIADC0N1 PIADC0N2 PIR0LV201 110K
±1%
GND
5
PIAMP0LV05
REF -VS
4
PIAMP0LV04
-3.3V
Header 2 INA828ID

Switch_HVLV 1 GND
Switch_HVLV PIMUX ADC01
IN NLADC0HV
4
PIMUX ADC04
ADC_HV
ADCININ
NLADC 5
PIMUX ADC05
6
PIMUX ADC06
NLADC0LV
ADC_LV

3
GND PIMUX ADC03
GND
TS5A4624DCKR

COT0ADC0Select
T_ADC_Select
D Title D
NLSwitch0HVLV
Switch_HVLV
COR0ADC
R_ADC 1 6 Coletor_adc ADC
POSwitch0HVLV
Switch_HVLV PIR0ADC01 PIR0ADC02 PIT0ADC0Select01
B1 C1 PIT0ADC0Select06
10KOhm 2 5
NLSwitch0Volt GND COR0Volt
PIT0ADC0Select02
E2 E1 PIT0ADC0Select05
GND
POSwitch0Volt Switch_Volt R_Volt 3 4 Coletor_Volt Size Number Revision
Switch_Volt PIR0Volt01 PIR0Volt02 PIT0ADC0Select03
B2 C2 PIT0ADC0Select04
10KOhm
A4
FMB2222A Date: 5/08/2022 Sheet of ADC
File: C:\Users\..\ADC.SchDoc Drawn By: Rui Marques
1 2 3 4
1 2 3 4

GND
EN_ADC
POCS0CARD
CS_CARD PIR1 02

2
COSpi
Spi COR11
COSI0EXP
SI_EXP
6 PISpi06
A 11 21 NLDMUX0A0
DMUX_A0 PODMUX0A0 A
5 PISpi05 PISI0EXP011
CS GPA0 PISI0EXP021
DMUX_A0
NLCS0CARD
CS_CARD 22 NLDMUX0A1
DMUX_A1 PODMUX0A1 PIR1 0
100k

1
4 PISpi04
NLSCLK GPA1 PISI0EXP022
NLDMUX0A2 DMUX_A1
SCLK 12 23 DMUX_A2 PODMUX0A2
3 PISpi03
NLMOSI
PISI0EXP012 SCK GPA2 PISI0EXP023
NLDMUX0A3 DMUX_A2
MOSI 13 24 DMUX_A3 PODMUX0A3
2 PISpi02
NLO0EXP01
PISI0EXP013
SI GPA3 PISI0EXP024
DMUX_A3
O_EXP_1 14 25 CDMUX_A0 3.3V
1 PISpi01 PISI0EXP014
SO GPA4 PISI0EXP025

26 CDMUX_A1
GPA5 PISI0EXP026
Header 6 POSCLK 15 27 CDMUX_A2
SCLK 3.3V PISI0EXP015
A0 GPA6 PISI0EXP027
16 28 CDMUX_A3 HVR_COM2
PISI0EXP016
A1 GPA7 PISI0EXP028
17
GND PISI0EXP017
A2
HVR_COM1
COC2
GND
C2 100n 18
RESET GPB0
1 INP_DMUX
PIR802 PIR902

2
PIC201 PIC202 PISI0EXP018 PISI0EXP01
NLMISO
MISO PIR102 GPB1
2
PISI0EXP02
EN_CDMUX
COR1
R1 20 3 NLEN0ADC
EN_ADC COR8 COR9
COJ0GND
PISI0EXP020
INTA GPB2 PISI0EXP03
NLHVR0COM1 POEN0ADC
EN_ADC
J_GND 1K 19 4 HVR_COM1 POHVR0COM1
PIR10
PISI0EXP019
INTB GPB3 PISI0EXP04
NLHVR0COM2 HVR_COM1
5 HVR_COM2 POHVR0COM2
2 PIJ0GND02
GPB4 PISI0EXP05
HVR_COM2
6 NLSwitch0HVLV
Switch_HVLV POSwitch0HVLV PIR801
100k
PIR901
100k

1
1 PIJ0GND01
GPB5 PISI0EXP06
NLSwitch0Volt Switch_HVLV
9 7 Switch_Volt POSwitch0Volt
PISI0EXP09
VDD GPB6 PISI0EXP07
Switch_Volt
Header 2 PIC101 10
PISI0EXP010
VSS GPB7
8
PISI0EXP08
NLSwitch0HVIN
Switch_HVIN POSwitch0HVIN
Switch_HVIN
COC1
C1
PIR1802

2
B MCP23S17-E/SO GND B
GND
GND PIC102 0.1u COR18
PIR0Jumper02
PIOUT06 PIOUT05 PIOUT04 PIOUT03 PIOUT02 PIOUT01 COR0Jumper
R_Jumper
1K GND
PIR180
100k
EN_DMUX_HV2_3 EN_DMUX_HV1_3

1
PIR0Jumper01 EN_DMUX_HV2_2 EN_DMUX_HV1_2
1
3
6
5
4

3.3V EN_DMUX_HV2_1 EN_DMUX_HV1_1


COOUT
OUT GND
PIR20 PIR402 PIR602 PIR1302 PIR1502 PIR1702

2
Header 6
COJumper0OUT
Jumper_OUT COR2 COR4 COR6 COR13 COR15 COR17
MISO NLADC0OUT
ADC_OUT POADC0OUT
PIJumper0OUT01
1 2 PIJumper0OUT02
ADC_OUT
O_EXP_1
PIJumper0OUT03
3 4 PIJumper0OUT04

PIR201
100k
PIR401
100k
PIR601
100k
PIR130 PIR150 PIR170
100k 100k 100k

1
Header 2X2 EN_CDMUX
PIR502

2
3.3V 3.3V
COR5
C 3.3V C
COC0CDMUX
C_CDMUX
GND PIR501
100k

1
PIC0CDMUX01 PIC0CDMUX02
NLINP0DMUX
INP_DMUX Switch_LV4
COControl0DMUX
Control_DMUX 100n
1 24 3.3V Switch_Volt Switch_LV3
NLSwitch0LV2
PIControl0DMUX01
COMMON_INPUT/OUTPUTVCC PIControl0DMUX024

POSwitch0LV2 Switch_LV2 2 23 NLSwitch0LV3


Switch_LV3 POSwitch0LV3
Switch_LV2 NLSwitch0LV1
PIControl0DMUX02
I7 I8 PIControl0DMUX023
Switch_LV3
POSwitch0LV1 Switch_LV1 3 22 NLSwitch0LV4
Switch_LV4 POSwitch0LV4 Switch_HVLV Switch_LV2
Switch_LV1 PIControl0DMUX03
I6 I9 PIControl0DMUX022
Switch_LV4
POEN0DMUX0HV203
EN_DMUX_HV2_3
NLEN0DMUX0HV203
EN_DMUX_HV2_3 4
I5 I10
21
PIR302 PIR702

2
PIControl0DMUX04 PIControl0DMUX021

POEN0DMUX0HV202 NLEN0DMUX0HV202
EN_DMUX_HV2_2 5 20 Switch_LV1
EN_DMUX_HV2_2 PIControl0DMUX05
I4 I11 PIControl0DMUX020

POEN0DMUX0HV201
EN_DMUX_HV2_1
NLEN0DMUX0HV201
EN_DMUX_HV2_1 6
I3 I12
19 COR3 COR7
PIR102 PIR120 PIR1402 PIR1602

2
PIControl0DMUX06 PIControl0DMUX019

POEN0DMUX0HV103 NLEN0DMUX0HV103
EN_DMUX_HV1_3 7 18 100k 100k
EN_DMUX_HV1_3 NLEN0DMUX0HV102
PIControl0DMUX07
I2 I13 PIControl0DMUX018

POEN0DMUX0HV102 EN_DMUX_HV1_2 PIControl0DMUX08


8 17 COR10 COR12 COR14 COR16
EN_DMUX_HV1_2 I1 I14 PIControl0DMUX017

POEN0DMUX0HV101 NLEN0DMUX0HV101
EN_DMUX_HV1_1 PIControl0DMUX09
9 16
PIR301
100k
PIR701
100k

1
EN_DMUX_HV1_1 NLCDMUX0A0 I0 I15 PIControl0DMUX016
CDMUX_A0 10 15 NLEN0CDMUX
EN_CDMUX
PIControl0DMUX010
S0 E PIControl0DMUX015
NLCDMUX0A1
CDMUX_A1 11 14 NLCDMUX0A2
CDMUX_A2
PIR10
100k
PIR120 PIR140 PIR160
100k

1
PIControl0DMUX011
S1 S2 PIControl0DMUX014

12 13 NLCDMUX0A3
CDMUX_A3
PIControl0DMUX012
GND S3 PIControl0DMUX013
GND
GND
CD74HC4067M
D Title D
Control
GND
Size Number Revision
A
Date: 5/08/2022 Sheet of Reading Board
File: C:\Users\..\Control.SchDoc Drawn By: Rui Marques
1 2 3 4
1 2 3 4

PIR0MA12 PIC0402 PIR0MA2 PIR0MA42

2
P I R 0 M A 3 2 3.3V COC04
C_4 COT0HVR0A1
T_HVR_A1
COT0HVR0A2
T_HVR_A2

2
GND PIR0MA52 COR0MA3 COR0MA1
100k Ohm 100n PIC0401 COR0MA2
COR0MA4 PIR0MA6 2
NLCBA01
CBA_1 1 16
NLCBA05
CBA_5PIT0HVR0A201
1 16

2
2
P I R 0 MA 7 2 COR0MA6PIR0MA8 2
GND PIT0HVR0A101
2
C1_1 E1
15 PIRA101CORA1
PIT0HVR0A1016
RA1
22kSwitch_RLA1
2
C1_1 E1 PIT0HVR0A2016
CORA5
15 RA5 PIRA502 22kSwitch_RLA5

2
C1_2 B1
PIR0MA92 COR0MA7 COR0MA5 PIR0MA1 COR0MA8 PIR0MA1 2
PIT0HVR0A202 PIT0HVR0A2015
PIRA501
CODMUX0HVR101
DMUX_HVR1_1 100k Ohm PIT0HVR0A102
C1_2 B1 PIT0HVR0A1015 PIRA102
NLCBA06
CBA_6PIT0HVR0A203
3 14
NLCBA02
CBA_2 3 14
2

2
C2_1 E2
P I R 0 M A1 2 NLSwitch0RLA8PIR0MA2 1 COR0MA10 PIR0MA12
PIT0HVR0A2014
1 24 C2_1 E2 13 CORA6 RA6
PIT0HVR0A103 PIT0HVR0A1014
CORA2
RA2 4 22kSwitch_RLA6

1
COMMON_INPUT/OUTPUTVCC 4 13 PIRA201 22kSwitch_RLA2
2

2
PIDMUX0HVR10101 PIDMUX0HVR101024

PIR0MA152 PIR0MA1COR0MA1332 COR0MA11 PIR0MA71 PIR0MA51 PIR0MA31 NLSwitch0RLA11 NLSwitch0RLA7 PIR0MA4 1 COR0MA12 PIR0MA14 2
COR0MA9 Switch_RLA9 2 NLSwitch0RLA9 23 Switch_RLA8 PIT0HVR0A104
C2_2 B2 PIT0HVR0A1013 PIRA202
NLCBA07 C2_2
PIT0HVR0A204
B2 PIT0HVR0A2013
PIRA601 PIRA602

1 NLCBA03 CBA_7PIT0HVR0A205
5 12

1
I7 I8 CBA_3 5 12
2

2
PIDMUX0HVR10102 PIDMUX0HVR101023
A Switch_RLA10 3 NLSwitch0RLA10 22 Switch_RLA7
P I R 0 M A6 1 COR0MA14 PIR0MA16 2
PIT0HVR0A105
C3_1 E3 PIT0HVR0A1012
CORA3
RA3 6
C3_1 E3 PIT0HVR0A2012
11 PIRA701
CORA7
RA7
22kSwitch_RLA7
A
1

1
PIDMUX0HVR10103
I6 I9 PIDMUX0HVR101022
6 11 22kSwitch_RLA3
2

2
Switch_RLA11 4 21 NLSwitch0RLA6
Switch_RLA6
P IR0M A8 1 NLCBA04
PIT0HVR0A106
C3_2 B3 PIT0HVR0A1011
PIRA301 PIRA302
NLCBA08
CBA_8PIT0HVR0A207
7
C3_2
PIT0HVR0A206
B3 PIT0HVR0A2011
10
PIRA702
1

1
PIDMUX0HVR10104
I5 I10 PIDMUX0HVR101021
CBA_4PIT0HVR0A107
7 10 C4_1 E4 CORA8
PIR0MA91 P IR 0 M A1
PIT0HVR0A2010
COR0MA15 Switch_RLA12 5 NLSwitch0RLA12 20 NLSwitch0RLA5
Switch_RLA5 COR0MA16 C4_1 E4 PIT0HVR0A1010
CORA4
RA4 8 9 RA8
22k Switch_RLA8
1

1
PIDMUX0HVR10105
I4 I11 PIDMUX0HVR101020
8 9 PIRA401 22k Switch_RLA4 C4_2 B4
P I R 0 M A1 PIR0MA12 PIR0MA14
PIT0HVR0A208 PIT0HVR0A209
PIRA801 PIRA802
Switch_RLA13 6 NLSwitch0RLA13 19 NLSwitch0RLA4
Switch_RLA4 PIT0HVR0A108
C4_2 B4 PIT0HVR0A109 PIRA402
CBA_48
1

1
PIDMUX0HVR10106
I3 I12 PIDMUX0HVR101019

PIR0MA13 Switch_RLA14 7 NLSwitch0RLA14 18 NLSwitch0RLA3


Switch_RLA3 MMPQ2222A GND CBA_47
1

1
PIDMUX0HVR10107
I2 I13 PIDMUX0HVR101018
MMPQ2222A GND
PIR0MA15 NLSwitch0RLA15
Switch_RLA15 8 17 NLSwitch0RLA2
Switch_RLA2
PIR0MA16 CBA_46
1

1
PIDMUX0HVR10108
NLSwitch0RLA16 I1 I14 PIDMUX0HVR101017
NLSwitch0RLA1 CBA_45
Switch_RLA16 9 16 Switch_RLA1
NLDMUX0A0
PIDMUX0HVR10109
I0 I15 PIDMUX0HVR101016
NLEN0DMUX0HV101 COT0HVR0A3
T_HVR_A3 COT0HVR0A4
T_HVR_A4 CBA_44
PODMUX0A0 DMUX_A0 10 15 EN_DMUX_HV1_1 POEN0DMUX0HV101 CBA_43
DMUX_A0 PIDMUX0HVR101010
S0 E PIDMUX0HVR101015
EN_DMUX_HV1_1 NLCBA09
CBA_9PIT0HVR0A301
1 16 NLCBA013
CBA_13 1 16
PODMUX0A1 DMUX_A1 11 14 DMUX_A2 PODMUX0A2 C1_1 E1 PIT0HVR0A3016
CORA9 C1_1 E1 CORA13 CBA_42
15PIRA901RA9 PIRA902
PIT0HVR0A401 PIT0HVR0A4016
DMUX_A1 PIDMUX0HVR101011
S1 S2 PIDMUX0HVR101014
DMUX_A2 2 15 RA13PIRA1302
12 13 DMUX_A3 PODMUX0A3 PIT0HVR0A302
C1_2 B1 PIT0HVR0A3015 22kSwitch_RLA9 2
PIT0HVR0A402
C1_2 B1 PIT0HVR0A4015
PIRA1301 22kSwitch_RLA13 CBA_41
PIDMUX0HVR101012
GND S3 PIDMUX0HVR101013
DMUX_A3 NLCBA010
CBA_10 3 14 NLCBA014
CBA_14 3 14 CBA_40
PIT0HVR0A303
C2_1 E2 PIT0HVR0A3014
CORA10
RA10 PIT0HVR0A403
C2_1 E2 PIT0HVR0A4014
CORA14
RA14 CBA_39
PIR0MA172 CD74HC4067M
PIR0MA182 PIR0MA2 NLCBA011
4
PIT0HVR0A304
C2_2 B2
13PIRA1001
PIT0HVR0A3013 22kSwitch_RLA10
PIRA1002 4
PIT0HVR0A404
C2_2 B2
13 PIRA1401
PIT0HVR0A4013 22kSwitch_RLA14
PIRA1402
CBA_38
2

COC05 CBA_11 5 12 NLCBA015


P I R 0 M A1 9 2

2
GND 3.3V C_5 C3_1 E3 CORA11 CBA_15 5 12 CBA_37
PIT0HVR0A305 PIT0HVR0A3012
RA11 PIT0HVR0A405
C3_1 E3 PIT0HVR0A4012
CORA15
RA15
2

2
6 11 22kSwitch_RLA11
PIR0MA21 100k Ohm
COR0MA17 100n PIC0501

PIR0MA2 PIR0MA24
PIC0502
COR0MA18 NLCBA012
PIT0HVR0A306
C3_2 B3 PIT0HVR0A3011
PIRA1101 PIRA1102 6
C3_2
PIT0HVR0A406
B3
11
PIT0HVR0A4011
PIRA1501 22kSwitch_RLA15
PIRA1502 CBA_36
2

2
GND CBA_12 7 10 NLCBA016
P I R 0 M A2 3 COR0MA19 COR0MA20 GND PIT0HVR0A307
C4_1 E4 PIT0HVR0A3010
CORA12
RA12
CBA_16 7
PIT0HVR0A407
C4_1 E4
10
PIT0HVR0A4010
CORA16
RA16
CBA_35
2

2
CBA_34
PIR0MA25 COR0MA21 PIR0MA17 CODMUX0HVR102
DMUX_HVR1_2 100k Ohm COR0MA22
COR0MA24 PIR0MA26
8
PIT0HVR0A308
C4_2 B4
9 PIRA1201
PIT0HVR0A309 22k Switch_RLA12
PIRA1202 8
PIT0HVR0A408
C4_2 B4
9
PIT0HVR0A409
PIRA1601 22k Switch_RLA16
PIRA1602
CBA_33
2

2
P I R0 M A 2 7 COR0MA23 1 24
NLSwitch0RLA24 PIR0MA18 COR0MA26 PIR0MA28
CBA_32
1

COMMON_INPUT/OUTPUTVCC
2

2
PIDMUX0HVR10201 PIDMUX0HVR102024

1
MMPQ2222A GND

PIR0MA312 PIR0MA2COR0MA299 PIR0MA19 NLSwitch0RLA23 PIR0MA2 1


PIR0MA21 PIR0MA241 COR0MA28 PIR0MA3COR0MA302 PIR0MA32
COR0MA25 NLSwitch0RLA25
Switch_RLA25 2 23 Switch_RLA24 MMPQ2222A GND CBA_31
1

1
I7 I8
2

2
PIDMUX0HVR10202 PIDMUX0HVR102023
COR0MA27
P I R 0 M A2 1
NLSwitch0RLA26
Switch_RLA26 3 22 Switch_RLA23 CBA_30
1

1
I6 I9
2

2
PIDMUX0HVR10203 PIDMUX0HVR102022
COT0HVR0A6 CBA_29
B
P I R 0 M A 2 3 1 Switch_RLA27 4 NLSwitch0RLA27 NLSwitch0RLA22
21 Switch_RLA22 COT0HVR0A5
T_HVR_A5 T_HVR_A6
CBA_28
B
1

1
PIDMUX0HVR10204
I5 I10 PIDMUX0HVR102021
NLCBA021
PIR0MA271 PIR0MA251 P IR 0 M A2 6 1
COR0MA31 NLSwitch0RLA28
Switch_RLA28 5 NLSwitch0RLA21
20 Switch_RLA21 COR0MA32 NLCBA017
CBA_17 1 16 CBA_21 1 16 CBA_27
C1_1 E1 CORA17 PIT0HVR0A601
C1_1 E1 PIT0HVR0A6016 CORA21
1

1
PIDMUX0HVR10205 I4 I11 PIDMUX0HVR102020 PIT0HVR0A501 PIT0HVR0A5016
15PIRA1701RA17PIRA1702 15 RA21PIRA2102
NLSwitch0RLA29
Switch_RLA29 6 NLSwitch0RLA20
19 Switch_RLA20
P I R0 M A 28 1 2
C1_2 B1 22kSwitch_RLA17 2
PIT0HVR0A602
C1_2 B1 PIT0HVR0A6015PIRA2101 22kSwitch_RLA21 CBA_26
1

1
PIDMUX0HVR10206 I3 I12 PIDMUX0HVR102019 PIT0HVR0A502 PIT0HVR0A5015
NLCBA022
PIR0MA31 PIR0MA291 PIR0MA3 1 PIR0MA321
NLSwitch0RLA30
Switch_RLA30 7 NLSwitch0RLA19
18 Switch_RLA19 NLCBA018
CBA_18 3 14 CBA_22 3 14 CBA_25
PIT0HVR0A503
C2_1 E2 PIT0HVR0A5014 PIT0HVR0A603
C2_1 E2 PIT0HVR0A6014
CORA22
1

1
PIDMUX0HVR10207
NLSwitch0RLA31 I2 I13 PIDMUX0HVR102018
NLSwitch0RLA18 CORA18
RA18 4 13 RA22 CBA_24
Switch_RLA318 17 Switch_RLA18 4
C2_2 B2
13 22kSwitch_RLA18 PIT0HVR0A604
C2_2 B2 PIT0HVR0A6013PIRA2201 22kSwitch_RLA22
PIRA2202
CBA_23
1

1
NLSwitch0RLA32
PIDMUX0HVR10208
I1 I14 PIDMUX0HVR102017
NLSwitch0RLA17 NLCBA019
CBA_19
PIT0HVR0A504

5
PIT0HVR0A5013

12
PIRA1801 PIRA1802
NLCBA023
CBA_23 5 12
Switch_RLA32 9 16 Switch_RLA17 C3_1 E3 CORA19 PIT0HVR0A605
C3_1 E3 PIT0HVR0A6012 CORA23 CBA_22
PIDMUX0HVR10209
I0 I15 PIDMUX0HVR102016 PIT0HVR0A505 PIT0HVR0A5012
RA19 Switch_RLA19 6 11 RA23 Switch_RLA23
DMUX_A0 10 15 NLEN0DMUX0HV102
EN_DMUX_HV1_2
POEN0DMUX0HV102 6
C3_2 B3
11 22k PIT0HVR0A606
C3_2 B3 PIT0HVR0A6011PIRA2301 22k
PIRA2302 CBA_21
NLDMUX0A1
PIDMUX0HVR102010 S0 E PIDMUX0HVR102015 EN_DMUX_HV1_2 NLCBA020
PIT0HVR0A506 PIT0HVR0A5011
PIRA1901 PIRA1902
NLCBA024
CBA_24 7 10 CBA_20
DMUX_A1 11 14 NLDMUX0A2
DMUX_A2 CBA_20 7 10 PIT0HVR0A607
C4_1 E4 PIT0HVR0A6010 CORA24
9 PIRA2001CORA20
PIDMUX0HVR102011
S1 S2 PIDMUX0HVR102014
NLDMUX0A3
PIT0HVR0A507
C4_1 E4 PIT0HVR0A5010
RA20 8 9 RA24 CBA_19
12
PIDMUX0HVR102012
GND S3
13
PIDMUX0HVR102013
DMUX_A3 8
PIT0HVR0A508
C4_2 B4 PIT0HVR0A509 22k Switch_RLA20
PIRA2002 PIT0HVR0A608
C4_2 B4 PIT0HVR0A609
PIRA2401 22k Switch_RLA24
PIRA2402
CBA_18
CBA_17
CD74HC4067M MMPQ2222A GND MMPQ2222A GND CBA_16
CBA_15

PPIR0MA372 IR0MA352 PIR0MA3 2 PIR0MA342 PIR0MA362


GND COC06
C_6 CBA_14
2

3.3V 100n COT0HVR0A7


T_HVR_A7 COT0HVR0A8
T_HVR_A8 CBA_13
2

COR0MA36 PIR0MA38 2
100k Ohm
COR0MA33 PIC0601 PIC0602
COR0MA34 NLCBA025 NLCBA029 CBA_12
GND CBA_25 1 16 CBA_29 1 16 CBA_11
2

GND PIR0MA392 COR0MA37 COR0MA35 100k Ohm


COR0MA38PIR0MA4 2
PIT0HVR0A701
2
C1_1 E1 PIT0HVR0A7016
CORA25
15PIRA2501RA25PIRA2502
22kSwitch_RLA25
PIT0HVR0A801
2
C1_1 E1 PIT0HVR0A8016
CORA29
15 RA29PIRA2902 22kSwitch_RLA29 CBA_10
2

P I R 0M A 4 1 2 CODMUX0HVR103
DMUX_HVR1_3
COR0MA40 PIR0MA42
NLCBA026
CBA_26 3
PIT0HVR0A702
C1_2 B1 PIT0HVR0A7015
14 NLCBA030
CBA_30 3
PIT0HVR0A802
C1_2 B1 PIT0HVR0A8015
14
PIRA2901
CBA_9
2

P I R 0 MA 4 3 2 COR0MA39
P I
1
R 0M A 3 1 24
P I R 0M A 34 1 COR0MA42PIR0MA4 2
PIT0HVR0A703
4
C2_1 E2 PIT0HVR0A7014
13PIRA2601 CORA26
RA26
22kSwitch_RLA26
PIT0HVR0A803
4
C2_1 E2 PIT0HVR0A8014
13PIRA3001 CORA30
RA30
22kSwitch_RLA30
CBA_8
1

COMMON_INPUT/OUTPUTVCC
2

PIDMUX0HVR10301 PIDMUX0HVR103024
2

PIR0MA472 PIR0MA452COR0MA45 COR0MA43 PIR0MA391 PIR0MA371 PIR0MA351 NLSwitch0RLA43 PI R 0M A 3 6 1 COR0MA44 PIR0MA46 2


COR0MA41 Switch_RLA41 2 NLSwitch0RLA41 23 Switch_RLA40 NLSwitch0RLA40 PIT0HVR0A704
C2_2 B2 PIT0HVR0A7013 PIRA2602 PIT0HVR0A804
C2_2 B2 PIT0HVR0A8013 PIRA3002 CBA_7
NLCBA027
CBA_27 5 12 NLCBA031
CBA_31 5 12
1

PIDMUX0HVR10302
I7 I8 PIDMUX0HVR103023
2

2 CBA_6
C Switch_RLA42 3 NLSwitch0RLA42 22 Switch_RLA39 NLSwitch0RLA39
PI R 0 MA 3 8 1 PIR0MA4 1 PIR0MA421 COR0MA46 PIR0MA4COR0MA4882
PIT0HVR0A705

6
C3_1 E3 PIT0HVR0A7012

11 PIRA2701CORA27
RA27
22kSwitch_RLA27
PIT0HVR0A805

6
C3_1 E3 PIT0HVR0A8012

11 PIRA3101CORA31
RA31
22kSwitch_RLA31 CBA_5 C
1

I6 I9
2

2
PIDMUX0HVR10303 PIDMUX0HVR103022

Switch_RLA43 4 21 Switch_RLA38 NLSwitch0RLA38 NLCBA028


PIT0HVR0A706
C3_2 B3 PIT0HVR0A7011 PIRA2702
NLCBA032
PIT0HVR0A806
C3_2 B3 PIT0HVR0A8011 PIRA3102
CBA_4
CBA_28 7 10 CBA_32 7 10
1

PIDMUX0HVR10304
I5 I10 PIDMUX0HVR103021
COR0MA47
PIR0MA41 Switch_RLA44 NLSwitch0RLA44
5 20 Switch_RLA37 NLSwitch0RLA37 PIT0HVR0A707
8
C4_1 E4 PIT0HVR0A7010
9
CORA28
RA28
22k Switch_RLA28
PIT0HVR0A807
8
C4_1 E4 PIT0HVR0A8010
9
CORA32
RA32
22k Switch_RLA32
CBA_3
1

PIDMUX0HVR10305
I4 I11 PIDMUX0HVR103020

P I R 0 MA 4 3 1 Switch_RLA45 NLSwitch0RLA45
6 19 Switch_RLA36 NLSwitch0RLA36
PIR0MA4 1 PIR0MA461 PIT0HVR0A708
C4_2 B4 PIT0HVR0A709
PIRA2801 PIRA2802 PIT0HVR0A808
C4_2 B4 PIT0HVR0A809
PIRA3201 PIRA3202
CBA_2
1

PIDMUX0HVR10306
I3 I12 PIDMUX0HVR103019
CBA_1
PIR0MA451 Switch_RLA46 NLSwitch0RLA46
7 18 Switch_RLA35 NLSwitch0RLA35 MMPQ2222A GND MMPQ2222A GND
1

PIDMUX0HVR10307
I2 I13 PIDMUX0HVR103018

PIR0MA471 NLSwitch0RLA47
Switch_RLA47 8 17 NLSwitch0RLA34
Switch_RLA34
PIR0MA481
1

PIDMUX0HVR10308 I1 I14 PIDMUX0HVR103017


NLSwitch0RLA48
Switch_RLA48 9 16 NLSwitch0RLA33
Switch_RLA33
PIDMUX0HVR10309
I0 I15 PIDMUX0HVR103016
NLEN0DMUX0HV103 NLCBA00100480
DMUX_A0 10 15 EN_DMUX_HV1_3 POEN0DMUX0HV103 COT0HVR0A9
T_HVR_A9 COT0HVR0A10
T_HVR_A10 POCBA01
POCBA00100480
POCBA048
POCBA047
POCBA046
POCBA045
POCBA044
POCBA043
POCBA042
POCBA041
POCBA040
POCBA039
POCBA038
POCBA037
POCBA036
POCBA035
POCBA034
POCBA033
POCBA032
POCBA031
POCBA030
POCBA029
POCBA028
POCBA027
POCBA026
POCBA025
POCBA024
POCBA023
POCBA022
POCBA021
POCBA020
POCBA019
POCBA018
POCBA017
POCBA016
POCBA015
POCBA014
POCBA013
POCBA012
POCBA011
POCBA010
POCBA09
POCBA08
POCBA07
POCBA06
POCBA05
POCBA04
POCBA03
POCBA02 CBA_[1..48]
PIDMUX0HVR103010
S0 E PIDMUX0HVR103015
EN_DMUX_HV1_3 CBA_[1..48]
DMUX_A1 11 14 DMUX_A2 NLCBA033
CBA_33 1 16 NLCBA037
CBA_37 1 16
PIDMUX0HVR103011
S1 S2 PIDMUX0HVR103014
C1_1 E1 C1_1 E1
15PIRA3301CORA33 15PIRA3701CORA37
PIT0HVR0A901 PIT0HVR0A9016 PIT0HVR0A1001 PIT0HVR0A10016
12
PIDMUX0HVR103012 GND
13 DMUX_A3 2 RA33 Switch_RLA33 2 RA37 Switch_RLA37
S3 PIDMUX0HVR103013
PIT0HVR0A902
C1_2 B1 PIT0HVR0A9015 22k
PIRA3302 PIT0HVR0A1002
C1_2 B1 PIT0HVR0A10015 22k
PIRA3702
NLCBA034
CBA_34 3 14 NLCBA038
CBA_38 3 14
CD74HC4067M PIT0HVR0A903
C2_1 E2 PIT0HVR0A9014
CORA34
RA34 Switch_RLA34 PIT0HVR0A1003
C2_1 E2 PIT0HVR0A10014
CORA38
RA38 Switch_RLA38
4 13 22k 4 13 22k
GND NLCBA035
PIT0HVR0A904
C2_2 B2 PIT0HVR0A9013
PIRA3401 PIRA3402
NLCBA039
PIT0HVR0A1004
C2_2 B2 PIT0HVR0A10013
PIRA3801 PIRA3802
CBA_35 5 12 CBA_39 5 12
PIT0HVR0A905
C3_1 E3 PIT0HVR0A9012 PIT0HVR0A1005
C3_1 E3 PIT0HVR0A10012
6 11 CORA35 RA35 Switch_RLA35
22k 6 11 CORA39 RA39 Switch_RLA39
22k
NLCBA036
PIT0HVR0A906
C3_2 B3 PIT0HVR0A9011
PIRA3501 PIRA3502

NLCBA040
PIT0HVR0A1006
C3_2 B3 PIT0HVR0A10011
PIRA3901 PIRA3902

CBA_36 7 10 CBA_40 7 10
COT0HVR0A11
T_HVR_A11 PIT0HVR0A907
C4_1 E4 PIT0HVR0A9010
CORA36 PIT0HVR0A1007
C4_1 E4 PIT0HVR0A10010
CORA40
COT0HVR0A12 8 9 PIRA3601RA36PIRA3602
22k Switch_RLA36 8 9 PIRA4001RA40PIRA4002
22k Switch_RLA40
NLCBA041
CBA_41 1 16 T_HVR_A12 PIT0HVR0A908
C4_2 B4 PIT0HVR0A909 PIT0HVR0A1008
C4_2 B4 PIT0HVR0A1009
PIT0HVR0A1101
C1_1 E1 PIT0HVR0A11016
CORA41 NLCBA045
2 15 RA41PIRA4102 22kSwitch_RLA41
CBA_45 1
PIT0HVR0A1201
C1_1 E1
16
PIT0HVR0A12016
CORA45 MMPQ2222A GND MMPQ2222A GND
PIT0HVR0A1102
C1_2 B1 PIT0HVR0A11015
PIRA4101
2 15 PIRA4501RA45PIRA4502
NLCBA042
CBA_42 3
PIT0HVR0A1103
C2_1 E2
14
PIT0HVR0A11014 PIT0HVR0A1202
C1_2 B1 PIT0HVR0A12015 22k Switch_RLA45
D 4 13 CORA42 RA42 Switch_RLA42
22k
NLCBA046
CBA_46 3 PIT0HVR0A1203
C2_1 E2
14
PIT0HVR0A12014
CORA46 Title D
PIT0HVR0A1104
C2_2 B2 PIT0HVR0A11013
PIRA4201 PIRA4202

4 13 PIRA4601 RA46
NLCBA043
CBA_43 5
PIT0HVR0A1105
C3_1 E3
12
PIT0HVR0A11012
CORA43
PIT0HVR0A1204
C2_2 B2 PIT0HVR0A12013 22k Switch_RLA46
PIRA4602
DMUXs_HV1
6 11 PIRA4301RA43PIRA4302 NLCBA047
CBA_47 5 12
PIT0HVR0A1106
C3_2 B3 PIT0HVR0A11011 22kSwitch_RLA43 PIT0HVR0A1205
C3_1 E3 PIT0HVR0A12012
CORA47
RA47
NLCBA044
CBA_44 7 10 6
PIT0HVR0A1206 C3_2 B3
11
PIT0HVR0A12011
PIRA4701 22k Switch_RLA47
PIRA4702 Size Number Revision
PIT0HVR0A1107
8
C4_1 E4 PIT0HVR0A11010
9 CORA44
RA44 NLCBA048
CBA_48 7 10
PIT0HVR0A1108
C4_2 B4 PIT0HVR0A1109
PIRA4401 22k Switch_RLA44
PIRA4402 PIT0HVR0A1207
C4_1 E4 PIT0HVR0A12010
CORA48
RA48
8 9 PIRA4801 22k Switch_RLA48 A4
PIT0HVR0A1208
C4_2 B4 PIT0HVR0A1209 PIRA4802

MMPQ2222A GND Date: 5/08/2022 Sheet of Reading Board


MMPQ2222A GND
File: C:\Users\..\DMUXs_HV1.SchDoc Drawn By: Rui Marques
1 2 3 4
1 2 3 4

PIR0MB12 PIR0MB2 PIR0MB42

2
COC07
P I R 0 M B 3 2 3.3V C_7
COT0HVR0B1
T_HVR_B1
COT0HVR0B2
T_HVR_B2

2
GND PIR0MB52 COR0MB3 COR0MB1100k 100nPIC0701 PIC0702 COR0MB2
COR0MB4 PIR0MB6 2
NLCBB01
CBB_1 1 16
NLCBB05
CBB_5PIT0HVR0B201
1 16

2
2
P I R 0 MB 7 2 COR0MB6PIR0MB8 2
GND PIT0HVR0B101
2
C1_1 E1
15 PIRB101CORB1
PIT0HVR0B1016
RB1
22kSwitch_RLB1
2
C1_1 E1 PIT0HVR0B2016
CORB5
15 RB5 PIRB502 22kSwitch_RLB5

2
C1_2 B1
PIR0MB92 COR0MB7 COR0MB5 PIR0MB1 COR0MB8 PIR0MB1 2
PIT0HVR0B202 PIT0HVR0B2015
PIRB501
CODMUX0HVR201
DMUX_HVR2_1 PIT0HVR0B102
C1_2 B1 PIT0HVR0B1015 PIRB102
NLCBB06
CBB_6PIT0HVR0B203
3 14
NLCBB02
CBB_2PIT0HVR0B103
3 14
2

2
C2_1 E2
P I R 0 M B1 2 NLSwitch0RLB8 PIR0MB2 1
PIR0MB41 PIR0MB61 COR0MB10 PIR0MB1COR0MB122 PIR0MB142 PIR0MB162
PIT0HVR0B2014
1 24 100k C2_1 E2 PIT0HVR0B1014
CORB2
RB2 4 13 CORB6 RB6
22kSwitch_RLB6

1
COMMON_INPUT/OUTPUTVCC 4 13 PIRB201 22kSwitch_RLB2
2

2
PIDMUX0HVR20101 PIDMUX0HVR201024

PIR0MB152 PIR0MB1COR0MB1332 COR0MB11 PIR0MB71 PIR0MB51 PIR0MB31 NLSwitch0RLB11


COR0MB9 Switch_RLB9 NLSwitch0RLB9
2 23 Switch_RLB8 PIT0HVR0B104
C2_2 B2 PIT0HVR0B1013 PIRB202
NLCBB07 C2_2
PIT0HVR0B204
B2 PIT0HVR0B2013
PIRB601 PIRB602

1 NLCBB03 CBB_7PIT0HVR0B205
5 12

1
I7 I8 CBB_3PIT0HVR0B105
5 12
2

2
PIDMUX0HVR20102 PIDMUX0HVR201023
A Switch_RLB10 NLSwitch0RLB10
3 NLSwitch0RLB7
22 Switch_RLB7 C3_1 E3 PIT0HVR0B1012
CORB3 C3_1 E3 PIT0HVR0B2012
CORB7
RB7 A
RB3 6 11 PIRB701 22kSwitch_RLB7
1

1
PIDMUX0HVR20103
I6 I9 PIDMUX0HVR201022
6 11 22kSwitch_RLB3
2

2
Switch_RLB11 4 NLSwitch0RLB6
21 Switch_RLB6
PIR0MB81 PIR0MB1 COR0MB14 COR0MB16 NLCBB04
PIT0HVR0B106
C3_2 B3 PIT0HVR0B1011
PIRB301 PIRB302
NLCBB08
CBB_8PIT0HVR0B207
7
C3_2
PIT0HVR0B206
B3 PIT0HVR0B2011
10
PIRB702
1

1
PIDMUX0HVR20104
I5 I10 PIDMUX0HVR201021
CBB_4PIT0HVR0B107
7 10 C4_1 E4 CORB8
PIR0MB91
PIT0HVR0B2010
COR0MB15 Switch_RLB12 NLSwitch0RLB12
5 NLSwitch0RLB5
20 Switch_RLB5 C4_1 E4 PIT0HVR0B1010
CORB4
RB4 8 9 RB8
22k Switch_RLB8
1

1
PIDMUX0HVR20105
I4 I11 PIDMUX0HVR201020
8 9 PIRB401 22k Switch_RLB4 C4_2 B4
P I R 0 M B1 PIR0MB12 PIR0MB14
PIT0HVR0B208 PIT0HVR0B209
PIRB801 PIRB802
Switch_RLB13 NLSwitch0RLB13
6 NLSwitch0RLB4
19 Switch_RLB4 PIT0HVR0B108
C4_2 B4 PIT0HVR0B109 PIRB402
CBB_48
1

1
PIDMUX0HVR20106
I3 I12 PIDMUX0HVR201019

PIR0MB13 Switch_RLB14 NLSwitch0RLB14


7 NLSwitch0RLB3
18 Switch_RLB3 MMPQ2222A GND CBB_47
1

1
PIDMUX0HVR20107
I2 I13 PIDMUX0HVR201018
MMPQ2222A GND
PIR0MB15 NLSwitch0RLB15
Switch_RLB15 8 17 NLSwitch0RLB2
Switch_RLB2
PIR0MB16 CBB_46
1

1
PIDMUX0HVR20108
NLSwitch0RLB16 I1 I14 PIDMUX0HVR201017
CBB_45
Switch_RLB16 9 16 NLSwitch0RLB1
Switch_RLB1
NLDMUX0A0
PIDMUX0HVR20109
I0 I15 PIDMUX0HVR201016
NLEN0DMUX0HV201 COT0HVR0B3
T_HVR_B3 COT0HVR0B4
T_HVR_B4 CBB_44
PODMUX0A0 DMUX_A0 10 15 EN_DMUX_HV2_1 POEN0DMUX0HV201 CBB_43
DMUX_A0 NLDMUX0A1
PIDMUX0HVR201010
S0 E PIDMUX0HVR201015
EN_DMUX_HV2_1 NLCBB09
CBB_9PIT0HVR0B301
1 16 NLCBB013
CBB_13 1 16
PODMUX0A1 DMUX_A1 11 14 DMUX_A2 PODMUX0A2 C1_1 E1 PIT0HVR0B3016
CORB9 C1_1 E1 CORB13 CBB_42
15PIRB901RB9 PIRB902
PIT0HVR0B401 PIT0HVR0B4016
DMUX_A1 PIDMUX0HVR201011
S1 S2 PIDMUX0HVR201014
DMUX_A2 2 15 RB13PIRB1302
12 13 DMUX_A3 PODMUX0A3 PIT0HVR0B302
C1_2 B1 PIT0HVR0B3015 22kSwitch_RLB9 2
PIT0HVR0B402
C1_2 B1 PIT0HVR0B4015
PIRB1301 22kSwitch_RLB13 CBB_41
PIDMUX0HVR201012
GND S3 PIDMUX0HVR201013
DMUX_A3 NLCBB010
CBB_10 3 14 NLCBB014
CBB_14 3 14 CBB_40
PIT0HVR0B303
C2_1 E2 PIT0HVR0B3014
CORB10
RB10 PIT0HVR0B403
C2_1 E2 PIT0HVR0B4014
CORB14
RB14 CBB_39
PIR0MB172 CD74HC4067M
PIR0MB182 PIR0MB2 NLCBB011
4
PIT0HVR0B304
C2_2 B2
13PIRB1001
PIT0HVR0B3013 22kSwitch_RLB10
PIRB1002 4
PIT0HVR0B404
C2_2 B2
13 PIRB1401
PIT0HVR0B4013 22kSwitch_RLB14
PIRB1402
CBB_38
2

2
COC08 CBB_11 5 12 NLCBB015
P I R 0 M B1 9 2 GND 3.3V C_8 PIT0HVR0B305
C3_1 E3 PIT0HVR0B3012
CORB11
RB11
CBB_15 5
PIT0HVR0B405
C3_1 E3
12
PIT0HVR0B4012
CORB15
RB15 CBB_37
2

2
6 11 22kSwitch_RLB11
PIR0MB23 PIR0MB2COR0MB211 PIR0MB2 PIR0MB24
100k
COR0MB17 100n COR0MB18 C3_2 B3 6 11 22kSwitch_RLB15 CBB_36
PIC0801 PIC0802

NLCBB012
PIT0HVR0B306 PIT0HVR0B3011
PIRB1101 PIRB1102
C3_2
PIT0HVR0B406
B3 PIT0HVR0B4011
PIRB1501 PIRB1502
2

2
COR0MB19 COR0MB20 GND CBB_12 7 10 NLCBB016
CBB_16 7 10 CBB_35
PIT0HVR0B307
C4_1 E4 PIT0HVR0B3010
CORB12
RB12 PIT0HVR0B407
C4_1 E4 PIT0HVR0B4010
CORB16
RB16
2

2
CBB_34
GND
P I R 0 M B 25 CODMUX0HVR202
DMUX_HVR2_2 COR0MB22
PIR0MB26 PIR0MB28 8
PIT0HVR0B308
C4_2 B4
9 PIRB1201
PIT0HVR0B309 22k Switch_RLB12
PIRB1202 8
PIT0HVR0B408
C4_2 B4
9
PIT0HVR0B409
PIRB1601 22k Switch_RLB16
PIRB1602
CBB_33
2

2
PIR0MB27 COR0MB23
PIR0MB17 1 24 100k
PIR0MB18 PIR0MB2 1
COR0MB24 CBB_32
1

1
COMMON_INPUT/OUTPUTVCC
2

2
PIDMUX0HVR20201 PIDMUX0HVR202024
MMPQ2222A GND
P I R0 M B 2 9 COR0MB25
P I R 0 M B1 9
NLSwitch0RLB25
Switch_RLB25 2 23 NLSwitch0RLB24
Switch_RLB24 COR0MB26
PIR0MB3 2 PIR0MB32 MMPQ2222A GND CBB_31
1

1
I7 I8
2

2
PIDMUX0HVR20202 PIDMUX0HVR202023

PIR0MB312 COR0MB29 PIR0MB231 PIR0MB21 NLSwitch0RLB27


COR0MB27 NLSwitch0RLB26
Switch_RLB26 3 NLSwitch0RLB23
22 Switch_RLB23
PIR0MB21 PIR0MB241
COR0MB28 CBB_30
1

1
I6 I9
2

2
PIDMUX0HVR20203 PIDMUX0HVR202022
B Switch_RLB27 4 NLSwitch0RLB22
21 Switch_RLB22 COR0MB30 COT0HVR0B5
T_HVR_B5 COT0HVR0B6
T_HVR_B6 CBB_29 B
CBB_28
1

1
PIDMUX0HVR20204
I5 I10 PIDMUX0HVR202021
NLCBB021
COR0MB31
PIR0MB251 NLSwitch0RLB28
Switch_RLB28 5 20 NLSwitch0RLB21
Switch_RLB21 COR0MB32
PIR0MB261 PIR0MB281 NLCBB017
CBB_17 1 16 CBB_21 1 PIT0HVR0B601
C1_1
16
E1 PIT0HVR0B6016 CORB21 CBB_27
1

C1_1 E1 CORB17

1
PIDMUX0HVR20205 I4 I11 PIDMUX0HVR202020 PIT0HVR0B501 PIT0HVR0B5016
15PIRB1701RB17PIRB1702 15 RB21PIRB2102
PIR0MB271 NLSwitch0RLB29
Switch_RLB29 6 19 NLSwitch0RLB20
Switch_RLB20 2
C1_2 B1 22kSwitch_RLB17 2
PIT0HVR0B602
C1_2 B1 PIT0HVR0B6015PIRB2101 22kSwitch_RLB21 CBB_26
1

1
PIDMUX0HVR20206 I3 I12 PIDMUX0HVR202019 PIT0HVR0B502 PIT0HVR0B5015
NLCBB022
P I R0 M B 2 9 1 NLSwitch0RLB30
Switch_RLB30 7 18 NLSwitch0RLB19
Switch_RLB19
PIR0MB3 1 PIR0MB321 NLCBB018
CBB_18 3
PIT0HVR0B503
C2_1 E2
14
PIT0HVR0B5014
CBB_22 3 PIT0HVR0B603
C2_1 E2
14
PIT0HVR0B6014
CORB22
CBB_25
1

1
PIDMUX0HVR20207
I2 I13 PIDMUX0HVR202018
CORB18
RB18 RB22 CBB_24
PIR0MB31 NLSwitch0RLB31
Switch_RLB31 8 17 NLSwitch0RLB18
Switch_RLB18 4
C2_2 B2
13 22kSwitch_RLB18 4
PIT0HVR0B604
C2_2
13
B2 PIT0HVR0B6013PIRB2201 22kSwitch_RLB22
PIRB2202
CBB_23
1

1
NLSwitch0RLB32
PIDMUX0HVR20208
I1 I14 PIDMUX0HVR202017
NLSwitch0RLB17 NLCBB019
CBB_19
PIT0HVR0B504

5
PIT0HVR0B5013

12
PIRB1801 PIRB1802
NLCBB023
CBB_23 5 12
Switch_RLB32 9 16 Switch_RLB17 C3_1 E3 CORB19 PIT0HVR0B605
C3_1 E3 PIT0HVR0B6012 CORB23 CBB_22
PIDMUX0HVR20209
I0 I15 PIDMUX0HVR202016 PIT0HVR0B505 PIT0HVR0B5012
RB19 6 11 RB23
DMUX_A0 10
PIDMUX0HVR202010 S0 E
15 NLEN0DMUX0HV202
PIDMUX0HVR202015
EN_DMUX_HV2_2POEN0DMUX0HV202
EN_DMUX_HV2_2
6
PIT0HVR0B506
C3_2 B3
11
PIT0HVR0B5011
PIRB1901 22kSwitch_RLB19
PIRB1902 PIT0HVR0B606
C3_2 B3 PIT0HVR0B6011PIRB2301 22kSwitch_RLB23
PIRB2302 CBB_21
DMUX_A1 11 14 NLDMUX0A2DMUX_A2 NLCBB020
CBB_20 7 10 NLCBB024
CBB_24 7 10 CBB_20
PIDMUX0HVR202011
S1 S2 PIDMUX0HVR202014 PIT0HVR0B507
C4_1 E4 PIT0HVR0B5010
CORB20
RB20
PIT0HVR0B607
C4_1 E4 PIT0HVR0B6010 CORB24RB24 CBB_19
12 13 NLDMUX0A3
DMUX_A3 8 9 PIRB2001 22k Switch_RLB20 8 9 22k Switch_RLB24
PIDMUX0HVR202012
GND S3 PIDMUX0HVR202013 PIT0HVR0B508
C4_2 B4 PIT0HVR0B509 PIRB2002 PIT0HVR0B608
C4_2 B4 PIT0HVR0B609
PIRB2401 PIRB2402
CBB_18
CBB_17
CD74HC4067M MMPQ2222A GND MMPQ2222A GND CBB_16
CBB_15

PPIR0MB372 IR0MB352 PIR0MB3 2 PIR0MB342 PIR0MB362


GND COC09
C_9 CBB_14
2

3.3V COT0HVR0B7 COT0HVR0B8 CBB_13


100n T_HVR_B7 T_HVR_B8
2

COR0MB36 PIR0MB38 2
100k
COR0MB33 PIC0901 PIC0902
COR0MB34 NLCBB025 NLCBB029 CBB_12
CBB_25 1 16 CBB_29 1 16 CBB_11
2

GND PIR0MB392 COR0MB37 COR0MB35 COR0MB38PIR0MB4 2


PIT0HVR0B701
2
C1_1 E1 PIT0HVR0B7016
CORB25
15PIRB2501RB25PIRB2502
22kSwitch_RLB25
PIT0HVR0B801
2
C1_1 E1 PIT0HVR0B8016
CORB29
15 RB29PIRB2902 22kSwitch_RLB29 CBB_10
2

P I R 0M B 4 1 2 CODMUX0HVR203
DMUX_HVR2_3
COR0MB40 PIR0MB42
GND NLCBB026
CBB_26 3
PIT0HVR0B702
C1_2 B1 PIT0HVR0B7015
14 NLCBB030
CBB_30 3
PIT0HVR0B802
C1_2 B1 PIT0HVR0B8015
14
PIRB2901
CBB_9
2

PIR0MB432 COR0MB41 COR0MB39 PIR0MB351 PIR0MB3 1 NLSwitch0RLB41 1 24 100k


P I R 0M B 34 1 COR0MB42PIR0MB4 2
PIT0HVR0B703
4
C2_1 E2 PIT0HVR0B7014
13PIRB2601 CORB26
RB26
22kSwitch_RLB26
PIT0HVR0B803
4
C2_1 E2 PIT0HVR0B8014
13PIRB3001 CORB30
RB30
22kSwitch_RLB30
CBB_8
1

COMMON_INPUT/OUTPUTVCC
2

PIDMUX0HVR20301 PIDMUX0HVR203024
2
P I R0 MB 45 2 Switch_RLB41 2 23 NLSwitch0RLB40
Switch_RLB40
PI R 0M B 3 6 1 COR0MB44 PIR0MB46 2
NLCBB027
CBB_27 5
PIT0HVR0B704
C2_2 B2 PIT0HVR0B7013
12
PIRB2602
NLCBB031
CBB_31 5
PIT0HVR0B804
C2_2 B2 PIT0HVR0B8013
12
PIRB3002 CBB_7
1

PIDMUX0HVR20302
I7 I8 PIDMUX0HVR203023
2

2 CBB_6
C PIR0MB472 COR0MB45 COR0MB43 PIR0MB391 PIR0MB371 NLSwitch0RLB43 Switch_RLB42 NLSwitch0RLB42
3 22 NLSwitch0RLB39
Switch_RLB39
PI R 0 MB 3 8 1 PIR0MB4 1 PIR0MB421 COR0MB46 PIR0MB4COR0MB4882
PIT0HVR0B705

6
C3_1 E3 PIT0HVR0B7012

11 PIRB2701CORB27
RB27
22kSwitch_RLB27
PIT0HVR0B805

6
C3_1 E3 PIT0HVR0B8012

11 PIRB3101CORB31
RB31
22kSwitch_RLB31 CBB_5 C
1

I6 I9
2

2
PIDMUX0HVR20303 PIDMUX0HVR203022

Switch_RLB43 4 21 NLSwitch0RLB38
Switch_RLB38 NLCBB028
PIT0HVR0B706
C3_2 B3 PIT0HVR0B7011 PIRB2702
NLCBB032
PIT0HVR0B806
C3_2 B3 PIT0HVR0B8011 PIRB3102
CBB_4
CBB_28 7 10 CBB_32 7 10
1

I5 I10
PIR0MB41
PIDMUX0HVR20304 PIDMUX0HVR203021
COR0MB47 Switch_RLB44NLSwitch0RLB44
5 20 NLSwitch0RLB37
Switch_RLB37 PIT0HVR0B707
C4_1 E4 PIT0HVR0B7010
CORB28
RB28 PIT0HVR0B807
C4_1 E4 PIT0HVR0B8010
CORB32
RB32 CBB_3
8 9 22k Switch_RLB28 8 9 22k Switch_RLB32
1

PIDMUX0HVR20305
I4 I11 PIDMUX0HVR203020

P I R 0 MB 4 3 1 NLSwitch0RLB45
Switch_RLB45 6 19 NLSwitch0RLB36
Switch_RLB36
PIR0MB4 1 PIR0MB461 PIT0HVR0B708
C4_2 B4 PIT0HVR0B709
PIRB2801 PIRB2802 PIT0HVR0B808
C4_2 B4 PIT0HVR0B809
PIRB3201 PIRB3202
CBB_2
1

PIDMUX0HVR20306
I3 I12 PIDMUX0HVR203019
CBB_1
PIR0MB451 Switch_RLB46NLSwitch0RLB46
7 18 NLSwitch0RLB35
Switch_RLB35 MMPQ2222A GND MMPQ2222A GND
1

PIDMUX0HVR20307
I2 I13 PIDMUX0HVR203018

PIR0MB471 NLSwitch0RLB47
Switch_RLB47 8 17 NLSwitch0RLB34
Switch_RLB34
PIR0MB481
1

NLSwitch0RLB48
PIDMUX0HVR20308 I1 I14 PIDMUX0HVR203017
NLSwitch0RLB33
Switch_RLB48 9 16 Switch_RLB33
PIDMUX0HVR20309
I0 I15 PIDMUX0HVR203016
NLEN0DMUX0HV203 NLCBB00100480
DMUX_A0 10 15 EN_DMUX_HV2_3 POEN0DMUX0HV203 COT0HVR0B9
T_HVR_B9 COT0HVR0B10
T_HVR_B10 POCBB01
POCBB00100480
POCBB048
POCBB047
POCBB046
POCBB045
POCBB044
POCBB043
POCBB042
POCBB041
POCBB040
POCBB039
POCBB038
POCBB037
POCBB036
POCBB035
POCBB034
POCBB033
POCBB032
POCBB031
POCBB030
POCBB029
POCBB028
POCBB027
POCBB026
POCBB025
POCBB024
POCBB023
POCBB022
POCBB021
POCBB020
POCBB019
POCBB018
POCBB017
POCBB016
POCBB015
POCBB014
POCBB013
POCBB012
POCBB011
POCBB010
POCBB09
POCBB08
POCBB07
POCBB06
POCBB05
POCBB04
POCBB03
POCBB02 CBB_[1..48]
PIDMUX0HVR203010
S0 E PIDMUX0HVR203015
EN_DMUX_HV2_3 CBB_[1..48]
DMUX_A1 11 14 DMUX_A2 NLCBB033
CBB_33 1 16 NLCBB037
CBB_37 1 16
PIDMUX0HVR203011
S1 S2 PIDMUX0HVR203014
C1_1 E1 C1_1 E1
15PIRB3301CORB33 15PIRB3701CORB37
PIT0HVR0B901 PIT0HVR0B9016 PIT0HVR0B1001 PIT0HVR0B10016
12 13 DMUX_A3 2 RB33 RB37
PIDMUX0HVR203012 GND S3 PIDMUX0HVR203013
PIT0HVR0B902
C1_2 B1 PIT0HVR0B9015 22kSwitch_RLB33
PIRB3302
2
PIT0HVR0B1002
C1_2 B1 PIT0HVR0B10015 22kSwitch_RLB37
PIRB3702
NLCBB034
CBB_34 3 14 NLCBB038
CBB_38 3 14
CD74HC4067M PIT0HVR0B903
C2_1 E2 PIT0HVR0B9014
CORB34
RB34 PIT0HVR0B1003
C2_1 E2 PIT0HVR0B10014
CORB38
RB38
4 13 22kSwitch_RLB34 4 13 22k Switch_RLB38
GND NLCBB035
PIT0HVR0B904
C2_2 B2 PIT0HVR0B9013
PIRB3401 PIRB3402
NLCBB039
PIT0HVR0B1004
C2_2 B2 PIT0HVR0B10013
PIRB3801 PIRB3802
CBB_35 5 12 CBB_39 5 12
PIT0HVR0B905
C3_1 E3 PIT0HVR0B9012
CORB35
RB35
PIT0HVR0B1005
C3_1 E3 PIT0HVR0B10012
CORB39
RB39
6 11 22kSwitch_RLB35 6 11 22kSwitch_RLB39
NLCBB036
PIT0HVR0B906
C3_2 B3 PIT0HVR0B9011
PIRB3501 PIRB3502

NLCBB040
PIT0HVR0B1006
C3_2 B3 PIT0HVR0B10011
PIRB3901 PIRB3902

CBB_36 7 10 CBB_40 7 10
COT0HVR0B11
T_HVR_B11 PIT0HVR0B907
C4_1 E4 PIT0HVR0B9010
CORB36
RB36 PIT0HVR0B1007
C4_1 E4 PIT0HVR0B10010
CORB40
RB40
COT0HVR0B12 8 9 PIRB3601 22k Switch_RLB36 8 9 PIRB4001 22k Switch_RLB40
NLCBB041
CBB_41 1 16 T_HVR_B12 PIT0HVR0B908
C4_2 B4 PIT0HVR0B909 PIRB3602 PIT0HVR0B1008
C4_2 B4 PIT0HVR0B1009 PIRB4002
PIT0HVR0B1101
C1_1 E1 PIT0HVR0B11016
CORB41 NLCBB045
2 15 RB41PIRB4102 22kSwitch_RLB41
CBB_45 1
PIT0HVR0B1201
C1_1 E1
16
PIT0HVR0B12016
CORB45 MMPQ2222A GND MMPQ2222A GND
PIT0HVR0B1102
C1_2 B1 PIT0HVR0B11015
PIRB4101
2 15 PIRB4501RB45PIRB4502
NLCBB042
CBB_42 3
PIT0HVR0B1103
C2_1 E2
14
PIT0HVR0B11014 PIT0HVR0B1202
C1_2 B1 PIT0HVR0B12015 22k Switch_RLB45
D 4 13 CORB42 RB42
22kSwitch_RLB42
NLCBB046
CBB_46 3 PIT0HVR0B1203
C2_1 E2
14
PIT0HVR0B12014
CORB46 Title D
PIT0HVR0B1104
C2_2 B2 PIT0HVR0B11013
PIRB4201 PIRB4202

4 13 PIRB4601 RB46
NLCBB043
CBB_43 5
PIT0HVR0B1105
C3_1 E3
12
PIT0HVR0B11012
CORB43
PIT0HVR0B1204
C2_2 B2 PIT0HVR0B12013 22k Switch_RLB46
PIRB4602
DMUXs_HV2
6 11 PIRB4301 RB43 NLCBB047
CBB_47 5 12
PIT0HVR0B1106
C3_2 B3 PIT0HVR0B11011 22kSwitch_RLB43
PIRB4302
PIT0HVR0B1205
C3_1 E3 PIT0HVR0B12012
CORB47
RB47
NLCBB044
CBB_44 7 10 6
PIT0HVR0B1206 C3_2 B3
11
PIT0HVR0B12011
PIRB4701 22k Switch_RLB47
PIRB4702 Size Number Revision
PIT0HVR0B1107
8
C4_1 E4 PIT0HVR0B11010
9 CORB44
RB44 NLCBB048
CBB_48 7 10
PIT0HVR0B1108
C4_2 B4 PIT0HVR0B1109
PIRB4401 22k Switch_RLB44
PIRB4402 PIT0HVR0B1207
C4_1 E4 PIT0HVR0B12010
CORB48
RB48
8 9 PIRB4801 22k Switch_RLB48 A4
PIT0HVR0B1208
C4_2 B4 PIT0HVR0B1209 PIRB4802

MMPQ2222A GND Date: 5/08/2022 Sheet of Reading Board


MMPQ2222A GND
File: C:\Users\..\DMUXs_HV2.SchDoc Drawn By: Rui Marques
1 2 3 4
1 2 3 4

COJ1
J1 COJ2
J2 COJ3
J3 COJ4
J4
1
PIJ101 1
PIJ201 1
PIJ301 1
PIJ401

14
PIJ1014
14
PIJ2014
14
PIJ3014
14
PIJ4014
A 2
PIJ102
27
PIJ1027
2
PIJ202
27
PIJ2027
2
PIJ302
27
PIJ3027
2
PIJ402
27
PIJ4027
A
15
PIJ1015
15
PIJ2015
15
PIJ3015
15
PIJ4015
3
PIJ103 26
PIJ1026 3
PIJ203 26
PIJ2026 3
PIJ303 26
PIJ3026 3
PIJ403 26
PIJ4026
16
PIJ1016
16
PIJ2016
16
PIJ3016
16
PIJ4016
NLHV0A1
HV_A1 4
PIJ104
HV_A13 4
PIJ204
HV_A25 4
PIJ304
HV_A37 4
PIJ404
NLHV0A2
HV_A2 17
PIJ1017
HV_A14 17
PIJ2017
HV_A26 17
PIJ3017
HV_A38 17
PIJ4017
NLHV0A3
HV_A3 5
PIJ105
HV_A15 5
PIJ205
HV_A27 5
PIJ305
HV_A39 5
PIJ405
NLHV0A4
HV_A4 18
PIJ1018
HV_A16 18
PIJ2018
HV_A28 18
PIJ3018
HV_A40 18
PIJ4018
NLHV0A5
HV_A5 6
PIJ106 HV_A17 6
PIJ206 HV_A29 6
PIJ306 HV_A41 6
PIJ406
NLHV0A6
HV_A6 19
PIJ1019
HV_A18 19
PIJ2019
HV_A30 19
PIJ3019
HV_A42 19
PIJ4019
NLHV0A7
HV_A7 7
PIJ107
HV_A19 7
PIJ207
HV_A31 7
PIJ307
HV_A43 7
PIJ407
NLHV0A8
HV_A8 20
PIJ1020
HV_A20 20
PIJ2020
HV_A32 20
PIJ3020
HV_A44 20
PIJ4020
NLHV0A9
HV_A9 8
PIJ108
HV_A21 8
PIJ208
HV_A33 8
PIJ308
HV_A45 8
PIJ408
NLHV0A10
HV_A10 21
PIJ1021 HV_A22 21
PIJ2021 HV_A34 21
PIJ3021 HV_A46 21
PIJ4021
NLHV0A11
HV_A11 9
PIJ109 HV_A23 9
PIJ209 HV_A35 9
PIJ309 HV_A47 9
PIJ409
NLHV0A12
HV_A12 22
PIJ1022
HV_A24 22
PIJ2022
HV_A36 22
PIJ3022
HV_A48 22
PIJ4022

10
PIJ1010
10
PIJ2010
10
PIJ3010
10
PIJ4010
23
PIJ1023
23
PIJ2023
23
PIJ3023
23
PIJ4023
11
PIJ1011 11
PIJ2011 11
PIJ3011 11
PIJ4011
B 24 24 24 24 B
PIJ1024 PIJ2024 PIJ3024 PIJ4024

12
PIJ1012
12
PIJ2012
12
PIJ3012
12
PIJ4012

25
PIJ1025
25
PIJ2025
25
PIJ3025
25
PIJ4025
13
PIJ1013
13
PIJ2013
13
PIJ3013
13
PIJ4013

A Connector 25 A Connector 25 A Connector 25 A Connector 25


GND GND GND GND

Clearance Constraint [Clearance = 30mil]


HV_clear
i
NLHV0A0100480
HV_A[1..48] POHV0A0100480
POHV0A48
POHV0A47
POHV0A46
POHV0A45
POHV0A44
POHV0A43
POHV0A42
POHV0A41
POHV0A40
POHV0A39
POHV0A38
POHV0A37
POHV0A36
POHV0A35
POHV0A34
POHV0A33
POHV0A32
POHV0A31
POHV0A30
POHV0A29
POHV0A28
POHV0A27
POHV0A26
POHV0A25
POHV0A24
POHV0A23
POHV0A22
POHV0A21
POHV0A20
POHV0A19
POHV0A18
POHV0A17
POHV0A16
POHV0A15
POHV0A14
POHV0A13
POHV0A12
POHV0A11
POHV0A10
POHV0A9
POHV0A8
POHV0A7
POHV0A6
POHV0A5
POHV0A4
POHV0A3
POHV0A2
POHV0A1
HV_A[1..48]
HV_A1
C HV_A2 C
HV_A3 NLHV0A25
HV_A25
HV_A4 NLHV0A26
HV_A26
HV_A5 NLHV0A27
HV_A27
HV_A6 NLHV0A28
HV_A28
HV_A7 NLHV0A29
HV_A29
HV_A8 NLHV0A30
HV_A30
HV_A9 NLHV0A31
HV_A31
HV_A10 NLHV0A32
HV_A32
HV_A11 NLHV0A33
HV_A33
HV_A12 NLHV0A34
HV_A34
NLHV0A13
HV_A13 NLHV0A35
HV_A35
NLHV0A14
HV_A14 NLHV0A36
HV_A36
NLHV0A15
HV_A15 NLHV0A37
HV_A37
NLHV0A16
HV_A16 NLHV0A38
HV_A38
NLHV0A17
HV_A17 NLHV0A39
HV_A39
NLHV0A18
HV_A18 NLHV0A40
HV_A40
NLHV0A19
HV_A19 NLHV0A41
HV_A41
NLHV0A20
HV_A20 NLHV0A42
HV_A42
D NLHV0A21
HV_A21 NLHV0A43
HV_A43 Title D
NLHV0A22
HV_A22 NLHV0A44
HV_A44 HV1_IN
NLHV0A23
HV_A23 NLHV0A45
HV_A45
NLHV0A24
HV_A24 NLHV0A46
HV_A46 Size Number Revision
NLHV0A47
HV_A47
NLHV0A48 A
HV_A48
Date: 5/08/2022 Sheet of Reading Board
File: C:\Users\..\HV1_IN.SchDoc Drawn By: Rui Marques
1 2 3 4
1 2 3 4

COD0A01
D_A_1 COD0A04 COD0A05
COD0A02
D_A_2 COD0A03
D_A_3 D_A_4 D_A_5
PID0A0101 PID0A0102
PID0A0301 PID0A0302 PID0A0401 PID0A0402 PID0A0501 PID0A0502
PID0A0201 PID0A0202
NLCBA01 HV_A1
CBA_1 NLCBA03 NLCBA04
CBA_4 NLCBA05
CBA_5
NLCBA02 CBA_3 HV_A2
Clearance Constraint [Clearance CORL0Reed0A1
RL_Reed_A1
= 30mil] 24V CBA_2
CORL0Reed0A3
RL_Reed_A3 CORL0Reed0A4
RL_Reed_A4 CORL0Reed0A5
RL_Reed_A5
CORL0Reed0A2
RL_Reed_A2 24V 24V HV_A324V
HV_clear 1 2 24V 1 2 1 2
PIRL0Reed0A101 PIRL0Reed0A102
1 2 1
PIRL0Reed0A301
2
PIRL0Reed0A302 PIRL0Reed0A401 PIRL0Reed0A402 PIRL0Reed0A501 PIRL0Reed0A502 HV_A4
A i PIRL0Reed0A201 PIRL0Reed0A202

HV_A5 A
POCOM01 COM_1 3 4 NLHV0A1
HV_A1 NLHV0A3 COM_1 3 4 NLHV0A4
HV_A4 COM_1 3 4 NLHV0A5
HV_A5
COM_1 PIRL0Reed0A103 PIRL0Reed0A104
COM_1 3 4 NLHV0A2
HV_A2 COM_1 3
PIRL0Reed0A303
4
PIRL0Reed0A304
HV_A3 PIRL0Reed0A403 PIRL0Reed0A404 PIRL0Reed0A503 PIRL0Reed0A504 HV_A6
PIRL0Reed0A203 PIRL0Reed0A204
HV_A7
HV_A8
HV_A9
HV_A10
HV_A11
COD0A08 HV_A12
COD0A06
D_A_6 COD0A07
D_A_7 D_A_8 COD0A010
D_A_10 HV_A13
COD0A09
D_A_9
PID0A0601 PID0A0602
PID0A0701 PID0A0702 PID0A0801 PID0A0802
PID0A01001 PID0A01002
HV_A14
PID0A0901 PID0A0902 HV_A15
NLCBA06 NLCBA07
CBA_7 NLCBA08
CBA_8 NLCBA010
CBA_10
CBA_6 NLCBA09 HV_A16
CORL0Reed0A6 CORL0Reed0A7 24V CORL0Reed0A8 24V CBA_9 CORL0Reed0A9 CORL0Reed0A10
RL_Reed_A6 24V RL_Reed_A7 RL_Reed_A8 RL_Reed_A9 RL_Reed_A10 24V HV_A17
24V
1
PIRL0Reed0A601
2
PIRL0Reed0A602
1
PIRL0Reed0A701
2
PIRL0Reed0A702
1
PIRL0Reed0A801
2
PIRL0Reed0A802
1
PIRL0Reed0A901
2
PIRL0Reed0A902
1
PIRL0Reed0A1001
2 PIRL0Reed0A1002
HV_A18
HV_A19
COM_1 3
PIRL0Reed0A603
4
PIRL0Reed0A604
NLHV0A6
HV_A6 COM_1 3
PIRL0Reed0A703
4
PIRL0Reed0A704
NLHV0A7
HV_A7 COM_1 3
PIRL0Reed0A803
4
PIRL0Reed0A804
NLHV0A8
HV_A8 COM_1 3
PIRL0Reed0A903
4
PIRL0Reed0A904
NLHV0A9
HV_A9 3
COM_1 PIRL0Reed0A1003 4
PIRL0Reed0A1004
NLHV0A10
HV_A10 HV_A20
HV_A21
HV_A22
Clearance Constraint [Clearance = 30mil]
HV_A23
B HV_clear
HV_A24 B
i
COD0A013 COD0A015 POHV0A0100240
POHV0A24
POHV0A23
POHV0A22
POHV0A21
POHV0A20
POHV0A19
POHV0A18
POHV0A17
POHV0A16
POHV0A15
POHV0A14
POHV0A13
POHV0A12
POHV0A11
POHV0A10
POHV0A9
POHV0A8
POHV0A7
POHV0A6
POHV0A5
POHV0A4
POHV0A3
POHV0A2
POHV0A1
HV_A[1..24]
COD0A011
D_A_11 COD0A012
D_A_12 D_A_13 D_A_15
COD0A014
D_A_14 CBA_24
PID0A01201 PID0A01202 PID0A01301 PID0A01302 PID0A01501 PID0A01502
PID0A01101 PID0A01102
PID0A01401 PID0A01402
CBA_23
NLCBA011 NLCBA012
CBA_12 NLCBA013
CBA_13 24V NLCBA015
CBA_15 CBA_22
CBA_11 NLCBA014 CBA_21
24V CBA_14 24V
CORL0Reed0A11
RL_Reed_A11 24V CORL0Reed0A12
RL_Reed_A12 CORL0Reed0A13
RL_Reed_A13 CORL0Reed0A14
RL_Reed_A14 CORL0Reed0A15
RL_Reed_A15 CBA_20
24V CBA_19
1
PIRL0Reed0A1101
2
PIRL0Reed0A1102
1
PIRL0Reed0A1201
2
PIRL0Reed0A1202
1
PIRL0Reed0A1301
2
PIRL0Reed0A1302
1
PIRL0Reed0A1401
2
PIRL0Reed0A1402
1
PIRL0Reed0A1501
2
PIRL0Reed0A1502
CBA_18
CBA_17
COM_1 3
PIRL0Reed0A1103
4
PIRL0Reed0A1104
NLHV0A11
HV_A11 COM_1 3
PIRL0Reed0A1203
4
PIRL0Reed0A1204
NLHV0A12
HV_A12 COM_1 3
PIRL0Reed0A1303
4
PIRL0Reed0A1304
NLHV0A13
HV_A13 COM_1 3
PIRL0Reed0A1403
4
PIRL0Reed0A1404
NLHV0A14
HV_A14 COM_1 3
PIRL0Reed0A1503
4
PIRL0Reed0A1504
NLHV0A15
HV_A15 CBA_16
CBA_15
CBA_14
CBA_13
CBA_12
CBA_11
CBA_10
COD0A016
D_A_16 COD0A017
D_A_17 COD0A018
D_A_18 COD0A020
D_A_20 CBA_9
COD0A019
D_A_19 CBA_8
PID0A01601 PID0A01602
PID0A01701 PID0A01702 PID0A01801 PID0A01802
PID0A02001 PID0A02002 CBA_7
NLCBA017
CBA_17 NLCBA018
PID0A01901 PID0A01902
CBA_6
C NLCBA016
CBA_16 CBA_18 NLCBA020
CBA_20 CBA_5 C
24V 24V NLCBA019
CBA_19 CBA_4
CORL0Reed0A16
RL_Reed_A16 24V CORL0Reed0A17
RL_Reed_A17 CORL0Reed0A18
RL_Reed_A18 CORL0Reed0A19
RL_Reed_A19 CORL0Reed0A20
RL_Reed_A20 24V
24V CBA_3
1
PIRL0Reed0A1601
2
PIRL0Reed0A1602
1
PIRL0Reed0A1701
2
PIRL0Reed0A1702
1
PIRL0Reed0A1801
2
PIRL0Reed0A1802
1
PIRL0Reed0A1901
2
PIRL0Reed0A1902
1
PIRL0Reed0A2001
2
PIRL0Reed0A2002 CBA_2
CBA_1
COM_1 3
PIRL0Reed0A1603
4
PIRL0Reed0A1604
NLHV0A16
HV_A16 COM_1 3
PIRL0Reed0A1703
4
PIRL0Reed0A1704
NLHV0A17
HV_A17 COM_1 3
PIRL0Reed0A1803
4
PIRL0Reed0A1804
NLHV0A18
HV_A18 COM_1 3
PIRL0Reed0A1903
4
PIRL0Reed0A1904
NLHV0A19
HV_A19 COM_1 3
PIRL0Reed0A2003
4
PIRL0Reed0A2004
NLHV0A20
HV_A20

POCBA01
POCBA00100240
POCBA024
POCBA023
POCBA022
POCBA021
POCBA020
POCBA019
POCBA018
POCBA017
POCBA016
POCBA015
POCBA014
POCBA013
POCBA012
POCBA011
POCBA010
POCBA09
POCBA08
POCBA07
POCBA06
POCBA05
POCBA04
POCBA03
POCBA02 NLCBA00100240
CBA_[1..24]
CBA_[1..24]

COD0A024
D_A_24
COD0A021
D_A_21
COD0A022
D_A_22 COD0A023
D_A_23 PID0A02401 PID0A02402
PID0A02101 PID0A02102

NLCBA021 PID0A02201 PID0A02202


PID0A02301 PID0A02302
NLCBA024
CBA_24
CBA_21 CORL0Reed0A24
RL_Reed_A24
24V NLCBA023 24V
CORL0Reed0A21 24V CORL0Reed0A22 CBA_23 CORL0Reed0A23 1 2
RL_Reed_A21 NLCBA022
CBA_22 RL_Reed_A22 RL_Reed_A23 24V PIRL0Reed0A2401 PIRL0Reed0A2402

1 2 1 2 1 2
PIRL0Reed0A2101 PIRL0Reed0A2102 PIRL0Reed0A2201 PIRL0Reed0A2202 PIRL0Reed0A2301 PIRL0Reed0A2302
COM_1 3
PIRL0Reed0A2403
4
PIRL0Reed0A2404
NLHV0A24
HV_A24
NLCOM01
COM_1 3
PIRL0Reed0A2103
4
PIRL0Reed0A2104
NLHV0A21
HV_A21 COM_1 3
PIRL0Reed0A2203
4
PIRL0Reed0A2204
NLHV0A22
HV_A22 COM_1 3
PIRL0Reed0A2303
4
PIRL0Reed0A2304
NLHV0A23
HV_A23
D Title D
HV1_MTX_A

Size Number Revision


A4
Date: 5/08/2022 Sheet of Reading Board
File: C:\Users\..\HV1_MTX_A.SchDoc Drawn By: Rui Marques
1 2 3 4
1 2 3 4
COD0A025
D_A_25 COD0A026
D_A_26 COD0A027
D_A_27 COD0A028
D_A_28 COD0A029
D_A_29
PID0A02501 PID0A02502 PID0A02601 PID0A02602 PID0A02701 PID0A02702 PID0A02801 PID0A02802 PID0A02901 PID0A02902
Clearance Constraint [Clearance = 30mil]
HV_clear
24V NLCBA026 24V 24V 24V 24V i
NLCBA025
CBA_25 CBA_26 NLCBA027
CBA_27 NLCBA028
CBA_28 NLCBA029
CBA_29 POHV0A02500480
POHV0A48
POHV0A47
POHV0A46
POHV0A45
POHV0A44
POHV0A43
POHV0A42
POHV0A41
POHV0A40
POHV0A39
POHV0A38
POHV0A37
POHV0A36
POHV0A35
POHV0A34
POHV0A33
POHV0A32
POHV0A31
POHV0A30
POHV0A29
POHV0A28
POHV0A27
POHV0A26
POHV0A25
CORL0Reed0A25 CORL0Reed0A26 CORL0Reed0A27 CORL0Reed0A28 CORL0Reed0A29 HV_A[25..48]
Clearance Constraint [Clearance RL_Reed_A25
= 30mil] RL_Reed_A26 RL_Reed_A27 RL_Reed_A28 RL_Reed_A29 HV_A25
HV_clear 1
PIRL0Reed0A2501
2
PIRL0Reed0A2502
1
PIRL0Reed0A2601
2
PIRL0Reed0A2602
1
PIRL0Reed0A2701
2
PIRL0Reed0A2702
1
PIRL0Reed0A2801
2
PIRL0Reed0A2802
1
PIRL0Reed0A2901
2
PIRL0Reed0A2902
HV_A26
A i HV_A27 A
POCOM01 COM_1PIRL0Reed0A2503
3 4 NLHV0A25
HV_A25 COM_1PIRL0Reed0A2603
3 4 NLHV0A26
HV_A26 COM_1PIRL0Reed0A2703
3 4 NLHV0A27
HV_A27 COM_1PIRL0Reed0A2803
3 4 NLHV0A28
HV_A28 COM_1PIRL0Reed0A2903
3 4 NLHV0A29
HV_A29 HV_A28
COM_1 PIRL0Reed0A2504 PIRL0Reed0A2604 PIRL0Reed0A2704 PIRL0Reed0A2804 PIRL0Reed0A2904
HV_A29
HV_A30
HV_A31
COD0A030
D_A_30 COD0A031
D_A_31 COD0A032
D_A_32 COD0A033
D_A_33 COD0A034
D_A_34 HV_A32
PID0A03001 PID0A03002 PID0A03101 PID0A03102 PID0A03201 PID0A03202 PID0A03301 PID0A03302 PID0A03401 PID0A03402 HV_A33
HV_A34
HV_A35
NLCBA030 24V NLCBA031 24V NLCBA032 24V NLCBA033 24V NLCBA034 24V
CBA_30 CBA_31 CBA_32 CBA_33 CBA_34 HV_A36
CORL0Reed0A30
RL_Reed_A30 CORL0Reed0A31
RL_Reed_A31 CORL0Reed0A32
RL_Reed_A32 CORL0Reed0A33
RL_Reed_A33 CORL0Reed0A34
RL_Reed_A34 HV_A37
1
PIRL0Reed0A3001 2
PIRL0Reed0A3002 1
PIRL0Reed0A3101 2
PIRL0Reed0A3102 1
PIRL0Reed0A3201 2
PIRL0Reed0A3202 1
PIRL0Reed0A3301 2
PIRL0Reed0A3302 1
PIRL0Reed0A3401 2
PIRL0Reed0A3402 HV_A38
HV_A39
COM_1 3 PIRL0Reed0A3003
4
PIRL0Reed0A3004
NLHV0A30
HV_A30 COM_1 3 PIRL0Reed0A3103
4
PIRL0Reed0A3104
NLHV0A31
HV_A31 COM_1 3 PIRL0Reed0A3203
4
PIRL0Reed0A3204
NLHV0A32
HV_A32 COM_1 3 PIRL0Reed0A3303
4
PIRL0Reed0A3304
NLHV0A33
HV_A33 COM_1 3 PIRL0Reed0A3403
4
PIRL0Reed0A3404
NLHV0A34
HV_A34 HV_A40
HV_A41
HV_A42
HV_A43
HV_A44
HV_A45
B COD0A035
D_A_35 COD0A036
D_A_36 COD0A037
D_A_37 COD0A038
D_A_38 COD0A039
D_A_39 HV_A46 B
PID0A03501 PID0A03502 PID0A03601 PID0A03602 PID0A03701 PID0A03702 PID0A03801 PID0A03802 PID0A03901 PID0A03902
HV_A47
HV_A48 NLHV0A02500480
HV_A[25..48]

NLCBA035 24V NLCBA036 24V NLCBA037 24V NLCBA038 24V NLCBA039 24V
CBA_35 CBA_36 CBA_37 CBA_38 CBA_39
CORL0Reed0A35
RL_Reed_A35 CORL0Reed0A36
RL_Reed_A36 CORL0Reed0A37
RL_Reed_A37 CORL0Reed0A38
RL_Reed_A38 CORL0Reed0A39
RL_Reed_A39 CBA_25
1
PIRL0Reed0A3501
2
PIRL0Reed0A3502
1
PIRL0Reed0A3601
2
PIRL0Reed0A3602
1
PIRL0Reed0A3701
2
PIRL0Reed0A3702
1
PIRL0Reed0A3801
2
PIRL0Reed0A3802
1
PIRL0Reed0A3901
2
PIRL0Reed0A3902
CBA_26
CBA_27
COM_1 3 PIRL0Reed0A3503
4
PIRL0Reed0A3504
NLHV0A35
HV_A35 COM_1 3 PIRL0Reed0A3603
4
PIRL0Reed0A3604
NLHV0A36
HV_A36 COM_1 3 PIRL0Reed0A3703
4
PIRL0Reed0A3704
NLHV0A37
HV_A37 COM_1 3 PIRL0Reed0A3803
4
PIRL0Reed0A3804
NLHV0A38
HV_A38 COM_1 3 PIRL0Reed0A3903
4
PIRL0Reed0A3904
NLHV0A39
HV_A39 CBA_28
CBA_29
CBA_30
CBA_31
CBA_32
COD0A040
D_A_40 COD0A041
D_A_41 COD0A042
D_A_42 COD0A043
D_A_43 COD0A044
D_A_44 CBA_33
PID0A04001 PID0A04002 PID0A04101 PID0A04102 PID0A04201 PID0A04202 PID0A04301 PID0A04302 PID0A04401 PID0A04402
CBA_34
CBA_35
CBA_36
NLCBA040 24V NLCBA041 24V NLCBA042 24V NLCBA043 24V NLCBA044 24V
CBA_40 CBA_41 CBA_42 CBA_43 CBA_44 CBA_37
CORL0Reed0A40
RL_Reed_A40 CORL0Reed0A41
RL_Reed_A41 CORL0Reed0A42
RL_Reed_A42 CORL0Reed0A43
RL_Reed_A43 CORL0Reed0A44
RL_Reed_A44 CBA_38
C 1
PIRL0Reed0A4001
2
PIRL0Reed0A4002
1
PIRL0Reed0A4101
2
PIRL0Reed0A4102
1
PIRL0Reed0A4201
2
PIRL0Reed0A4202
1
PIRL0Reed0A4301
2
PIRL0Reed0A4302
1
PIRL0Reed0A4401
2
PIRL0Reed0A4402
CBA_39 C
CBA_40
COM_1PIRL0Reed0A4003
3 4
PIRL0Reed0A4004
NLHV0A40
HV_A40 COM_1PIRL0Reed0A4103
3 4
PIRL0Reed0A4104
NLHV0A41
HV_A41 COM_1PIRL0Reed0A4203
3 4
PIRL0Reed0A4204
NLHV0A42
HV_A42 COM_1PIRL0Reed0A4303
3 4
PIRL0Reed0A4304
NLHV0A43
HV_A43 COM_1PIRL0Reed0A4403
3 4
PIRL0Reed0A4404
NLHV0A44
HV_A44 CBA_41
CBA_42
CBA_43
CBA_44
CBA_45
COD0A045
D_A_45 COD0A046
D_A_46 COD0A047
D_A_47 COD0A048
D_A_48 CBA_46
PID0A04501 PID0A04502 PID0A04601 PID0A04602 PID0A04701 PID0A04702 PID0A04801 PID0A04802
CBA_47
CBA_48
NLCBA002500480
CBA_[25..48]
NLCBA045 24V NLCBA046 24V NLCBA047 24V NLCBA048 24V
CBA_45 CBA_46 CBA_47 CBA_48
CORL0Reed0A45
RL_Reed_A45 CORL0Reed0A46
RL_Reed_A46 CORL0Reed0A47
RL_Reed_A47 CORL0Reed0A48
RL_Reed_A48 POCBA002500480
POCBA048
POCBA047
POCBA046
POCBA045
POCBA044
POCBA043
POCBA042
POCBA041
POCBA040
POCBA039
POCBA038
POCBA037
POCBA036
POCBA035
POCBA034
POCBA033
POCBA032
POCBA031
POCBA030
POCBA029
POCBA028
POCBA027
POCBA026
POCBA025
CBA_[25..48]
1
PIRL0Reed0A4501
2
PIRL0Reed0A4502
1
PIRL0Reed0A4601
2
PIRL0Reed0A4602
1
PIRL0Reed0A4701
2
PIRL0Reed0A4702
1
PIRL0Reed0A4801
2
PIRL0Reed0A4802

NLCOM01
COM_1PIRL0Reed0A4503
3 4
PIRL0Reed0A4504
NLHV0A45
HV_A45 COM_1PIRL0Reed0A4603
3 4
PIRL0Reed0A4604
NLHV0A46
HV_A46 COM_1PIRL0Reed0A4703
3 4
PIRL0Reed0A4704
NLHV0A47
HV_A47 COM_1PIRL0Reed0A4803
3 4
PIRL0Reed0A4804
NLHV0A48
HV_A48

D Title D
HV1_MTX_B

Size Number Revision


A4
Date: 5/08/2022 Sheet of Reading Board
File: C:\Users\..\HV1_MTX_B.SchDoc Drawn By: Rui Marques
1 2 3 4
1 2 3 4

COJ5
J5 COJ6
J6 COJ7
J7 COJ8
J8
1
PIJ501 1
PIJ601 1
PIJ701 1
PIJ801

14
PIJ5014
14
PIJ6014
14
PIJ7014
14
PIJ8014
A 2
PIJ502
27
PIJ5027
2
PIJ602
27
PIJ6027
2
PIJ702
27
PIJ7027
2
PIJ802
27
PIJ8027
A
15
PIJ5015
15
PIJ6015
15
PIJ7015
15
PIJ8015
3
PIJ503 26
PIJ5026 3
PIJ603 26
PIJ6026 3
PIJ703 26
PIJ7026 3
PIJ803 26
PIJ8026
16
PIJ5016
16
PIJ6016
16
PIJ7016
16
PIJ8016
NLHV0B1
HV_B1 4
PIJ504
HV_B13 4
PIJ604
HV_B25 4
PIJ704
HV_B37 4
PIJ804
NLHV0B2
HV_B2 17
PIJ5017
HV_B14 17
PIJ6017
HV_B26 17
PIJ7017
HV_B38 17
PIJ8017
NLHV0B3
HV_B3 5
PIJ505
HV_B15 5
PIJ605
HV_B27 5
PIJ705
HV_B39 5
PIJ805
NLHV0B4
HV_B4 18
PIJ5018
HV_B16 18
PIJ6018
HV_B28 18
PIJ7018
HV_B40 18
PIJ8018
NLHV0B5
HV_B5 6
PIJ506 HV_B17 6
PIJ606 HV_B29 6
PIJ706 HV_B41 6
PIJ806
NLHV0B6
HV_B6 19
PIJ5019
HV_B18 19
PIJ6019
HV_B30 19
PIJ7019
HV_B42 19
PIJ8019
NLHV0B7
HV_B7 7
PIJ507
HV_B19 7
PIJ607
HV_B31 7
PIJ707
HV_B43 7
PIJ807
NLHV0B8
HV_B8 20
PIJ5020
HV_B20 20
PIJ6020
HV_B32 20
PIJ7020
HV_B44 20
PIJ8020
NLHV0B9
HV_B9 8
PIJ508
HV_B21 8
PIJ608
HV_B33 8
PIJ708
HV_B45 8
PIJ808
NLHV0B10
HV_B10 21
PIJ5021 HV_B22 21
PIJ6021 HV_B34 21
PIJ7021 HV_B46 21
PIJ8021
NLHV0B11
HV_B11 9
PIJ509 HV_B23 9
PIJ609 HV_B35 9
PIJ709 HV_B47 9
PIJ809
NLHV0B12
HV_B12 22
PIJ5022
HV_B24 22
PIJ6022
HV_B36 22
PIJ7022
HV_B48 22
PIJ8022

10
PIJ5010
10
PIJ6010
10
PIJ7010
10
PIJ8010
23
PIJ5023
23
PIJ6023
23
PIJ7023
23
PIJ8023
11
PIJ5011 11
PIJ6011 11
PIJ7011 11
PIJ8011
B 24 24 24 24 B
PIJ5024 PIJ6024 PIJ7024 PIJ8024

12
PIJ5012
12
PIJ6012
12
PIJ7012
12
PIJ8012

25
PIJ5025
25
PIJ6025
25
PIJ7025
25
PIJ8025
13
PIJ5013
13
PIJ6013
13
PIJ7013
13
PIJ8013

A Connector 25 A Connector 25 A Connector 25 A Connector 25


GND GND GND GND

Clearance Constraint [Clearance = 30mil]


HV_clear
i
NLHV0B0100480
HV_B[1..48] POHV0B0100480
POHV0B48
POHV0B47
POHV0B46
POHV0B45
POHV0B44
POHV0B43
POHV0B42
POHV0B41
POHV0B40
POHV0B39
POHV0B38
POHV0B37
POHV0B36
POHV0B35
POHV0B34
POHV0B33
POHV0B32
POHV0B31
POHV0B30
POHV0B29
POHV0B28
POHV0B27
POHV0B26
POHV0B25
POHV0B24
POHV0B23
POHV0B22
POHV0B21
POHV0B20
POHV0B19
POHV0B18
POHV0B17
POHV0B16
POHV0B15
POHV0B14
POHV0B13
POHV0B12
POHV0B11
POHV0B10
POHV0B9
POHV0B8
POHV0B7
POHV0B6
POHV0B5
POHV0B4
POHV0B3
POHV0B2
POHV0B1
HV_B[1..48]
HV_B1
HV_B2
HV_B3 NLHV0B25
HV_B25
C NLHV0B26 C
HV_B4 HV_B26
HV_B5 NLHV0B27
HV_B27
HV_B6 NLHV0B28
HV_B28
HV_B7 NLHV0B29
HV_B29
HV_B8 NLHV0B30
HV_B30
HV_B9 NLHV0B31
HV_B31
HV_B10 NLHV0B32
HV_B32
HV_B11 NLHV0B33
HV_B33
HV_B12 NLHV0B34
HV_B34
NLHV0B13
HV_B13 NLHV0B35
HV_B35
NLHV0B14
HV_B14 NLHV0B36
HV_B36
NLHV0B15
HV_B15 NLHV0B37
HV_B37
NLHV0B16
HV_B16 NLHV0B38
HV_B38
NLHV0B17
HV_B17 NLHV0B39
HV_B39
NLHV0B18
HV_B18 NLHV0B40
HV_B40
NLHV0B19
HV_B19 NLHV0B41
HV_B41
NLHV0B20
HV_B20 NLHV0B42
HV_B42
NLHV0B21
HV_B21 NLHV0B43
HV_B43
D NLHV0B22
HV_B22 NLHV0B44
HV_B44 Title D
NLHV0B23
HV_B23 NLHV0B45
HV_B45 HV2_IN
NLHV0B24
HV_B24 NLHV0B46
HV_B46
NLHV0B47
HV_B47 Size Number Revision
NLHV0B48
HV_B48
A
Date: 5/08/2022 Sheet of Reading Board
File: C:\Users\..\HV2_IN.SchDoc Drawn By: Rui Marques
1 2 3 4
1 2 3 4

COD0B04
D_B_4 COD0B03
D_B_3 COD0B02
D_B_2 COD0B01
D_B_1
PID0B0401 PID0B0402 PID0B0301 PID0B0302 PID0B0201 PID0B0202 PID0B0101 PID0B0102
HV_B1
HV_B2
NLCBB04 24V NLCBB03 24V NLCBB02 24V NLCBB01 24V
CBB_4 CBB_3 CBB_2 CBB_1 HV_B3
Clearance Constraint [Clearance = 30mil] CORL0Reed0B4
RL_Reed_B4 CORL0Reed0B3
RL_Reed_B3 CORL0Reed0B2
RL_Reed_B2 CORL0Reed0B1
RL_Reed_B1 HV_B4
A HV_clear 1
PIRL0Reed0B401
2
PIRL0Reed0B402
1
PIRL0Reed0B301
2
PIRL0Reed0B302
1
PIRL0Reed0B201
2
PIRL0Reed0B202
1
PIRL0Reed0B101
2
PIRL0Reed0B102
HV_B5 A
i HV_B6
POCOM02 COM_2 3 4 NLHV0B4
HV_B4 COM_2 3 4 NLHV0B3
HV_B3 COM_2 3 4 NLHV0B2
HV_B2 COM_2 3 4 NLHV0B1
HV_B1 HV_B7
COM_2 PIRL0Reed0B403 PIRL0Reed0B404 PIRL0Reed0B303 PIRL0Reed0B304 PIRL0Reed0B203 PIRL0Reed0B204 PIRL0Reed0B103 PIRL0Reed0B104
HV_B8
HV_B9
HV_B10
COD0B05
D_B_5 COD0B06
D_B_6 COD0B07
D_B_7 COD0B08
D_B_8 HV_B11
PID0B0501 PID0B0502 PID0B0601 PID0B0602 PID0B0701 PID0B0702 PID0B0801 PID0B0802 HV_B12
HV_B13
HV_B14
NLCBB05 24V NLCBB06 24V NLCBB07 24V NLCBB08 24V
CBB_5 CBB_6 CBB_7 CBB_8 HV_B15
CORL0Reed0B5
RL_Reed_B5 CORL0Reed0B6
RL_Reed_B6 CORL0Reed0B7
RL_Reed_B7 CORL0Reed0B8
RL_Reed_B8 HV_B16
1
PIRL0Reed0B501 2
PIRL0Reed0B502 1
PIRL0Reed0B601 2
PIRL0Reed0B602 1
PIRL0Reed0B701 2
PIRL0Reed0B702 1
PIRL0Reed0B801 2
PIRL0Reed0B802 HV_B17
HV_B18
COM_2PIRL0Reed0B503
3 4
PIRL0Reed0B504
NLHV0B5
HV_B5 COM_2PIRL0Reed0B603
3 4
PIRL0Reed0B604
NLHV0B6
HV_B6 COM_2PIRL0Reed0B703
3 4
PIRL0Reed0B704
NLHV0B7
HV_B7 COM_2PIRL0Reed0B803
3 4
PIRL0Reed0B804
NLHV0B8
HV_B8 HV_B19
HV_B20
HV_B21
COD0B09
D_B_9 COD0B010
D_B_10 COD0B011
D_B_11 COD0B012
D_B_12 Clearance Constraint
HV_B22
[Clearance = 30mil]
PID0B0901 PID0B0902 PID0B01001 PID0B01002 PID0B01101 PID0B01102 PID0B01201 PID0B01202
HV_B23
HV_Blear
B HV_B24i B
24V 24V 24V 24V POHV0B0100240
POHV0B24
POHV0B23
POHV0B22
POHV0B21
POHV0B20
POHV0B19
POHV0B18
POHV0B17
POHV0B16
POHV0B15
POHV0B14
POHV0B13
POHV0B12
POHV0B11
POHV0B10
POHV0B9
POHV0B8
POHV0B7
POHV0B6
POHV0B5
POHV0B4
POHV0B3
POHV0B2
POHV0B1
HV_B[1..24]
NLCBB09
CBB_9 NLCBB010
CBB_10 NLCBB011
CBB_11 NLCBB012
CBB_12
CORL0Reed0B9
RL_Reed_B9 CORL0Reed0B10
RL_Reed_B10 CORL0Reed0B11
RL_Reed_B11 CORL0Reed0B12
RL_Reed_B12
1
PIRL0Reed0B901
2
PIRL0Reed0B902
1
PIRL0Reed0B1001
2
PIRL0Reed0B1002
1
PIRL0Reed0B1101
2
PIRL0Reed0B1102
1
PIRL0Reed0B1201
2
PIRL0Reed0B1202

COM_2PIRL0Reed0B903
3 4
PIRL0Reed0B904
NLHV0B9
HV_B9 COM_2PIRL0Reed0B1003
3 4
PIRL0Reed0B1004
NLHV0B10
HV_B10 COM_2PIRL0Reed0B1103
3 4
PIRL0Reed0B1104
NLHV0B11
HV_B11 COM_2PIRL0Reed0B1203
3 4
PIRL0Reed0B1204
NLHV0B12
HV_B12
CBB_24
CBB_23
COD0B013
D_B_13 COD0B014
D_B_14 COD0B015
D_B_15 COD0B016
D_B_16 CBB_22
PID0B01301 PID0B01302 PID0B01401 PID0B01402 PID0B01501 PID0B01502 PID0B01601 PID0B01602
CBB_21
CBB_20
CBB_19
NLCBB013 24V NLCBB014 24V NLCBB015 24V NLCBB016 24V
CBB_13 CBB_14 CBB_15 CBB_16 CBB_18
CORL0Reed0B13
RL_Reed_B13 CORL0Reed0B14
RL_Reed_B14 CORL0Reed0B15
RL_Reed_B15 CORL0Reed0B16
RL_Reed_B16 CBB_17
1
PIRL0Reed0B1301
2
PIRL0Reed0B1302
1
PIRL0Reed0B1401
2
PIRL0Reed0B1402
1
PIRL0Reed0B1501
2
PIRL0Reed0B1502
1
PIRL0Reed0B1601
2
PIRL0Reed0B1602
CBB_16
CBB_15
COM_2PIRL0Reed0B1303
3 4
PIRL0Reed0B1304
NLHV0B13
HV_B13 COM_2PIRL0Reed0B1403
3 4
PIRL0Reed0B1404
NLHV0B14
HV_B14 COM_2PIRL0Reed0B1503
3 4
PIRL0Reed0B1504
NLHV0B15
HV_B15 COM_2PIRL0Reed0B1603
3 4
PIRL0Reed0B1604
NLHV0B16
HV_B16 CBB_14
CBB_13
C CBB_12 C
CBB_11
COD0B017
D_B_17 COD0B018
D_B_18 COD0B019
D_B_19 COD0B020
D_B_20 CBB_10
PID0B01701 PID0B01702 PID0B01801 PID0B01802 PID0B01901 PID0B01902 PID0B02001 PID0B02002 CBB_9
CBB_8
CBB_7
NLCBB017 24V NLCBB018 24V NLCBB019 24V NLCBB020 24V
CBB_17 CBB_18 CBB_19 CBB_20 CBB_6
CORL0Reed0B17
RL_Reed_B17 CORL0Reed0B18
RL_Reed_B18 CORL0Reed0B19
RL_Reed_B19 CORL0Reed0B20
RL_Reed_B20 CBB_5
1
PIRL0Reed0B1701
2
PIRL0Reed0B1702
1
PIRL0Reed0B1801
2
PIRL0Reed0B1802
1
PIRL0Reed0B1901
2
PIRL0Reed0B1902
1
PIRL0Reed0B2001
2
PIRL0Reed0B2002
CBB_4
CBB_3
COM_2PIRL0Reed0B1703
3 4
PIRL0Reed0B1704
NLHV0B17
HV_B17 COM_2PIRL0Reed0B1803
3 4
PIRL0Reed0B1804
NLHV0B18
HV_B18 COM_2PIRL0Reed0B1903
3 4
PIRL0Reed0B1904
NLHV0B19
HV_B19 COM_2PIRL0Reed0B2003
3 4
PIRL0Reed0B2004
NLHV0B20
HV_B20 CBB_2
CBB_1
POCBB00100240
POCBB024
POCBB023
POCBB022
POCBB021
POCBB020
POCBB019
POCBB018
POCBB017
POCBB016
POCBB015
POCBB014
POCBB013
POCBB012
POCBB011
POCBB010
POCBB09
POCBB08
POCBB07
POCBB06
POCBB05
POCBB04
POCBB03
POCBB02
POCBB01 NLCBB00100240
CBB_[1..24]
CBB_[1..24]
COD0B021
D_B_21 COD0B022
D_B_22 COD0B023
D_B_23 COD0B024
D_B_24
PID0B02101 PID0B02102 PID0B02201 PID0B02202 PID0B02301 PID0B02302 PID0B02401 PID0B02402

NLCBB021 24V NLCBB022 24V NLCBB023 24V NLCBB024 24V


CBB_21 CBB_22 CBB_23 CBB_24
D CORL0Reed0B21
RL_Reed_B21 CORL0Reed0B22
RL_Reed_B22 CORL0Reed0B23
RL_Reed_B23 CORL0Reed0B24
RL_Reed_B24 Title D
1
PIRL0Reed0B2101
2
PIRL0Reed0B2102
1
PIRL0Reed0B2201
2
PIRL0Reed0B2202
1
PIRL0Reed0B2301
2
PIRL0Reed0B2302
1
PIRL0Reed0B2401
2
PIRL0Reed0B2402
HV2_MTX_A

NLCOM02
COM_2PIRL0Reed0B2103
3 4
PIRL0Reed0B2104
NLHV0B21
HV_B21 COM_2PIRL0Reed0B2203
3 4
PIRL0Reed0B2204
NLHV0B22
HV_B22 COM_2PIRL0Reed0B2303
3 4
PIRL0Reed0B2304
NLHV0B23
HV_B23 COM_2PIRL0Reed0B2403
3 4
PIRL0Reed0B2404
NLHV0B24
HV_B24 Size Number Revision
A4
Date: 5/08/2022 Sheet of Reading Board
File: C:\Users\..\HV2_MTX_A.SchDoc Drawn By: Rui Marques
1 2 3 4
1 2 3 4

COD0B025
D_B_25 COD0B026
D_B_26 COD0B027
D_B_27 COD0B028
D_B_28
PID0B02501 PID0B02502 PID0B02601 PID0B02602 PID0B02701 PID0B02702 PID0B02801 PID0B02802
Clearance Constraint [Clearance = 30mil]
HV_Blear
24V 24V 24V 24V i
NLCBB025
CBB_25 NLCBB026
CBB_26 NLCBB027
CBB_27 NLCBB028
CBB_28
CORL0Reed0B25 CORL0Reed0B26 CORL0Reed0B27 CORL0Reed0B28 POHV0B02500480
POHV0B48
POHV0B47
POHV0B46
POHV0B45
POHV0B44
POHV0B43
POHV0B42
POHV0B41
POHV0B40
POHV0B39
POHV0B38
POHV0B37
POHV0B36
POHV0B35
POHV0B34
POHV0B33
POHV0B32
POHV0B31
POHV0B30
POHV0B29
POHV0B28
POHV0B27
POHV0B26
POHV0B25
HV_B[25..48]
A Clearance Constraint [Clearance
RL_Reed_B25 = 30mil] RL_Reed_B26 RL_Reed_B27 RL_Reed_B28 HV_B25 A
HV_Blear 1
PIRL0Reed0B2501 2
PIRL0Reed0B2502 1
PIRL0Reed0B2601 2
PIRL0Reed0B2602 1
PIRL0Reed0B2701 2
PIRL0Reed0B2702 1
PIRL0Reed0B2801 2
PIRL0Reed0B2802 HV_B26
i HV_B27
COM_2PIRL0Reed0B2503
3 4 NLHV0B25
HV_B25 COM_2PIRL0Reed0B2603
3 4 NLHV0B26
HV_B26 COM_2PIRL0Reed0B2703
3 4 NLHV0B27
HV_B27 COM_2PIRL0Reed0B2803
3 4 NLHV0B28
HV_B28 HV_B28
POCOM02
COM_2 PIRL0Reed0B2504 PIRL0Reed0B2604 PIRL0Reed0B2704 PIRL0Reed0B2804
HV_B29
HV_B30
COD0B029
D_B_29 COD0B030
D_B_30 COD0B031
D_B_31 COD0B032
D_B_32 HV_B31
PID0B02901 PID0B02902 PID0B03001 PID0B03002 PID0B03101 PID0B03102 PID0B03201 PID0B03202 HV_B32
HV_B33
HV_B34
NLCBB029 24V NLCBB030 24V NLCBB031 24V NLCBB032 24V
CBB_29 CBB_30 CBB_31 CBB_32 HV_B35
CORL0Reed0B29
RL_Reed_B29 CORL0Reed0B30
RL_Reed_B30 CORL0Reed0B31
RL_Reed_B31 CORL0Reed0B32
RL_Reed_B32 HV_B36
1
PIRL0Reed0B2901 2
PIRL0Reed0B2902 1
PIRL0Reed0B3001 2
PIRL0Reed0B3002 1
PIRL0Reed0B3101 2
PIRL0Reed0B3102 1
PIRL0Reed0B3201 2
PIRL0Reed0B3202 HV_B37
HV_B38
COM_2PIRL0Reed0B2903
3 4
PIRL0Reed0B2904
NLHV0B29
HV_B29 COM_2PIRL0Reed0B3003
3 4
PIRL0Reed0B3004
NLHV0B30
HV_B30 COM_2PIRL0Reed0B3103
3 4
PIRL0Reed0B3104
NLHV0B31
HV_B31 COM_2PIRL0Reed0B3203
3 4
PIRL0Reed0B3204
NLHV0B32
HV_B32 HV_B39
HV_B40
HV_B41
COD0B033
D_B_33 COD0B034
D_B_34 COD0B035
D_B_35 COD0B036
D_B_36 HV_B42
PID0B03301 PID0B03302 PID0B03401 PID0B03402 PID0B03501 PID0B03502 PID0B03601 PID0B03602
HV_B43
B HV_B44 B
HV_B45
NLCBB033 24V NLCBB034 24V NLCBB035 24V NLCBB036 24V
CBB_33 CBB_34 CBB_35 CBB_36 HV_B46
CORL0Reed0B33
RL_Reed_B33 CORL0Reed0B34
RL_Reed_B34 CORL0Reed0B35
RL_Reed_B35 CORL0Reed0B36
RL_Reed_B36 HV_B47
1
PIRL0Reed0B3301
2
PIRL0Reed0B3302
1
PIRL0Reed0B3401
2
PIRL0Reed0B3402
1
PIRL0Reed0B3501
2
PIRL0Reed0B3502
1
PIRL0Reed0B3601
2
PIRL0Reed0B3602
HV_B48 NLHV0B02500480
HV_B[25..48]

COM_2PIRL0Reed0B3303
3 4
PIRL0Reed0B3304
NLHV0B33
HV_B33 COM_2PIRL0Reed0B3403
3 4
PIRL0Reed0B3404
NLHV0B34
HV_B34 COM_2PIRL0Reed0B3503
3 4
PIRL0Reed0B3504
NLHV0B35
HV_B35 COM_2PIRL0Reed0B3603
3 4
PIRL0Reed0B3604
NLHV0B36
HV_B36
CBB_25
CBB_26
COD0B037
D_B_37 COD0B038
D_B_38 COD0B039
D_B_39 COD0B040
D_B_40 CBB_27
PID0B03701 PID0B03702 PID0B03801 PID0B03802 PID0B03901 PID0B03902 PID0B04001 PID0B04002
CBB_28
CBB_29
CBB_30
NLCBB037 24V NLCBB038 24V NLCBB039 24V NLCBB040 24V
CBB_37 CBB_38 CBB_39 CBB_40 CBB_31
CORL0Reed0B37
RL_Reed_B37 CORL0Reed0B38
RL_Reed_B38 CORL0Reed0B39
RL_Reed_B39 CORL0Reed0B40
RL_Reed_B40 CBB_32
1
PIRL0Reed0B3701
2
PIRL0Reed0B3702
1
PIRL0Reed0B3801
2
PIRL0Reed0B3802
1
PIRL0Reed0B3901
2
PIRL0Reed0B3902
1
PIRL0Reed0B4001
2
PIRL0Reed0B4002
CBB_33
CBB_34
COM_2PIRL0Reed0B3703
3 4
PIRL0Reed0B3704
NLHV0B37
HV_B37 COM_2PIRL0Reed0B3803
3 4
PIRL0Reed0B3804
NLHV0B38
HV_B38 COM_2PIRL0Reed0B3903
3 4
PIRL0Reed0B3904
NLHV0B39
HV_B39 COM_2PIRL0Reed0B4003
3 4
PIRL0Reed0B4004
NLHV0B40
HV_B40 CBB_35
CBB_36
C CBB_37 C
CBB_38
COD0B041
D_B_41 COD0B042
D_B_42 COD0B043
D_B_43 COD0B044
D_B_44 CBB_39
PID0B04101 PID0B04102 PID0B04201 PID0B04202 PID0B04301 PID0B04302 PID0B04401 PID0B04402 CBB_40
CBB_41
CBB_42
NLCBB041 24V NLCBB042 24V NLCBB043 24V NLCBB044 24V
CBB_41 CBB_42 CBB_43 CBB_44 CBB_43
CORL0Reed0B41
RL_Reed_B41 CORL0Reed0B42
RL_Reed_B42 CORL0Reed0B43
RL_Reed_B43 CORL0Reed0B44
RL_Reed_B44 CBB_44
1
PIRL0Reed0B4101
2
PIRL0Reed0B4102
1
PIRL0Reed0B4201
2
PIRL0Reed0B4202
1
PIRL0Reed0B4301
2
PIRL0Reed0B4302
1
PIRL0Reed0B4401
2
PIRL0Reed0B4402
CBB_45
CBB_46
COM_2PIRL0Reed0B4103
3 4
PIRL0Reed0B4104
NLHV0B41
HV_B41 COM_2PIRL0Reed0B4203
3 4
PIRL0Reed0B4204
NLHV0B42
HV_B42 COM_2PIRL0Reed0B4303
3 4
PIRL0Reed0B4304
NLHV0B43
HV_B43 COM_2PIRL0Reed0B4403
3 4
PIRL0Reed0B4404
NLHV0B44
HV_B44 CBB_47
CBB_48
NLCBB002500480
CBB_[25..48]
COD0B045
D_B_45 COD0B046
D_B_46 COD0B047
D_B_47 COD0B048
D_B_48
POCBB002500480
POCBB048
POCBB047
POCBB046
POCBB045
POCBB044
POCBB043
POCBB042
POCBB041
POCBB040
POCBB039
POCBB038
POCBB037
POCBB036
POCBB035
POCBB034
POCBB033
POCBB032
POCBB031
POCBB030
POCBB029
POCBB028
POCBB027
POCBB026
POCBB025
CBB_[25..48]
PID0B04501 PID0B04502 PID0B04601 PID0B04602 PID0B04701 PID0B04702 PID0B04801 PID0B04802

NLCBB045 24V NLCBB046 24V NLCBB047 24V NLCBB048 24V


CBB_45 CBB_46 CBB_47 CBB_48
D CORL0Reed0B45
RL_Reed_B45 CORL0Reed0B46
RL_Reed_B46 CORL0Reed0B47
RL_Reed_B47 CORL0Reed0B48
RL_Reed_B48 Title D
1
PIRL0Reed0B4501
2
PIRL0Reed0B4502
1
PIRL0Reed0B4601
2
PIRL0Reed0B4602
1
PIRL0Reed0B4701
2
PIRL0Reed0B4702
1
PIRL0Reed0B4801
2
PIRL0Reed0B4802
HV2_MTX_B

NLCOM02
COM_2PIRL0Reed0B4503
3 4
PIRL0Reed0B4504
NLHV0B45
HV_B45 COM_2PIRL0Reed0B4603
3 4
PIRL0Reed0B4604
NLHV0B46
HV_B46 COM_2PIRL0Reed0B4703
3 4
PIRL0Reed0B4704
NLHV0B47
HV_B47 COM_2PIRL0Reed0B4803
3 4
PIRL0Reed0B4804
NLHV0B48
HV_B48 Size Number Revision
A4
Date: 5/08/2022 Sheet of Reading Board
File: C:\Users\..\HV2_MTX_B.SchDoc Drawn By: Rui Marques
1 2 3 4
1 2 3 4

3.3V

PIC0PINV0L10 1 COC0P0INV0LV101
PIC0 NV0L120
COLVs
LVs C_P_INV_LV1_1 COC0P0INV0LV102
C_P_INV_LV1_2
PIC0PINV0L10 2 22n 2µ2
PILVs01
1 2 PILVs02

PILVs03
3 4 PILVs04
NLNeg0LV1
Neg_LV1 PIC0 NV0L120
A COAMP0INV0Neg
AMP_INV_Neg A
PILVs05
5 6 PILVs06
7 1
PILVs07
7 8 PILVs08
NLRead0LV2
PIAMP0INV0Neg07
+VS 1 RG PIAMP0INV0Neg01
Read_LV2 8 GND
PILVs09
9 10 PILVs010
2 RG PIAMP0INV0Neg08
GND
PILVs011
11 12 PILVs012
3
PILVs013
13 14 PILVs014
NLRead0LV3 GND PIAMP0INV0Neg03
+ PIC0N IV0L120
Read_LV3 6 Read_LV1
PILVs015
15 16 PILVs016
COR0NEG01 PIAMP0INV0Neg06
Neg_LV1 PIR0NEG0101R_NEG_1 2 COC0NP0INV0LV102
C_NP_INV_LV1_2
PILVs017
17 18 PILVs018 PIR0NEG0102 PIAMP0INV0Neg02
- 2µ2 PIC0NPIV0L1 02 COC0NP0INV0LV101
300K PIR0NEG02 C_NP_INV_LV1_1
PILVs019
19 20 PILVs020
NLRead0LV4 COR0NEG02
R_NEG_2 PIC0N IV0L120
Read_LV4 PIC0NPINV0L10 1 22n
PILVs021
21 22 PILVs022

100K 5 4
PILVs023
23 24 PILVs024
PIR0NEG021 GND PIAMP0INV0Neg05
REF -VS PIAMP0INV0Neg04
-3.3V
PILVs025
25 26 PILVs026
INA828ID
Header 13X2

GND

GND

B B

COT0LV
T_LV
Coletor_LV1PIT0LV01
1 16
C1_1 E1 PIT0LV016
GND COR0LV1
R_LV1 NLSwitch0LV1
2 15 Switch_LV1 POSwitch0LV1
NLColetor0LV2
PIT0LV02
C1_2 B1 PIT0LV015 PIR0LV101PIR0LV102
Switch_LV1
Coletor_LV2PIT0LV03
3 14 22k
C2_1 E2 PIT0LV014
GND COR0LV2
R_LV2 NLSwitch0LV2
4 13 Switch_LV2 POSwitch0LV2
NLColetor0LV3 C2_2
PIT0LV04
B2 PIT0LV013 PIR0LV201 PIR0LV202
Switch_LV2
Coletor_LV3PIT0LV05
5 12 22k
C3_1 E3 PIT0LV012
GND COR0LV3
R_LV3 NLSwitch0LV3
6 11 Switch_LV3 POSwitch0LV3
NLColetor0LV4
PIT0LV06
C3_2 B3 PIT0LV011 PIR0LV301 PIR0LV302
Switch_LV3
Coletor_LV4PIT0LV07
7 10 22k
8
C4_1 E4 PIT0LV010
9
GND COR0LV4
R_LV4 NLSwitch0LV4
Switch_LV4
PIT0LV08
C4_2 B4 PIT0LV09 PIR0LV401 PIR0LV402 POSwitch0LV4
Switch_LV4
22k
MMPQ2222A

C C
COD0LV1
D_LV1 COD0LV2
D_LV2 COD0LV3
D_LV3 COD0LV4
D_LV4
PID0LV101 PID0LV102 PID0LV201 PID0LV202 PID0LV301 PID0LV302 PID0LV401 PID0LV402

NLColetor0LV1 24V 24V 24V 24V


Coletor_LV1 Coletor_LV2 Coletor_LV3 Coletor_LV4
CORL0LV1
RL_LV1 CORL0LV2
RL_LV2 CORL0LV3
RL_LV3 CORL0LV4
RL_LV4
1
PIRL0LV101
2
PIRL0LV102
1
PIRL0LV201
2
PIRL0LV202
1
PIRL0LV301
2
PIRL0LV302
1
PIRL0LV401
2
PIRL0LV402

NLCOM0LV
COM_LVPIRL0LV103
3 4 NLRead0LV1
Read_LV1 COM_LV PIRL0LV203
3 4 Read_LV2 COM_LV PIRL0LV303
3 4 Read_LV3 COM_LV PIRL0LV403
3 4 Read_LV4
POCOM0LV
COM_LV PIRL0LV104 PIRL0LV204 PIRL0LV304 PIRL0LV404

D Title D
Low Voltage

Size Number Revision


A4
Date: 5/08/2022 Sheet of Reading Board
File: C:\Users\..\Low voltage.SchDoc Drawn By: Rui Marques
1 2 3 4
1 2 3 4

A A

COVP24V
VP24V
PIVP24V01
1 2 PIVP24V02

24V PIVP24V03
3 4 PIVP24V04
24V
PIVP24V05
5 6 PIVP24V06

PIVP24V07
7 8 PIVP24V08

24V COConverter0303
Converter_3.3 3.3V Header 4X2 COTP0GND7
COTP0GND1
TP_GND1 COTP0GND2
TP_GND2 COTP0GND3
TP_GND3 COTP0GND4 TP_GND5 COTP0GND6
TP_GND4 COTP0GND5 TP_GND6 TP_GND7
1 3

1
PIC03 012 PIConverter030301
VIN VOUT PIConverter030303
PIC03 02 1 PIT0GND701
COC030301
PIT0GND10 PIT0GND21 PIT0GND301 PIT0GND401 PIT0GND501 PIT0GND601
C_3.3_1 2 PIC03 02 COC030302
C_3.3_2 5001 5001
GND PIConverter030302
5001 5001 5001 5001 5001
PIC03 01

2
GND
MEZD71201A-F
GND
GND
B B
GND

24V 24V

PIC1801 PIC1901
COC18
C18 COC19
C19
100µ 2.2µ
PIC1802 PIC1902

GND GND

COSupply HVCable
Supply HVCable
PISupply HVCable01
1 2 PISupply HVCable02

PISupply HVCable03
3 4 PISupply HVCable04
-3.3V
PISupply HVCable05
5 6 PISupply HVCable06

C PISupply HVCable07
7 8 PISupply HVCable08
C
PISupply HVCable09 9 10 PISupply HVCable010
24V
PISupply HVCable011
11 12 PISupply HVCable012

PISupply HVCable013
13 14 PISupply HVCable014

PISupply HVCable015
15 16 PISupply HVCable016
3.3V
PISupply HVCable017 17 18 PISupply HVCable018
PISupply HVCable019 19 20 PISupply HVCable020

Header 10X2

GND 24V

MAXM15465EVKIT#-ND 1 2
COConverter0to0N303
Converter_to_N3.3
PIC0N30101 PIC0N30102
GND
1 6 COC0N301
C_N3_1
PIConverter0to0N30301
Lx VIN PIConverter0to0N30306
2 7
-3.3V PIConverter0to0N30302
GND VIN PIConverter0to0N30307
3
PIConverter0to0N30303 *Reset
8
EN/ULO PIConverter0to0N30308
4 9
PIConverter0to0N30304
Mode VCC PIConverter0to0N30309

1
D 5 10 PIC0N3 01 Title D
PIConverter0to0N30305
OUT FB PIConverter0to0N303010

Power
DC_converter
2PIC0N3 02 COC0N303
C_N3.3
Size Number Revision
2PIC0N3030202 1
PIC0N3030201
A4
COC0N30302
C_N3.3_2 GND Date: 5/08/2022 Sheet of Reading Board
GND File: C:\Users\..\Power.SchDoc Drawn By: Rui Marques
1 2 3 4
1 2 3 4

Designator7
ADC.SchDoc COD0HVIN
D_HVIN
PID0HVIN01 PID0HVIN02
Clearance Constraint [Clearance = 30mil]
NLColetor0HVIN
Coletor_HVIN
24V
A CORL0HVIN
RL_HVIN HV_clear COHV0IN
HV_IN A
HV_clear A2 A1 i
PIRL0HVIN0A2 PIRL0HVIN0A1
NLHV0IN
PIHV0IN01
1 2 PIHV0IN02

i 12 HV_IN HV_IN PIHV0IN03 3


PIRL0HVIN012 4 PIHV0IN04
COM_readPIRL0HVIN011
11 14
PIRL0HVIN014 PIHV0IN05
5 6 PIHV0IN06

PIHV0IN07
7 8 PIHV0IN08

Clearance Constraint [Clearance = 30mil]


COD0COM1
D_COM1 Header 4X2
HV_clear i
PID0COM101 PID0COM102
Clearance Constraint [Clearance = 30mil]

NLColetor01
Coletor_1 GND
24V
CORL0COM1
RL_COM1 COM_HV COR0READ0I
R_READ_I
PIR0READ0I02 PIR0READ0I01
1
PIRL0COM101
2
PIRL0COM102 1 Ohms 1kV
COM_readPIRL0COM103
3 4 NLCOM01
COM_1 POCOM01 COBypass0PMT
Bypass_PMT
PIRL0COM104
COM_1
PIBypass0PMT01
1 2 PIBypass0PMT02

COD0COM2
D_COM2 PIBypas0HV2 PIBypas0HV1 PIBypass0PMT03
3 4 PIBypass0PMT04

Header 2X2

1
2
PID0COM201 PID0COM202
B GND PIR0DV102 B
NLColetor02
Coletor_2 COR0DRV01
R_DRV_1
24V COBypass0HV 1k Ohms 1kV
Bypass_HV
CORL0COM2
RL_COM2 Clearance Constraint [Clearance = 30mil] Header 2 PIR0DV10 PIR0DV20
1
PIRL0COM201
2
PIRL0COM202
HV_clear C_DRVPIC0DRV01
COC0DRV COR0DRV02
R_DRV_2
i 7.8M Ohms 1kV
NLCOM0read
COM_read 3 PIRL0COM203
4
PIRL0COM204
NLCOM02
COM_2 POCOM02
COM_2
PIC0DRV02 PIR0DV201

GND

COD0LV
D_LV
PID0LV01 PID0LV02
Clearance Constraint [Clearance = 30mil]
NLColetor0HVLV
Coletor_HVLV
24V
HV_clear
C A2
PIRL0HVLV0A2
A1
PIRL0HVLV0A1 i C
12 NLCOM0HV
COM_HV
PIRL0HVLV012
COR0BP0LV
R_BP_LV
POCOM0HVLVNLCOM0HVLV
COM_HVLV
COM_HVLV
11
PIRL0HVLV011
14
PIRL0HVLV014 PIR0BP0LV01 PIR0BP0LV02
NLCOM0LV
COM_LV POCOM0LV
COM_LV
1 Ohm
i
HV_clear
CORL0HVLV
RL_HVLV
PIBypas0LV2 PIBypas0LV1
1
2

Clearance Constraint [Clearance = 30mil] COT0HVR0SEL


T_HVR_SEL
Coletor_1 1 16
COBypass0LV
PIT0HVR0SEL01
C1_1 E1 PIT0HVR0SEL016
GND COR0COM1
R_COM1 NLHVR0COM1
Bypass_LV 2 15 HVR_COM1 POHVR0COM1
PIT0HVR0SEL02
C1_2 B1 PIT0HVR0SEL015 PIR0COM101 PIR0COM102
HVR_COM1
Header 2 Coletor_2 3 14 22k
PIT0HVR0SEL03
C2_1 E2 PIT0HVR0SEL014
GND COR0COM2
R_COM2 NLHVR0COM2
4 13 HVR_COM2 POHVR0COM2
PIT0HVR0SEL04
C2_2 B2 PIT0HVR0SEL013 PIR0COM201 PIR0COM202
HVR_COM2
Coletor_HVIN 5 12 22k
PIT0HVR0SEL05
C3_1 E3 PIT0HVR0SEL012
GND COR0READ
R_READ NLSwitch0HVIN
6
PIT0HVR0SEL06 C3_2
11 Switch_HVIN POSwitch0HVIN
B3 PIT0HVR0SEL011 PIR0READ01 PIR0READ02 Switch_HVIN
Coletor_HVLV 7 10 10KOhm
PIT0HVR0SEL07
C4_1 E4 PIT0HVR0SEL010
GND COR0READ0LV
R_READ_LV NLSwitch0HVLV
8 9 Switch_HVLV POSwitch0HVLV
PIT0HVR0SEL08
C4_2 B4 PIT0HVR0SEL09 PIR0READ0LV01 PIR0READ0LV02
Switch_HVLV
10KOhm
MMPQ2222A

D Title D
Reading Relays

Size Number Revision


A
Date: 5/08/2022 Sheet of Reading Board
File: C:\Users\..\Reading_Relays.SchDoc Drawn By: Rui Marques
1 2 3 4
Apêndice B

Código Implementado

1 import sys 38 self . timer = QtCore . QTimer ()


2 from threading import Thread 39 self . timer . timeout . connect ( self . update_plot_data )
3 from collections import deque 40 # new features
4 from typing import List 41 self . spi_var = spidev . SpiDev ()
5 import time 42 self . spi_var . open (0 ,0)
6 from PyQt5 import QtCore , QtWidgets 43 self . spi_var . max_speed_hz = 2*10**6
7 from PyQt5 . QtGui import * 44 self . GPIO = GPIO
8 from PyQt5 . QtWidgets import * 45 self . GPIO . setwarnings ( False )
9 from PyQt5 . QtCore import * 46 self . GPIO . setmode ( GPIO . BOARD )
10 from pyqtgraph import PlotWidget , plot 47 self . MCP1 = MCP23S17 ( self . spi_var , 0 b000 , -1 , 13 , self . GPIO )
11 import pyqtgraph as pg 48 self . MCP1 . configureMCP ()
12 import pyqtgraph . exporters 49 self . MCP2 = MCP23S17 ( self . spi_var , 0 b111 , -1 , 13 , self . GPIO )
13 import numpy as np 50 self . MCP2 . configureMCP ()
14 from random import randint 51 self . MCP3 = MCP23S17 ( self . spi_var , 0 b001 , -1 , 13 , self . GPIO )
15 import statistics 52 self . MCP3 . configureMCP ()
16 import time 53 self . read = Reading_code ( self . spi_var , self . MCP1 , self . MCP2 , self . GPIO )
17 # new features 54 self . read2 = Reading_code2 ( self . spi_var , self . MCP3 , self . GPIO )
18 import RPi . GPIO as GPIO 55 #
19 import spidev 56
20 from MCP23S17_v3 import MCP23S17 57 def m ai n _w in d ow _ co nf i g ( self ) :
21 from Reading_code import Reading_code 58 self . setGeometry (0 , 0 , 100 ,300)
22 from Reading_code2 import Reading_code2 59
23 # 60
24 61 self . matriz =[]
25 class MainWindow ( QMainWindow ) : 62 self . matriz_check =[]
26 63 global matriz_en
27 def __init__ ( self , * args , ** kwargs ) : 64 matriz_en =[ False , False , False , False ]
28 super ( MainWindow , self ) . __init__ (* args , ** kwargs ) 65 self . time =100
29 66 self . timer_2 = QtCore . QTimer ()
30 self . setWindowTitle ( " Reading Board Interface " ) 67 self . timer_2 . timeout . connect ( self . up d at e _p lo t _d a ta _2 )
31 68 self . timer_2 . setInterval (100)
32 69 self . timer_lv = QtCore . QTimer ()
33 70 self . timer_lv . timeout . connect ( self . u p d a t e _ p lo t _ d a t a _ l v )
34 self . tabs = QTabWidget () 71 self . timer_lv . setInterval (100)
35 self . ma i n_ w in do w _c o nf ig () 72 self . initiate = True
36 self . setCentralWidget ( self . tabs ) 73 self . two_tabs = False
37 74 self . reading_board =0

79
75 self . re a di n g_ bo a rd _ te mp =0 135
76 self . reading_channel =0 136 self . Time_text = QLabel ()
77 self . dic ={} 137 self . Time_text . setText ( " Time interval between measurements ( ms ) : " )
78 self . dic_2 ={} 138 self . Time_text . setAlignment ( Qt . AlignLeft )
79 self . dic_ch_stats ={} 139 self . time_layout . addWidget ( self . Time_text )
80 self . dic_stats ={} 140
81 self . last_ten =[] 141 self . select_time = QComboBox ()
82 self . last_ten_ch =[] 142 self . select_time . addItems ([ " 100 " , " 500 " , " 1000 " ," 10000 " ])
83 self . last_ten_b =[] 143 self . select_time . cu r r e n t I n d ex C h a n g e d . connect ( self . selectionchange )
84 self . dic_ind ={} 144 self . time_layout . addWidget ( self . select_time )
85 self . second = False 145
86 self . reading_stopped = False 146 # new features
87 self . stopped_lv = False 147 self . Time_text = QLabel ()
88 self . lv_start = True 148 self . Time_text . setText ( " Select reading mode : " )
89 self . first_average = True 149 self . Time_text . setAlignment ( Qt . AlignLeft )
90 self . type_read =0 150 self . modes_layout . addWidget ( self . Time_text )
91 151
92 self . max = -1 152 self . read_type = QComboBox ()
93 self . min =101 153 self . read_type . addItems ([ " Both / Sequencial " ," ADC " ," Voltmeter " ])
94 self . total =0 154 self . read_type . c u r r e n tI n d e x C h a n ge d . connect ( self . ReadingMode )
95 self . cont =0.0 155 self . modes_layout . addWidget ( self . read_type )
96 156
97 self . main = QWidget () 157 self . textAdc = QLabel ()
98 self . main_layout = QVBoxLayout () 158 self . textAdc . setText ( " ADC mode ( default Automatic ) : " )
99 self . header_layout = QVBoxLayout () 159 self . textAdc . setAlignment ( Qt . AlignLeft )
100 self . h ead er_ box _la yout = QVBoxLayout () 160 self . lect_layout = QGridLayout ()
101 self . check_box_layout = QGridLayout () 161 self . lect_layout . addWidget ( self . textAdc )
102 self . time_layout = QVBoxLayout () 162 self . automatic = QCheckBox ( " Manual " , self )
103 self . modes_layout = QVBoxLayout () 163 self . automatic . stateChanged . connect ( self . Manual )
104 self . start = QGridLayout () 164 self . lect_layout . addWidget ( self . automatic ,1 ,0)
105 165
106 self . header_main = QLabel () 166 self . ADC_layout = QGridLayout ()
107 self . header_main . setText ( " Choose the specifications for the reading test " ) 167 self . adc = []
108 self . header_main . setAlignment ( Qt . AlignCenter ) 168 self . adc_list =[]
109 self . header_layout . addWidget ( self . header_main ) 169 for i in range (0 ,3) :
110 170 self . adc_list . append ( False )
111 self . matrix_text = QLabel () 171 self . auto = True
112 self . matrix_text . setText ( " Select which boards to read : " ) 172 # #######################
113 self . matrix_text . setAlignment ( Qt . AlignLeft ) 173
114 self . h ead er_ box _la yout . addWidget ( self . matrix_text ) 174 self . start_text = QLabel ()
115 175 self . start_text . setText ( " When ready press the start button : " )
116 for i in range (0 ,4) : 176 self . start_text . setAlignment ( Qt . AlignLeft )
117 string = " Board " + str ( i +1) 177 self . start . addWidget ( self . start_text )
118 self . matriz . append ( QCheckBox ( string , self ) ) 178 self . start_button = QPushButton ( " Start Full board reading ( HV ) " )
119 179 self . start_button . clicked . connect ( lambda : self . start_func () )
120 self . matriz [0]. stateChanged . connect ( self . clickBox ) 180 self . start . addWidget ( self . start_button )
121 self . check_box_layout . addWidget ( self . matriz [0] ,1 ,0) 181
122 self . matriz [1]. stateChanged . connect ( self . clickBox_1 ) 182 self . individual_text = QLabel ()
123 self . check_box_layout . addWidget ( self . matriz [1] ,1 ,1) 183 self . individual_text . setText ( " To read the channels individual press : " )
124 self . matriz [2]. stateChanged . connect ( self . clickBox_2 ) 184 self . start . addWidget ( self . individual_text )
125 self . check_box_layout . addWidget ( self . matriz [2] ,1 ,2) 185 self . i ndi vid ual_ but ton = QPushButton ( " Individual channels ( HV ) " )
126 self . matriz [3]. stateChanged . connect ( self . clickBox_3 ) 186 self . i ndi vid ual_ but ton . clicked . connect ( lambda : self . r e a di n g _ i n d _ c ha n n e l () )
127 self . check_box_layout . addWidget ( self . matriz [3] ,1 ,3) 187 self . start . addWidget ( self . ind ivi dua l_b utt on )
128 188
129 # new features 189 self . lv_text = QLabel ()
130 self . hv_type = QComboBox () 190 self . lv_text . setText ( " To read low voltage sources : " )
131 self . hv_type . addItems ([ " HvTest V1 " ," HvTest V2 " ]) 191 self . start . addWidget ( self . lv_text )
132 self . hv_type . c u r re n t I n d e x C ha n g e d . connect ( self . HvTest ) 192 self . lv_button = QPushButton ( " Low voltages " )
133 self . time_layout . addWidget ( self . hv_type ) 193 self . lv_button . clicked . connect ( lambda : self . low_voltage_read () )
134 # # ### ### ### #### ### 194 self . start . addWidget ( self . lv_button )

80
195 255 self . adc_list [0]= False
196 self . main_layout . addLayout ( self . header_layout ) 256
197 self . main_layout . addLayout ( self . time_layout ) 257 def ADC2 ( self , state ) :
198 self . main_layout . addLayout ( self . h ead er_b ox_ lay out ) 258 if state == QtCore . Qt . Checked :
199 self . main_layout . addLayout ( self . check_box_layout ) 259 self . adc_list [1]= True
200 self . main_layout . addLayout ( self . modes_layout ) 260 else :
201 self . main_layout . addLayout ( self . lect_layout ) 261 self . adc_list [1]= False
202 self . main_layout . addLayout ( self . ADC_layout ) 262
203 self . main_layout . addLayout ( self . start ) 263 def ADC3 ( self , state ) :
204 self . main . setLayout ( self . main_layout ) 264 if state == QtCore . Qt . Checked :
205 self . tabs . addTab ( self . main , " Main " ) 265 self . adc_list [2]= True
206 266 else :
207 # new features 267 self . adc_list [2]= False
208 268
209 def HvTest ( self ) : 269 # #########
210 self . hvtest = self . hv_type . currentText () 270
211 if ( self . hvtest == " HvTest V1 " ) : 271 def clickBox ( self , state ) :
212 self . hv_version = True 272 if state == QtCore . Qt . Checked :
213 self . textAdc . show () 273 matriz_en [0]= True
214 self . automatic . show () 274 else :
215 275 matriz_en [0]= False
216 if ( self . hvtest == " HvTest V2 " ) : 276 def clickBox_1 ( self , state ) :
217 self . hv_version = False 277 if state == QtCore . Qt . Checked :
218 self . textAdc . hide () 278 matriz_en [1]= True
219 self . automatic . hide () 279 else :
220 280 matriz_en [1]= False
221 def ReadingMode ( self ) : 281 def clickBox_2 ( self , state ) :
222 self . read_mode = self . read_type . currentText () 282 if state == QtCore . Qt . Checked :
223 if ( self . read_mode == " Both / Sequencial " ) : 283 matriz_en [2]= True
224 self . type_read =0 284 else :
225 if ( self . read_mode == " ADC " ) : 285 matriz_en [2]= False
226 self . type_read =1 286 def clickBox_3 ( self , state ) :
227 if ( self . read_mode == " Voltmeter " ) : 287 if state == QtCore . Qt . Checked :
228 self . type_read =2 288 matriz_en [3]= True
229 289 else :
230 290 matriz_en [3]= False
231 def Manual ( self , state ) : 291
232 if state == QtCore . Qt . Checked : 292
233 293 def selectionchange ( self ) :
234 self . auto = False 294 self . time = int ( self . select_time . currentText () )
235 self . adc . append ( QCheckBox ( " ADC 1 " , self ) ) 295 self . timer . setInterval ( self . time )
236 self . adc [0]. stateChanged . connect ( self . ADC1 ) 296 self . timer_2 . setInterval ( self . time )
237 self . adc . append ( QCheckBox ( " ADC 2 " , self ) ) 297 self . main . setLayout ( self . main_layout )
238 self . adc [1]. stateChanged . connect ( self . ADC2 ) 298
239 self . adc . append ( QCheckBox ( " ADC 3 " , self ) ) 299 def start_func ( self ) :
240 self . adc [2]. stateChanged . connect ( self . ADC3 ) 300 if ( True in matriz_en ) :
241 self . ADC_layout . addWidget ( self . adc [0] ,2 ,0) 301 self . setGeometry (0 , 100 , 1000 ,700)
242 self . ADC_layout . addWidget ( self . adc [1] ,2 ,1) 302 self . st a rt _r e ad i ng _d a ta ()
243 self . ADC_layout . addWidget ( self . adc [2] ,2 ,2) 303 self . generate_plot ()
244 else : 304 self . change_layout ()
245 self . adc [0]. deleteLater () 305 self . timer . setInterval ( self . time )
246 self . adc [1]. deleteLater () 306 self . timer . start ()
247 self . adc [2]. deleteLater () 307
248 self . adc =[] 308 def s ta r t_ re a di n g_ da t a ( self ) :
249 self . auto = True 309 global data
250 310 self . to_read =[]
251 def ADC1 ( self , state ) : 311 data =[]
252 if state == QtCore . Qt . Checked : 312 global string_new
253 self . adc_list [0]= True 313 string_new = " "
254 else : 314 count =0

81
315 for i in range (0 ,4) : 375 self . table_ch . r e s i z e R o w s T o C o n t e n t s ()
316 if matriz_en [ i ]: 376 self . table_ch . s e t V e r t i c a l S c r o l l B a r P o l i c y ( Qt . S cr ol l Ba r Al wa y sO f f )
317 count +=1 377
318 string_new =( string_new + " ," + str ( i +1) ) 378 self . table_ch_stats = pg . TableWidget ()
319 self . to_read . append ( str ( i +1) ) 379 self . table_ch_stats . horizontalHeader () . setVisible ( False )
320 data . append ([]) 380 self . table_ch_stats . r e s i z e C o l u m n s T o C o n t e n t s ()
321 for j in range (0 ,48) : 381 self . table_ch_stats . r e s i z e R o w s T o C o n t e n t s ()
322 data [ len ( data ) -1]. append ([0]) 382 self . table_ch_stats . s e t V e r t i c a l S c r o l l B a r P o l i c y ( Qt . S c ro ll B ar A lw ay s Of f )
323 if ( count <2) : 383
324 string_new = string_new [ -1:] 384 self . table . setData ( self . dic )
325 string_new = " Readings are being made on board " + string_new 385 self . table_stats . setData ( self . dic )
326 else : 386 self . table_ch . setData ( self . dic )
327 string_new = string_new [1: -2]+ " and " + string_new [ -1:] 387 self . table_ch_stats . setData ( self . dic )
328 string_new = " Readings are being made on boards " + string_new + " . " 388
329 time_stamp = time . time () 389 self . plot_layout_read . addWidget ( self . table_ch_stats )
330 time_stamp = int ( time_stamp ) 390
331 self . file_opened = ’ data_ ’+ str ( time_stamp ) + ’. txt ’ 391 self . table_layout_ch = QVBoxLayout ()
332 workbook = open ( self . file_opened , " w " ) 392 self . table_layout_ch . addWidget ( self . table_ch )
333 for board in self . to_read : 393
334 str_b = " Board " + board 394 self . Time_text = QLabel ()
335 workbook . write ( str_b ) 395 self . time_str = " One measurement every " + str ( float ( self . time ) /1000) + " s . "
336 for i in range (0 ,48) : 396 self . Time_text . setText ( self . time_str )
337 workbook . write ( " \ t " ) 397 self . Time_text . setAlignment ( Qt . AlignCenter )
338 workbook . write ( " \ n " ) 398 self . time_layout . addWidget ( self . Time_text )
339 for board in self . to_read : 399
340 for i in range (0 ,48) : 400 self . Time_text = QLabel ()
341 str_ch = " Ch " + str ( i +1) + " \ t " 401 self . time_str = " Currently reading from board " + self . to_read [0]+ " . "
342 workbook . write ( str_ch ) 402 self . Time_text . setText ( self . time_str )
343 workbook . write ( " \ n " ) 403 self . Time_text . setAlignment ( Qt . AlignCenter )
344 workbook . close () 404 self . time_layout . addWidget ( self . Time_text )
345 405
346 def change_layout ( self ) : 406 self . right_button = QPushButton ( " >" )
347 self . main_read = QWidget () 407 self . right_button . clicked . connect ( lambda : self . right_func () )
348 self . main_layout = QVBoxLayout () 408 self . plot_layout . addWidget ( self . right_button )
349 self . time_layout = QVBoxLayout () 409
350 self . table_layout = QVBoxLayout () 410 self . stop_button = QPushButton ( " Stop " )
351 self . stop = QHBoxLayout () 411 self . stop_button . clicked . connect ( lambda : self . stop_func () )
352 412 self . plot_layout . addWidget ( self . table_stats )
353 self . matrix_text = QLabel () 413 self . table_layout . addWidget ( self . table )
354 self . matrix_text . setText ( string_new ) 414 self . stop . addWidget ( self . stop_button )
355 self . matrix_text . setAlignment ( Qt . AlignCenter ) 415
356 self . time_layout . addWidget ( self . matrix_text ) 416
357 417 self . main_layout . addLayout ( self . time_layout )
358 self . table = pg . TableWidget () 418 self . main_layout . addLayout ( self . plot_layout )
359 self . table . horizontalHeader () . setVisible ( False ) 419 self . main_layout . addLayout ( self . table_layout )
360 self . table . r e s i z e C o l u m n s T o C o n t e n t s () 420 self . main_layout . addLayout ( self . stop )
361 self . table . r e s i z e R o w s T o C o n t e n t s () 421 self . main_read . setLayout ( self . main_layout )
362 self . table . s e t V e r t i c a l S c r o l l B a r P o l i c y ( Qt . S c ro l lB ar A lw a ys Of f ) 422
363 self . table . s e t H o r i z o n t a l S c r o l l B a r P o l i c y ( Qt . S cr ol l Ba r Al wa y sO ff ) 423 self . ind_read = QWidget ()
364 424 self . ind_layout = QVBoxLayout ()
365 self . table_stats = pg . TableWidget () 425 self . selection_layout = QHBoxLayout ()
366 self . table_stats . horizontalHeader () . setVisible ( False ) 426 self . s e l e ct i o n _ c h _ l a yo u t = QHBoxLayout ()
367 self . table_stats . r e s i z e C o l u m n s T o C o n t e n t s () 427
368 self . table_stats . r e s i z e R o w s T o C o n t e n t s () 428 self . board_text = QLabel ()
369 self . table_stats . s e t V e r t i c a l S c r o l l B a r P o l i c y ( Qt . Sc r ol lB a rA l wa ys O ff ) 429 self . board_text . setText ( " Board : " )
370 self . table_stats . s e t H o r i z o n t a l S c r o l l B a r P o l i c y ( Qt . S cr o ll B ar Al w ay s Of f ) 430 self . board_select = QComboBox ()
371 431 self . board_select . addItems ( self . to_read )
372 self . table_ch = pg . TableWidget () 432 self . board_select . c u rr e n t I n d e x Ch a n g e d . connect ( self . boardchange )
373 self . table_ch . horizontalHeader () . setVisible ( False ) 433
374 self . table_ch . r e s i z e C o l u m n s T o C o n t e n t s () 434 self . selection_layout . addWidget ( self . board_text )

82
435 self . selection_layout . addWidget ( self . board_select ) 492 self . graph . setLabel ( ’ left ’ , ’ Measurement ( V ) ’)
436 493
437 self . channel_text = QLabel () 494 self . left_button = QPushButton ( " <" )
438 self . channel_text . setText ( " Channel : " ) 495 self . left_button . clicked . connect ( lambda : self . left_func () )
439 self . channel_select = QComboBox () 496
440 matrix_channels =[] 497 self . plot_layout . addWidget ( self . left_button )
441 for i in range (1 ,49) : 498 self . plot_layout . addWidget ( self . graph )
442 matrix_channels . append ( str ( i ) ) 499
443 self . channel_select . addItems ( matrix_channels ) 500 self . plot_layout_read = QHBoxLayout ()
444 self . channel_select . c u r r e n t I nd e x C h a n g e d . connect ( self . channelchange ) 501 self . graph_read = pg . PlotWidget ()
445 502 self . pen = pg . mkPen ( color =(255 , 0 , 0) )
446 self . s e l e c ti o n _ c h _ l a y ou t . addWidget ( self . channel_text ) 503 self . grafico_read = self . graph_read . plot ( self . matrix_X_read , data [ self .
447 self . s e l e c ti o n _ c h _ l a y ou t . addWidget ( self . channel_select ) reading_board ][ self . reading_channel ] , pen = self . pen )
448 504
449 self . ind_layout . addLayout ( self . selection_layout ) 505 if ( len ( data [ self . reading_board ][ self . reading_channel ]) >100) :
450 self . ind_layout . addLayout ( self . s el e c t i o n _ c h_ l a y o u t ) 506 size = -(100 - len ( data [ self . reading_board ][ self . reading_channel ]) )
451 self . ind_layout . addLayout ( self . plot_layout_read ) 507 if ( len ( data [ self . reading_board ][ self . reading_channel ]) < len ( self .
452 self . ind_layout . addLayout ( self . table_layout_ch ) matrix_X_read ) ) :
453 self . ind_read . setLayout ( self . ind_layout ) 508 self . grafico_read . setData ( self . matrix_X_read [ size : -1] , data [ self .
454 reading_board ][ self . reading_channel ][ size :])
455 self . tabs . addTab ( self . main_read , " Reading " ) 509 else :
456 self . tabs . addTab ( self . ind_read , " Individual channel Reading " ) 510 self . grafico_read . setData ( self . matrix_X_read [ size :] , data [ self .
457 self . tabs . removeTab (0) reading_board ][ self . reading_channel ][ size :])
458 if ( self . two_tabs ) : 511 else :
459 self . tabs . removeTab (0) 512 if ( len ( data [ self . reading_board ][ self . reading_channel ]) < len ( self .
460 self . two_tabs = True matrix_X_read ) ) :
461 513 self . grafico_read . setData ( self . matrix_X_read , data [ self . reading_board ][
462 def generate_plot ( self ) : self . reading_channel ])
463 if ( self . initiate ) : 514 else :
464 self . initiate = False 515 self . grafico_read . setData ( self . matrix_X_read , data [ self . reading_board ][
465 self . matrix_X =[] self . reading_channel ])
466 self . matrix_Y =[] 516 self . graph_read . setBackground ( ’w ’)
467 self . board_to_show =0 517 title_read = " Last 100 measurements from board " + self . to_read [ self . reading_board
468 self . last_ten_ch =[] ]+ " channel " + str ( int ( self . reading_channel ) +1)
469 self . last_ten_b =[] 518 self . graph_read . setTitle ( title_read )
470 self . last_ten =[] 519 self . graph_read . setLabel ( ’ left ’ , ’ Measurement ( V ) ’)
471 for matrix in self . to_read : 520
472 self . last_ten . append ([]) 521 self . plot_layout_read . addWidget ( self . graph_read )
473 self . last_ten_b . append ([]) 522
474 self . last_ten_ch . append ([]) 523 def right_func ( self ) :
475 self . matrix_X . append ([]) 524 if (( self . board_to_show +1) != len ( self . to_read ) ) :
476 self . matrix_Y . append ([]) 525 if len ( self . matrix_X [ self . board_to_show +1]) >0:
477 self . b =0 526 self . board_to_show +=1
478 self . ch =0 527 self . time_str = " Currently reading from board " + self . to_read [ self .
479 self . matrix_X_read =[0] board_to_show ]+ " . "
480 self . plot_layout = QHBoxLayout () 528 self . Time_text . setText ( self . time_str )
481 self . graph = pg . PlotWidget () 529 self . update_plot_data ( False )
482 self . pen = pg . mkPen ( color =(255 , 0 , 0) ) 530
483 self . grafico = self . graph . plot ( self . matrix_X [ self . board_to_show ] , self . matrix_Y [ 531 def left_func ( self ) :
self . board_to_show ] , pen = self . pen ) 532 if self . board_to_show !=0:
484 if ( len ( self . matrix_Y [ self . board_to_show ]) >100) : 533 self . board_to_show -=1
485 size = -(100 - len ( self . matrix_Y [ self . board_to_show ]) ) 534 self . time_str = " Currently reading from board " + self . to_read [ self .
486 self . grafico . setData ( self . matrix_X [ self . board_to_show ][ size :] , self . matrix_Y board_to_show ]+ " . "
[ self . board_to_show ][ size :]) 535 self . Time_text . setText ( self . time_str )
487 else : 536 self . update_plot_d ata ( False )
488 self . grafico . setData ( self . matrix_X [ self . board_to_show ] , self . matrix_Y [ self . 537
board_to_show ]) 538 def update_plot_data ( self , new_value = True ) :
489 539 if new_value :
490 self . graph . setBackground ( ’w ’) 540 # new features
491 self . graph . setTitle ( " Last 100 measurements " ) 541 if self . hv_version :

83
542 y = self . read . reading_func ( self . b +1 , self . ch , -1 , self . type_read , self . 598
auto , self . adc_list ) 599 if ( len ( self . matrix_Y [ self . board_to_show ]) >100) :
543 else : 600 size = -(100 - len ( self . matrix_Y [ self . board_to_show ]) )
544 y = self . read2 . reading_func ( self . b +1 , self . ch , -1 , self . type_read ) 601 self . grafico . setData ( self . matrix_X [ self . board_to_show ][ size :] , self . matrix_Y
545 # [ self . board_to_show ][ size :])
546 # y = randint (0 ,10000) 602 else :
547 self . matrix_X [ self . b ]. append ( len ( self . matrix_X [ self . b ]) ) 603 self . grafico . setData ( self . matrix_X [ self . board_to_show ] , self . matrix_Y [ self .
548 self . matrix_Y [ self . b ]. append ( y ) board_to_show ])
549 data [ self . b ][ self . ch ]. append ( y ) 604 if ( self . switch ) :
550 if ( len ( self . last_ten [ self . b ]) ==17) : 605 if ( len ( data [ self . reading_board ][ self . reading_channel ]) >100) :
551 self . last_ten_ch [ self . b ]= self . last_ten_ch [ self . b ][1:] 606 size = -(100 - len ( data [ self . reading_board ][ self . reading_channel ]) )
552 self . last_ten_b [ self . b ]= self . last_ten_b [ self . b ][1:] 607 if ( len ( data [ self . reading_board ][ self . reading_channel ]) < len ( self .
553 self . last_ten [ self . b ]= self . last_ten [ self . b ][1:] matrix_X_read ) ) :
554 self . last_ten_ch [ self . b ]. append ( self . ch +1) 608 self . grafico_read . setData ( self . matrix_X_read [ size : -1] , data [ self .
555 self . last_ten_b [ self . b ]. append ( self . to_read [ self . b ]) reading_board ][ self . reading_channel ][ size :])
556 self . last_ten [ self . b ]. append ( y ) 609 else :
557 self . dic . clear () 610 self . grafico_read . setData ( self . matrix_X_read [ size :] , data [ self .
558 reading_board ][ self . reading_channel ][ size :])
559 self . dic [ " Board " ]= self . last_ten_b [ self . board_to_show ] 611 else :
560 self . dic [ " Channel " ]= self . last_ten_ch [ self . board_to_show ] 612 if ( len ( data [ self . reading_board ][ self . reading_channel ]) < len ( self .
561 self . dic [ " values " ]= self . last_ten [ self . board_to_show ] matrix_X_read ) ) :
562 self . table . setData ( self . dic ) 613 self . grafico_read . setData ( self . matrix_X_read [: -1] , data [ self .
563 self . table . setMaximumSize (890 ,120) reading_board ][ self . reading_channel ])
564 self . table . setMinimumSize (890 ,120) 614 else :
565 615 self . grafico_read . setData ( self . matrix_X_read , data [ self .
566 self . dic_stats . clear () reading_board ][ self . reading_channel ])
567 self . dic_stats [ " Average " ]= int ( statistics . mean ( self . matrix_Y [ self . board_to_show 616 self . switch = False
]) ) 617 self . dic_2 . clear ()
568 if ( len ( self . matrix_Y [ self . board_to_show ]) >=100) : 618 self . dic_2 [ " Values ( V ) " ]= data [ self . reading_board ][ self . reading_channel ][1:]
569 self . dic_stats [ " Average ( ST ) " ]= int ( statistics . mean ( self . matrix_Y [ self . 619 self . table_ch . setData ( self . dic_2 )
board_to_show ][ -101:]) ) 620 self . dic_ch_stats . clear ()
570 self . dic_stats [ " Stand Dev " ]= int ( statistics . pstdev ( self . matrix_Y [ self . 621 if len ( data [ self . reading_board ][ self . reading_channel ]) ==1:
board_to_show ]) ) 622 self . dic_ch_stats [ " Average " ]= " -"
571 self . dic_stats [ " Max " ]= max ( self . matrix_Y [ self . board_to_show ]) 623 self . dic_ch_stats [ " Stand Dev " ]= " -"
572 self . dic_stats [ " Min " ]= min ( self . matrix_Y [ self . board_to_show ]) 624 self . dic_ch_stats [ " Max " ]= " -"
573 self . table_stats . setData ( self . dic_stats ) 625 self . dic_ch_stats [ " Min " ]= " -"
574 if ( len ( self . matrix_Y [ self . board_to_show ]) >=100) : 626 else :
575 self . table_stats . setMaximumSize (145 ,180) 627 self . dic_ch_stats [ " Average " ]= int ( statistics . mean ( data [ self .
576 self . table_stats . setMinimumSize (145 ,180) reading_board ][ self . reading_channel ][1:]) )
577 else : 628 if ( len ( data [ self . reading_board ][ self . reading_channel ][1:]) >=100) :
578 self . table_stats . setMaximumSize (120 ,147) 629 self . dic_ch_stats [ " Average ( ST ) " ]= int ( statistics . mean ( data [ self .
579 self . table_stats . setMinimumSize (120 ,147) reading_board ][ self . reading_channel ][ -101:]) )
580 630 self . dic_ch_stats [ " Stand Dev " ]= int ( statistics . pstdev ( data [ self .
581 if ( self . ch ==0 and self . b ==0) : reading_board ][ self . reading_channel ][1:]) )
582 self . matrix_X_read . append ( len ( self . matrix_X_read ) ) 631 self . dic_ch_stats [ " Max " ]= max ( data [ self . reading_board ][ self .
583 reading_channel ][1:])
584 if ( self . ch == self . reading_channel and self . b == self . reading_board ) : 632 self . dic_ch_stats [ " Min " ]= min ( data [ self . reading_board ][ self .
585 self . switch = True reading_channel ][1:])
586 633 self . table_ch_stats . setData ( self . dic_ch_stats )
587 if new_value : 634 if ( len ( data [ self . reading_board ][ self . reading_channel ][1:]) >=100) :
588 self . ch +=1 635 self . table_ch_stats . setMaximumSize (145 ,180)
589 if ( self . ch ==48) : 636 self . table_ch_stats . setMinimumSize (145 ,180)
590 self . save () 637 else :
591 self . ch =0 638 self . table_ch_stats . setMaximumSize (120 ,147)
592 self . b +=1 639 self . table_ch_stats . setMinimumSize (120 ,147)
593 if ( self . b == len ( self . to_read ) ) : 640
594 self . b =0 641 if ( len ( data [ self . reading_board ][ self . reading_channel ][1:]) <17) :
595 workbook = open ( self . file_opened , " a " ) 642 self . table_ch . setMaximumSize (890 ,40)
596 workbook . write ( " \ n " ) 643 self . table_ch . setMinimumSize (890 ,40)
597 workbook . close () 644 else :

84
645 self . table_ch . setMaximumSize (890 ,60) 704 str_sheet = " Board " + str ( self . to_read [ self . board_to_show ])
646 self . table_ch . setMinimumSize (890 ,60) 705 workbook . write ( str_sheet )
647 title_read = " Last 100 measurements from board " + str ( int ( self . to_read [ self . 706 workbook . write ( " \ n " )
reading_board ]) ) + " channel " + str ( int ( self . reading_channel ) +1) 707 for i in range (0 ,48) :
648 self . graph_read . setTitle ( title_read ) 708 str_header = " Ch " + str ( i +1) + " \ t "
649 709 workbook . write ( str_header )
650 def stop_func ( self ) : 710 workbook . write ( " \ n " )
651 self . timer . stop () 711 if len ( data [ self . board_to_show ][48]) == len ( data [ self . board_to_show ][0]) :
652 712 for j in range (1 , len ( data [0][0]) ) :
653 self . textbox = QLineEdit ( self ) 713 for i in range (0 ,48) :
654 self . textbox . resize (280 ,40) 714 str_data = str ( data [ self . board_to_show ][ i ][ j ]) + " \ t "
655 self . save_button = QPushButton ( " Save all data " ) 715 workbook . write ( str_data )
656 self . save_button . clicked . connect ( lambda : self . save ( False ) ) 716 workbook . write ( " \ n " )
657 self . save_b_button = QPushButton ( " Save data from \ n current board " ) 717 else :
658 self . save_b_button . clicked . connect ( lambda : self . save ( False , False ) ) 718 for j in range (1 , len ( data [0][0]) -1) :
659 719 for i in range (0 ,48) :
660 self . restart_button = QPushButton ( " Main window " ) 720 str_data = str ( data [ self . board_to_show ][ i ][ j ]) + " \ t "
661 self . restart_button . clicked . connect ( lambda : self . restart () ) 721 workbook . write ( str_data )
662 722 workbook . write ( " \ n " )
663 self . unpause_button = QPushButton ( " Continue " ) 723 workbook . close ()
664 self . unpause_button . clicked . connect ( lambda : self . unpause () ) 724
665 725 def restart ( self , i =1) :
666 self . stop_button . deleteLater () 726 self . timer . stop ()
667 self . stop . addWidget ( self . unpause_button ) 727 self . timer_2 . stop ()
668 self . stop . addWidget ( self . restart_button ) 728 self . timer_lv . stop ()
669 self . stop . addWidget ( self . textbox ) 729 self . close ()
670 self . stop . addWidget ( self . save_button ) 730 global restart
671 self . stop . addWidget ( self . save_b_button ) 731 restart = True
672 732
673 def save ( self , automatic = True , all_file = True ) : 733 def unpause ( self ) :
674 if ( automatic ) : 734 self . timer . start ()
675 workbook = open ( self . file_opened , " a " ) 735 self . textbox . deleteLater ()
676 for i in range (0 ,48) : 736 self . unpause_button . deleteLater ()
677 workbook . write ( str ( data [ self . b ][ i ][ -1]) ) 737 self . restart_button . deleteLater ()
678 workbook . write ( " \ t " ) 738 self . save_button . deleteLater ()
679 elif all_file : 739 self . save_b_button . deleteLater ()
680 workbook = self . textbox . text () 740 self . stop_button = QPushButton ( " Stop " )
681 workbook = workbook + " . txt " 741 self . stop_button . clicked . connect ( lambda : self . stop_func () )
682 workbook = open ( workbook , " w " ) 742 self . stop . addWidget ( self . stop_button )
683 for board in self . to_read : 743
684 str_sheet = " Board " + str ( board ) 744 def boardchange ( self ) :
685 workbook . write ( str_sheet ) 745 for i in range (0 , len ( self . to_read ) ) :
686 for i in range (0 ,48) : 746 if ( self . to_read [ i ]== self . board_select . currentText () ) :
687 workbook . write ( " \ t " ) 747 self . reading_board = i
688 workbook . write ( " \ n " ) 748 self . switch = True
689 for board in self . to_read : 749 self . update_plot_data ( False )
690 for i in range (0 ,48) : 750
691 str_header = " Ch " + str ( i +1) + " \ t " 751 def channelchange ( self ) :
692 workbook . write ( str_header ) 752 self . reading_channel = int ( self . channel_select . currentText () ) -1
693 workbook . write ( " \ n " ) 753 self . switch = True
694 for j in range (1 , len ( data [0][0]) -1) : 754 self . update_plot_data ( False )
695 for n in range (0 , len ( self . to_read ) ) : 755
696 for i in range (0 ,48) : 756 def r e a d i n g _ in d _ c h a n n e l ( self ) :
697 str_data = str ( data [ n ][ i ][ j ]) + " \ t " 757 self . setGeometry (0 , 100 , 700 , 900)
698 workbook . write ( str_data ) 758
699 workbook . write ( " \ n " ) 759 self . value_matrix =[]
700 else : 760 self . __boards =[]
701 workbook = self . textbox . text () 761 self . widgets =[]
702 workbook = workbook + " . txt " 762 self . hvValue_label = []
703 workbook = open ( workbook , " w " ) 763 self . header =[]

85
764 self . graphWidget = [] 824 self . settings = QWidget ()
765 self . data_line = [] 825
766 self . page_layout =[] 826 self . tabs . removeTab (0)
767 self . table_ind = [] 827
768 self . table_ind_stats = [] 828 def stop_timer ( self ) :
769 self . dic_ind_stats = {} 829 self . reading_stopped = True
770 830 self . timer_2 . stop ()
771 for i in range (0 ,4) : 831 self . start_btn =[]
772 self . table_ind . append ( pg . TableWidget () ) 832 for i in range (0 ,4) :
773 self . table_ind [ i ]. horizontalHeader () . setVisible ( False ) 833 self . stop_btn [ i ]. deleteLater ()
774 self . table_ind [ i ]. r e s i z e C o l u m n s T o C o n t e n t s () 834 self . go_back [ i ]. deleteLater ()
775 self . table_ind [ i ]. r e s i z e R o w s T o C o n t e n t s () 835 self . go_back =[]
776 self . table_ind [ i ]. s e t V e r t i c a l S c r o l l B a r P o l i c y ( Qt . Sc r ol l Ba rA l wa y sO ff ) 836 self . stop_btn =[]
777 self . table_ind [ i ]. s e t H o r i z o n t a l S c r o l l B a r P o l i c y ( Qt . S c ro ll B ar Al w ay s Of f ) 837 self . restart_data =[]
778 self . table_ind [ i ]. setMaximumSize (800 ,40) 838 self . save_data =[]
779 self . table_ind [ i ]. setMinimumSize (800 ,40) 839 self . save_data . append ( QPushButton ( " Save channel data " ) )
780 self . table_ind_stats . append ( pg . TableWidget () ) 840 self . save_data [0]. clicked . connect ( lambda : self . save_ch_data ( False ,0) )
781 self . table_ind_stats [ i ]. horizontalHeader () . setVisible ( False ) 841 self . save_data . append ( QPushButton ( " Save channel data " ) )
782 self . table_ind_stats [ i ]. r e s i z e C o l u m n s T o C o n t e n t s () 842 self . save_data [1]. clicked . connect ( lambda : self . save_ch_data ( False ,1) )
783 self . table_ind_stats [ i ]. r e s i z e R o w s T o C o n t e n t s () 843 self . save_data . append ( QPushButton ( " Save channel data " ) )
784 self . table_ind_stats [ i ]. s e t V e r t i c a l S c r o l l B a r P o l i c y ( Qt . S cr o ll Ba r Al w ay sO f f ) 844 self . save_data [2]. clicked . connect ( lambda : self . save_ch_data ( False ,2) )
785 self . table_ind_stats [ i ]. s e t H o r i z o n t a l S c r o l l B a r P o l i c y ( Qt . Sc ro l lB a rA lw a ys O ff 845
) self . save_data . append ( QPushButton ( " Save channel data " ) )
786 self . table_ind_stats [ i ]. setMaximumSize (130 ,147) 846 self . save_data [3]. clicked . connect ( lambda : self . save_ch_data ( False ,3) )
787 self . table_ind_stats [ i ]. setMinimumSize (130 ,147) 847 self . textbox_ind =[]
788 848 for i in range (0 ,4) :
789 self . pen = pg . mkPen ( color =(255 , 0 , 0) ) 849 self . start_btn . append ( QPushButton ( " Continue " ) )
790 850 self . start_btn [ i ]. clicked . connect ( lambda : self . start_timer () )
791 self . no_plots = True 851 self . restart_data . append ( QPushButton ( " Restart channel data " ) )
792 self . stop_btn =[] 852 self . restart_data [ i ]. clicked . connect ( lambda : self . restart_ch_data () )
793 self . go_back =[] 853 self . textbox_ind . append ( QLineEdit ( self ) )
794 self . restart_data =[] 854 self . textbox_ind [ i ]. resize (280 ,40)
795 self . save_data =[] 855 self . go_back . append ( QPushButton ( " Main window " ) )
796 self . textbox_ind =[] 856 self . go_back [ i ]. clicked . connect ( lambda : self . restart () )
797 857 stop_layout = QHBoxLayout ()
798 for i in range (0 ,4) : 858 stop_layout . addWidget ( self . start_btn [ i ])
799 self . stop_btn . append ( QPushButton ( " Stop " ) ) 859 stop_layout . addWidget ( self . restart_data [ i ])
800 self . stop_btn [ i ]. clicked . connect ( lambda : self . stop_timer () ) 860 stop_layout . addWidget ( self . go_back [ i ])
801 self . go_back . append ( QPushButton ( " Main window " ) ) 861 save_layout = QHBoxLayout ()
802 self . go_back [ i ]. clicked . connect ( lambda : self . restart () ) 862 save_layout . addWidget ( self . textbox_ind [ i ])
803 self . textbox_ind . append ( QLineEdit ( self ) ) 863 save_layout . addWidget ( self . save_data [ i ])
804 self . textbox_ind [ i ]. resize (280 ,40) 864 self . page_layout [ i ]. addLayout ( stop_layout )
805 self . save_data . append ( QPushButton ( " Save channel data " ) ) 865 self . page_layout [ i ]. addLayout ( save_layout )
806 self . save_data [ i ]. clicked . connect ( lambda : self . save_ch_data () ) 866
807 self . go_back . append ( QPushButton ( " Main window " ) ) 867 def restart_ch_data ( self ) :
808 self . go_back [ i ]. clicked . connect ( lambda : self . restart () ) 868 self . value_matrix [ self . board ][ self . state -1][0]=[]
809 869 self . value_matrix [ self . board ][ self . state -1][1]=[]
810 for n in range (0 ,4) : 870 self . up d at e_ p lo t _d at a _2 ( False )
811 self . hvValue_label . append ( QLabel () ) 871 for i in range (0 ,4) :
812 self . header . append ( QLabel () ) 872 self . hvValue_label [ i ]. setText ( " Data deleted from board " + str ( self . board
813 self . header [ n ]. setText ( " Choose the channel you want to read : " ) +1) + " channel " + str ( self . state ) )
814 self . header [ n ]. setAlignment ( Qt . AlignCenter ) 873
815 self . value_matrix . append ([]) 874 def save_ch_data ( self , automatic = True , n =0) :
816 self . __boards . append ( QWidget () ) 875 if ( automatic ) :
817 self . widgets . append ([]) 876 if ( len ( self . value_matrix [ self . board ][ self . state -1][1]) ==100) :
818 self . board_config ( n +1) 877 time_stamp = time . time ()
819 string = " Board " + str ( n +1) 878 time_stamp = int ( time_stamp )
820 self . tabs . addTab ( self . __boards [ n ] , string ) 879 self . strin = " dados_board_ " + str ( self . board +1) + " _channel_ " + str ( self . state )
821 self . graphWidget . append ( pg . PlotWidget () ) + str ( time_stamp ) + " . txt "
822 self . graphWidget [ n ]. setBackground ( ’w ’) 880 workbook = open ( self . strin , " w " )
823 881 strin = " Board " + str ( self . board +1) + " \ n "

86
882 workbook . write ( strin ) 937 self . hvValue_label [ i ]. setText ( " The channel " + str ( self . state ) + " of the board
883 strin = " Channel " + str ( self . state ) + " \ n " " + str ( self . board +1) + " is being read . " )
884 workbook . write ( strin ) 938
885 for i in range (0 ,100) : 939 def board_config ( self , board ) :
886 workbook . write ( str ( self . value_matrix [ self . board ][ self . state -1][1][ 940
i self . page_layout . append ( QVBoxLayout () )
]) ) 941 self . c h o o se _ r e l a y _ l a yo u t = QGridLayout ()
887 workbook . write ( " \ n " ) 942 display_layout = QVBoxLayout ()
888 self . last_rec =100 943 header_layout = QVBoxLayout ()
889 workbook . close () 944
890 elif ( len ( self . value_matrix [ self . board ][ self . state -1][1]) %100==0 and not len 945
( self . value_matrix [ self . board ][ self . state -1][1]) ==0) : 946 for i in range (0 ,6) :
891 workbook = open ( self . strin , " a " ) 947 for j in range (0 ,8) :
892 for i in range ( self . last_rec , len ( self . value_matrix [ self . board ][ self . 948 string = " Channel " + str ( j + i *8+1)
state -1][1]) ) : 949 self . widgets [ board -1]. append ( QPushButton ( string ) )
893 workbook . write ( str ( self . value_matrix [ self . board ][ self . state -1][1][ 950
i self . value_matrix [ board -1]. append ([])
]) ) 951 self . value_matrix [ board -1][ j + i *8]. append ([])
894 workbook . write ( " \ n " ) 952 self . value_matrix [ board -1][ j + i *8]. append ([])
895 self . last_rec = len ( self . value_matrix [ self . board ][ self . state -1][1]) 953
896 workbook . close () 954 self . button_setting ( board )
897 else : 955
898 file_name = self . textbox_ind [ n ]. text () 956 self . c h o o se _ r e l a y _ l a yo u t . setSpacing (5)
899 file_name = file_name + " . txt " 957 self . c h o o se _ r e l a y _ l a yo u t . s et Co n te n ts Ma r gi n s (50 ,25 ,30 ,30)
900 workbook = open ( file_name , " w " ) 958
901 strin = " Board " + str ( self . board +1) + " \ n " 959 self . hvValue_label [ board -1]. setText ( " No reading is being made . " )
902 workbook . write ( strin ) 960 self . hvValue_label [ board -1]. setAlignment ( Qt . AlignCenter )
903 strin = " Channel " + str ( self . state ) + " \ n " 961 display_layout . addWidget ( self . hvValue_label [ board -1])
904 workbook . write ( strin ) 962 display_layout . addWidget ( self . go_back [ board -1])
905 for value in self . value_matrix [ self . board ][ self . state -1][1] : 963
906 workbook . write ( str ( value ) ) 964 header_layout . addWidget ( self . header [ board -1])
907 workbook . write ( " \ n " ) 965
908 workbook . close () 966 self . page_layout [ board -1]. addLayout ( header_layout )
909 for i in range (0 ,4) : 967 self . page_layout [ board -1]. addLayout ( self . c ho o s e _ r e l a y_ l a y o u t )
910 self . hvValue_label [ i ]. setText ( " Data saved from board " + str ( self . board 968 self . page_layout [ board -1]. addLayout ( display_layout )
+1) + " channel " + str ( self . state ) + " to file " + file_name ) 969 self . __boards [ board -1]. setLayout ( self . page_layout [ board -1])
911 970
912 def start_timer ( self ) : 971 def read_relay ( self , board , n ) :
913 self . timer_2 . start () 972 for i in range (0 ,4) :
914 self . reading_stopped = False 973 self . hvValue_label [ i ]. setText ( " The channel " + str ( n ) + " of the board " + str (
915 self . stop_btn =[] board ) + " is being read . " )
916 for i in range (0 ,4) : 974 self . timer_2 . start ()
917 self . start_btn [ i ]. deleteLater () 975 if self . second :
918 self . go_back [ i ]. deleteLater () 976 self . value_matrix [ self . board ][ self . state -1][0]=[]
919 self . restart_data [ i ]. deleteLater () 977 self . value_matrix [ self . board ][ self . state -1][1]=[]
920 self . save_data [ i ]. deleteLater () 978 self . state = n
921 self . textbox_ind [ i ]. deleteLater () 979 self . board = board -1
922 self . go_back =[] 980 if self . reading_stoppe d :
923 self . start_btn =[] 981 self . second = False
924 self . save_data =[] 982 for i in range (0 ,4) :
925 self . textbox_ind =[] 983 self . start_btn [ i ]. deleteLater ()
926 self . restart_data =[] 984 self . restart_data [ i ]. deleteLater ()
927 for i in range (0 ,4) : 985 self . save_data [ i ]. deleteLater ()
928 self . stop_btn . append ( QPushButton ( " Stop " ) ) 986 self . textbox_ind [ i ]. deleteLater ()
929 self . stop_btn [ i ]. clicked . connect ( lambda : self . stop_timer () ) 987 self . start_btn =[]
930 self . go_back . append ( QPushButton ( " Main window " ) ) 988 self . restart_data =[]
931 self . go_back [ i ]. clicked . connect ( lambda : self . restart () ) 989 self . save_data =[]
932 stop_layout = QVBoxLayout () 990 self . textbox_ind =[]
933 stop_layout . addWidget ( self . stop_btn [ i ]) 991 self . reading_stopped = False
934 stop_layout . addWidget ( self . go_back [ i ]) 992 if self . second :
935 self . page_layout [ i ]. addLayout ( stop_layout ) 993 for i in range (0 ,4) :
936 for i in range (0 ,4) : 994 self . stop_btn [ i ]. deleteLater ()

87
995 else : 1049 self . dic_ind_stats [ " Max " ]= " -"
996 self . second = True 1050 self . dic_ind_stats [ " Min " ]= " -"
997 for i in range (0 ,4) : 1051 else :
998 self . go_back [ i ]. deleteLater () 1052 self . dic_ind_stats [ " Average " ]= int ( statistics . mean ( self . value_matrix [ self .
999 self . go_back =[] board ][ self . state -1][1]) )
1000 self . stop_btn =[] 1053 if ( len ( self . value_matrix [ self . board ][ self . state -1][1]) >=100) :
1001 for i in range (0 ,4) : 1054 self . dic_ind_stats [ " Average ( ST ) " ]= int ( statistics . mean ( self . value_matrix
1002 self . go_back . append ( QPushButton ( " Main window " ) ) [ self . board ][ self . state -1][1][ -101:]) )
1003 self . go_back [ i ]. clicked . connect ( lambda : self . restart () ) 1055 self . dic_ind_stats [ " Stand Dev " ]= int ( statistics . pstdev ( self . value_matrix [
1004 self . stop_btn . append ( QPushButton ( " Stop " ) ) self . board ][ self . state -1][1]) )
1005 self . stop_btn [ i ]. clicked . connect ( lambda : self . stop_timer () ) 1056 self . dic_ind_stats [ " Max " ]= max ( self . value_matrix [ self . board ][ self . state
1006 if self . no_plots : -1][1])
1007 self . no_plots = False 1057 self . dic_ind_stats [ " Min " ]= min ( self . value_matrix [ self . board ][ self . state
1008 for i in range (0 ,4) : -1][1])
1009 plot_layout = QHBoxLayout () 1058
1010 self . data_line . append ( self . graphWidget [ i ]. plot ( self . value_matrix [ self .1059 if ( len ( self . value_matrix [ self . board ][ self . state -1][0]) >100) :
board ][ self . state -1][0] , self . value_matrix [ self . board ][ self . state -1][1] , pen = self 1060 counter = -(100 - len ( self . value_matrix [ self . board ][ self . state -1][0]) )
. pen ) ) 1061 self . x = self . value_matrix [ self . board ][ self . state -1][0][ counter :]
1011 plot_layout . addWidget ( self . graphWidget [ i ]) 1062 self . y = self . value_matrix [ self . board ][ self . state -1][1][ counter :]
1012 plot_layout . addWidget ( self . table_ind_stats [ i ]) 1063 scroll = True
1013 self . page_layout [ i ]. addLayout ( plot_layout ) 1064
1014 for i in range (0 ,4) : 1065 for i in range (0 ,4) :
1015 stop_layout = QVBoxLayout () 1066 self . table_ind [ i ]. setData ( self . dic_ind )
1016 stop_layout . addWidget ( self . table_ind [ i ]) 1067 if ( len ( self . value_matrix [ self . board ][ self . state -1][1]) >=100) :
1017 stop_layout . addWidget ( self . stop_btn [ i ]) 1068 self . table_ind_stats [ i ]. setMaximumSize (145 ,180)
1018 stop_layout . addWidget ( self . go_back [ i ]) 1069 self . table_ind_stats [ i ]. setMinimumSize (145 ,180)
1019 self . page_layout [ i ]. addLayout ( stop_layout ) 1070 else :
1020 1071 self . table_ind_stats [ i ]. setMaximumSize (145 ,180)
1021 def u pd a te _p l ot _ da ta _ 2 ( self , Add = True ) : 1072 self . table_ind_stats [ i ]. setMinimumSize (145 ,180)
1022 if ( Add ) : 1073 self . table_ind_stats [ i ]. setData ( self . dic_ind_stats )
1023 # new features 1074 if scroll :
1024 if self . hv_version : 1075 self . data_line [ i ]. setData ( self .x , self . y )
1025 y = self . read . reading_func ( self . board +1 , self . state -1 , -1 , self . type_read1076
, else :
self . auto , self . adc_list ) 1077 self . data_line [ i ]. setData ( self . value_matrix [ self . board ][ self . state
1026 else : -1][0] , self . value_matrix [ self . board ][ self . state -1][1])
1027 1078
y = self . read2 . reading_func ( self . board +1 , self . state -1 , -1 , self . type_read self . save_ch_data ()
) 1079
1028 # 1080 def low_voltage_read ( self ) :
1029 # y = randint (0 , 100) 1081 self . setGeometry (0 , 100 , 200 , 300)
1030 self . value_matrix [ self . board ][ self . state -1][0]. append ( len ( self . value_matrix 1082
[ self . board ][ self . state -1][0]) ) 1083 self . value_lv =[]
1031 self . value_matrix [ self . board ][ self . state -1][1]. append ( y ) 1084 for i in range (0 ,2) :
1032 scroll = False 1085 self . value_lv . append ([])
1033 1086 self . dic_var ={}
1034 self . dic_ind . clear () 1087 self . dic_ind_stats ={}
1035 str_dic = " Values ( V ) " 1088 self . table_ind =[]
1036 last_ten =[] 1089 self . table_ind_stats =[]
1037 if ( len ( self . value_matrix [ self . board ][ self . state -1][0]) >23) : 1090 self . data_line = []
1038 for i in range (0 ,23) : 1091 self . count =0
1039 last_ten . append ( self . value_matrix [ self . board ][ self . state -1][1][ -23+ i ])1092 self . plot_lv = True
1040 else : 1093 self . iamreading = False
1041 for i in range (0 , len ( self . value_matrix [ self . board ][ self . state -1][0]) ) : 1094 self . cont = False
1042 last_ten . append ( self . value_matrix [ self . board ][ self . state -1][1][ - len ( 1095
self . value_matrix [ self . board ][ self . state -1][0]) + i ]) 1096 self . table_ind . append ( pg . TableWidget () )
1043 self . dic_ind [ str_dic ]= last_ten 1097 self . table_ind [0]. horizontalHeader () . setVisible ( False )
1044 1098 self . table_ind [0]. r e s i z e C o l u m n s T o C o n t e n t s ()
1045 self . dic_ind_stats . clear () 1099 self . table_ind [0]. r e s i z e R o w s T o C o n t e n t s ()
1046 if len ( self . value_matrix [ self . board ][ self . state -1][1]) ==0: 1100 self . table_ind [0]. s e t V e r t i c a l S c r o l l B a r P o l i c y ( Qt . Sc r ol l Ba rA l wa y sO ff )
1047 self . dic_ind_stats [ " Average " ]= " -" 1101 self . table_ind [0]. s e t H o r i z o n t a l S c r o l l B a r P o l i c y ( Qt . S c ro ll B ar A lw ay s Of f )
1048 self . dic_ind_stats [ " Stand Dev " ]= " -" 1102 self . table_ind [0]. setMaximumSize (1000 ,40)

88
1103 self . table_ind [0]. setMinimumSize (1000 ,40) 1163 lv_channel = str ( lv_read ) + " V source is being read "
1104 self . table_ind_stats . append ( pg . TableWidget () ) 1164 self . lv_ch . setText ( lv_channel )
1105 self . table_ind_stats [0]. horizontalHeader () . setVisible ( False ) 1165 # new features
1106 self . table_ind_stats [0]. r e s i z e C o l u m n s T o C o n t e n t s () 1166 self . lv_value = lv_read
1107 self . table_ind_stats [0]. r e s i z e R o w s T o C o n t e n t s () 1167 self . lv_ind = ind
1108 self . table_ind_stats [0]. s e t V e r t i c a l S c r o l l B a r P o l i c y ( Qt . S c ro ll B ar Al w ay s Of f ) 1168 self . timer_lv . start ()
1109 self . table_ind_stats [0]. s e t H o r i z o n t a l S c r o l l B a r P o l i c y ( Qt . Sc r ol lB a rA l wa ys O ff ) 1169
1110 self . table_ind_stats [0]. setMaximumSize (180 ,147) 1170 #
1111 self . table_ind_stats [0]. setMinimumSize (180 ,147) 1171
1112 self . penlv = pg . mkPen ( color =(0 , 0 , 255) ) 1172 if self . cont :
1113 self . graphWidget_lv = pg . PlotWidget () 1173 self . lv_stop_btn . deleteLater ()
1114 self . graphWidget_lv . setBackground ( ’w ’) 1174
1115 1175
1116 self . lv_read = QWidget () 1176
1117 self . lv_layout = QVBoxLayout () 1177 if self . stopped_lv or self . lv_start :
1118 self . lv_read_layout = QGridLayout () 1178
1119 self . lv_header_layout = QVBoxLayout () 1179 self . l v_r est art _bu t ton . deleteLater ()
1120 self . lv_plot = QVBoxLayout () 1180 self . lv_stop_btn = QPushButton ( " Stop " )
1121 self . lv_stop = QVBoxLayout () 1181 self . lv_stop_btn . clicked . connect ( lambda : self . stop_lv () )
1122 self . lv_restart = QVBoxLayout () 1182 self . lv_stop . addWidget ( self . lv_stop_btn )
1123 1183
1124 self . lv_header = QLabel () 1184 self . l v_r est art _bu t ton = QPushButton ( " Main window " )
1125 self . lv_header . setText ( " Choose which low voltage source to read : " ) 1185 self . l v_r est art _bu t ton . clicked . connect ( lambda : self . restart () )
1126 self . lv_header . setAlignment ( Qt . AlignCenter ) 1186 self . lv_restart . addWidget ( self . lv _re star t_b utt on )
1127 self . lv_header_layout . addWidget ( self . lv_header ) 1187 if self . iamreading :
1128 1188 self . dataline =[]
1129 self . lv_24V_btn = QPushButton ( " 24 V " ) 1189 self . value_lv =[]
1130 self . lv_24V_btn . clicked . connect ( lambda : self . read_values (24 , 2) ) 1190 for i in range (0 ,2) :
1131 self . lv_read_layout . addWidget ( self . lv_24V_btn ,0 ,0) 1191 self . value_lv . append ([])
1132 self . lv_24V_btn = QPushButton ( " 12 V " ) 1192 self . count =0
1133 self . lv_24V_btn . clicked . connect ( lambda : self . read_values (12 , 1) ) 1193 if self . plot_lv :
1134 self . lv_read_layout . addWidget ( self . lv_24V_btn ,0 ,1) 1194 # self . data_line =[]
1135 self . lv_24V_btn = QPushButton ( " -12 V " ) 1195 self . plot_lv = False
1136 self . lv_24V_btn . clicked . connect ( lambda : self . read_values ( -12 , 0) ) 1196 plot_layout_lv = QHBoxLayout ()
1137 self . lv_read_layout . addWidget ( self . lv_24V_btn ,0 ,2) 1197 self . data_line . append ( self . graphWidget_lv . plot ( self . value_lv [0] , self .
1138 self . lv_24V_btn = QPushButton ( " 3.3 V " ) value_lv [1] , pen = self . penlv ) )
1139 self . lv_24V_btn . clicked . connect ( lambda : self . read_values (3.3 , 3) ) 1198 plot_layout_lv . addWidget ( self . graphWidget_lv )
1140 self . lv_read_layout . addWidget ( self . lv_24V_btn ,0 ,3) 1199 plot_layout_lv . addWidget ( self . table_ind_stats [0])
1141 1200 self . lv_plot . addLayout ( plot_layout_lv )
1142 self . lv_ch = QLabel () 1201 table_layout = QHBoxLayout ()
1143 self . lv_ch . setText ( " No reading is being made . " ) 1202 table_layout . addWidget ( self . table_ind [0])
1144 self . lv_ch . setAlignment ( Qt . AlignCenter ) 1203 self . lv_plot . addLayout ( table_layout )
1145 self . lv_plot . addWidget ( self . lv_ch ) 1204
1146 1205 if self . stopped_lv and self . cont != True :
1147 self . l v_r est art _bu tton = QPushButton ( " Main window " ) 1206 self . text [0]. deleteLater ()
1148 self . l v_r est art _bu tton . clicked . connect ( lambda : self . restart () ) 1207 self . text [1]. deleteLater ()
1149 self . lv_restart . addWidget ( self . lv _re sta rt_b utt on ) 1208 self . save_lv . deleteLater ()
1150 1209 self . lv_continue . deleteLater ()
1151 self . lv_layout . addLayout ( self . lv_header_layout ) 1210
1152 self . lv_layout . addLayout ( self . lv_read_layout ) 1211
1153 self . lv_layout . addLayout ( self . lv_plot ) 1212 self . cont = False
1154 self . lv_layout . addLayout ( self . lv_stop ) 1213 self . iamreading = True
1155 self . lv_layout . addLayout ( self . lv_restart ) 1214 self . stopped_lv = False
1156 self . lv_read . setLayout ( self . lv_layout ) 1215 self . lv_start = False
1157 self . tabs . addTab ( self . lv_read , " Low voltages Reading " ) 1216
1158 self . tabs . removeTab (0) 1217
1159 1218 # new features
1160 1219 def u p d a t e _ p lo t _ d a t a _ l v ( self ) :
1161 def read_values ( self , lv_read , ind ) : 1220 if self . hv_version :
1162 1221 y = self . read . reading_func (1 ,0 , self . lv_ind , self . type_read , self . auto , self .

89
adc_list ) 1279 self . lv_stop . addWidget ( self . lv_continue )
1222 else : 1280 self . timer_lv . stop ()
1223 y = self . read2 . reading_func (1 ,0 , self . lv_ind , self . type_read ) 1281 self . text . append ( QLineEdit ( self ) )
1224 1282 self . text [0]. resize (280 ,40)
1225 # y = randint (0 , 24) 1283 self . text . append ( QPushButton ( " Save channel data " ) )
1226 self . value_lv [0]. append ( self . count ) 1284 self . text [1]. clicked . connect ( lambda : self . save_data_lv () )
1227 self . value_lv [1]. append ( y ) 1285 self . save_lv = QHBoxLayout ()
1228 self . count +=1 1286 self . save_lv . addWidget ( self . text [0])
1229 str_dic_lv = " Values ( V ) " 1287 self . save_lv . addWidget ( self . text [1])
1230 scroll_lv = False 1288 self . lv_layout . addLayout ( self . save_lv )
1231 last_values =[] 1289 self . cont = False
1232 if len ( self . value_lv [0]) >12: 1290
1233 for j in range (0 ,12) : 1291
1234 last_values . append ( self . value_lv [1][ -12+ j ]) 1292 def Continue ( self ) :
1235 else : 1293 self . text [0]. deleteLater ()
1236 for j in range (0 , len ( self . value_lv [0]) ) : 1294 self . text [1]. deleteLater ()
1237 last_values . append ( self . value_lv [1][ - len ( self . value_lv [0]) + j ]) 1295 self . save_lv . deleteLater ()
1238 self . dic_var [ str_dic_lv ]= last_values 1296 self . lv_continue . deleteLater ()
1239 1297 self . timer_lv . start ()
1240 self . dic_ind_stats . clear () 1298 lv_channel = str ( self . lv_value ) + " V source is being read "
1241 if len ( self . value_lv [1]) ==0: 1299 self . lv_ch . setText ( lv_channel )
1242 self . dic_ind_stats [ " Average " ]= " -" 1300 self . lv_stop_btn = QPushButton ( " Stop " )
1243 self . dic_ind_stats [ " Average ( ST ) " ]= " -" 1301 self . lv_stop_btn . clicked . connect ( lambda : self . stop_lv () )
1244 self . dic_ind_stats [ " Stand Dev " ]= " -" 1302 self . lv_stop . addWidget ( self . lv_stop_btn )
1245 self . dic_ind_stats [ " Max " ]= " -" 1303 self . cont = True
1246 self . dic_ind_stats [ " Min " ]= " -" 1304
1247 else : 1305
1248 self . dic_ind_stats [ " Average " ]= int ( statistics . mean ( self . value_lv [1]) ) 1306
1249 if ( len ( self . value_lv [1]) >=100) : 1307 def save_data_lv ( self ) :
1250 self . dic_ind_stats [ " Average ( ST ) " ]= int ( statistics . mean ( self . value_lv 1308 file_name = self . text [0]. text ()
[1][ -101: ]) ) 1309 file_name = file_name + " . txt "
1251 self . dic_ind_stats [ " Stand Dev " ]= int ( statistics . pstdev ( self . value_lv [1]) ) 1310 workbook = open ( file_name , " w " )
1252 self . dic_ind_stats [ " Max " ]= max ( self . value_lv [1]) 1311 strin = str ( self . lv_value ) + " V \ n "
1253 self . dic_ind_stats [ " Min " ]= min ( self . value_lv [1]) 1312 workbook . write ( strin )
1254 1313 for value in self . value_lv [1] :
1255 if len ( self . value_lv [0]) >100: 1314 workbook . write ( str ( value ) )
1256 counter = -(100 - len ( self . value_lv [0]) ) 1315 workbook . write ( " \ n " )
1257 self . x = self . value_lv [0][ counter :] 1316 workbook . close ()
1258 self . y = self . value_lv [1][ counter :] 1317 self . lv_ch . setText ( " Data saved form " + str ( self . lv_value ) + " V to file " +
1259 scroll_lv = True file_name )
1260 1318
1261 self . table_ind [0]. setData ( self . dic_var ) 1319
1262 self . table_ind_stats [0]. setData ( self . dic_ind_stats ) 1320
1263 self . table_ind_stats [0]. setMaximumSize (180 ,180) 1321
1264 self . table_ind_stats [0]. setMinimumSize (180 ,180) 1322
1265 if scroll_lv : 1323
1266 self . data_line [0]. setData ( self .x , self . y ) 1324 # #######
1267 else : 1325 def button_setting ( self , board ) :
1268 self . data_line [0]. setData ( self . value_lv [0] , self . value_lv [1]) 1326 self . widgets [ board -1][0]. clicked . connect ( lambda : self . read_relay ( board ,1) )
1269 1327 self . c h o o se _ r e l a y _ l a yo u t . addWidget ( self . widgets [ board -1][0] ,0 ,0)
1270 1328 self . widgets [ board -1][1]. clicked . connect ( lambda : self . read_relay ( board ,2) )
1271 def stop_lv ( self ) : 1329 self . c h o o se _ r e l a y _ l a yo u t . addWidget ( self . widgets [ board -1][1] ,0 ,1)
1272 self . lv_ch . setText ( " No reading is being made . Current data from " + str ( self . 1330 self . widgets [ board -1][2]. clicked . connect ( lambda : self . read_relay ( board ,3) )
lv_value ) + " V " ) 1331 self . c h o o se _ r e l a y _ l a yo u t . addWidget ( self . widgets [ board -1][2] ,0 ,2)
1273 self . lv_stop_btn . deleteLater () 1332 self . widgets [ board -1][3]. clicked . connect ( lambda : self . read_relay ( board ,4) )
1274 self . text =[] 1333 self . c h o o se _ r e l a y _ l a yo u t . addWidget ( self . widgets [ board -1][3] ,0 ,3)
1275 1334 self . widgets [ board -1][4]. clicked . connect ( lambda : self . read_relay ( board ,5) )
1276 self . stopped_lv = True 1335 self . c h o o se _ r e l a y _ l a yo u t . addWidget ( self . widgets [ board -1][4] ,0 ,4)
1277 self . lv_continue = QPushButton ( " Continue " ) 1336 self . widgets [ board -1][5]. clicked . connect ( lambda : self . read_relay ( board ,6) )
1278 self . lv_continue . clicked . connect ( lambda : self . Continue () ) 1337 self . c h o o se _ r e l a y _ l a yo u t . addWidget ( self . widgets [ board -1][5] ,0 ,5)

90
1338 self . widgets [ board -1][6]. clicked . connect ( lambda : self . read_relay ( board ,7) ) 1398 self . widgets [ board -1][36]. clicked . connect ( lambda : self . read_relay ( board ,37) )
1339 self . c h o o s e_ r e l a y _ l a y ou t . addWidget ( self . widgets [ board -1][6] ,0 ,6) 1399 self . c h o o se _ r e l a y _ l a yo u t . addWidget ( self . widgets [ board -1][36] ,4 ,4)
1340 self . widgets [ board -1][7]. clicked . connect ( lambda : self . read_relay ( board ,8) ) 1400 self . widgets [ board -1][37]. clicked . connect ( lambda : self . read_relay ( board ,38) )
1341 self . c h o o s e_ r e l a y _ l a y ou t . addWidget ( self . widgets [ board -1][7] ,0 ,7) 1401 self . c h o o se _ r e l a y _ l a yo u t . addWidget ( self . widgets [ board -1][37] ,4 ,5)
1342 self . widgets [ board -1][8]. clicked . connect ( lambda : self . read_relay ( board ,9) ) 1402 self . widgets [ board -1][38]. clicked . connect ( lambda : self . read_relay ( board ,39) )
1343 self . c h o o s e_ r e l a y _ l a y ou t . addWidget ( self . widgets [ board -1][8] ,1 ,0) 1403 self . c h o o se _ r e l a y _ l a yo u t . addWidget ( self . widgets [ board -1][38] ,4 ,6)
1344 self . widgets [ board -1][9]. clicked . connect ( lambda : self . read_relay ( board ,10) ) 1404 self . widgets [ board -1][39]. clicked . connect ( lambda : self . read_relay ( board ,40) )
1345 self . c h o o s e_ r e l a y _ l a y ou t . addWidget ( self . widgets [ board -1][9] ,1 ,1) 1405 self . c h o o se _ r e l a y _ l a yo u t . addWidget ( self . widgets [ board -1][39] ,4 ,7)
1346 self . widgets [ board -1][10]. clicked . connect ( lambda : self . read_relay ( board ,11) ) 1406 self . widgets [ board -1][40]. clicked . connect ( lambda : self . read_relay ( board ,41) )
1347 self . c h o o s e_ r e l a y _ l a y ou t . addWidget ( self . widgets [ board -1][10] ,1 ,2) 1407 self . c h o o se _ r e l a y _ l a yo u t . addWidget ( self . widgets [ board -1][40] ,5 ,0)
1348 self . widgets [ board -1][11]. clicked . connect ( lambda : self . read_relay ( board ,12) ) 1408 self . widgets [ board -1][41]. clicked . connect ( lambda : self . read_relay ( board ,42) )
1349 self . c h o o s e_ r e l a y _ l a y ou t . addWidget ( self . widgets [ board -1][11] ,1 ,3) 1409 self . c h o o se _ r e l a y _ l a yo u t . addWidget ( self . widgets [ board -1][41] ,5 ,1)
1350 self . widgets [ board -1][12]. clicked . connect ( lambda : self . read_relay ( board ,13) ) 1410 self . widgets [ board -1][42]. clicked . connect ( lambda : self . read_relay ( board ,43) )
1351 self . c h o o s e_ r e l a y _ l a y ou t . addWidget ( self . widgets [ board -1][12] ,1 ,4) 1411 self . c h o o se _ r e l a y _ l a yo u t . addWidget ( self . widgets [ board -1][42] ,5 ,2)
1352 self . widgets [ board -1][13]. clicked . connect ( lambda : self . read_relay ( board ,14) ) 1412 self . widgets [ board -1][43]. clicked . connect ( lambda : self . read_relay ( board ,44) )
1353 self . c h o o s e_ r e l a y _ l a y ou t . addWidget ( self . widgets [ board -1][13] ,1 ,5) 1413 self . c h o o se _ r e l a y _ l a yo u t . addWidget ( self . widgets [ board -1][43] ,5 ,3)
1354 self . widgets [ board -1][14]. clicked . connect ( lambda : self . read_relay ( board ,15) ) 1414 self . widgets [ board -1][44]. clicked . connect ( lambda : self . read_relay ( board ,45) )
1355 self . c h o o s e_ r e l a y _ l a y ou t . addWidget ( self . widgets [ board -1][14] ,1 ,6) 1415 self . c h o o se _ r e l a y _ l a yo u t . addWidget ( self . widgets [ board -1][44] ,5 ,4)
1356 self . widgets [ board -1][15]. clicked . connect ( lambda : self . read_relay ( board ,16) ) 1416 self . widgets [ board -1][45]. clicked . connect ( lambda : self . read_relay ( board ,46) )
1357 self . c h o o s e_ r e l a y _ l a y ou t . addWidget ( self . widgets [ board -1][15] ,1 ,7) 1417 self . c h o o se _ r e l a y _ l a yo u t . addWidget ( self . widgets [ board -1][45] ,5 ,5)
1358 self . widgets [ board -1][16]. clicked . connect ( lambda : self . read_relay ( board ,17) ) 1418 self . widgets [ board -1][46]. clicked . connect ( lambda : self . read_relay ( board ,47) )
1359 self . c h o o s e_ r e l a y _ l a y ou t . addWidget ( self . widgets [ board -1][16] ,2 ,0) 1419 self . c h o o se _ r e l a y _ l a yo u t . addWidget ( self . widgets [ board -1][46] ,5 ,6)
1360 self . widgets [ board -1][17]. clicked . connect ( lambda : self . read_relay ( board ,18) ) 1420 self . widgets [ board -1][47]. clicked . connect ( lambda : self . read_relay ( board ,48) )
1361 self . c h o o s e_ r e l a y _ l a y ou t . addWidget ( self . widgets [ board -1][17] ,2 ,1) 1421 self . c h o o se _ r e l a y _ l a yo u t . addWidget ( self . widgets [ board -1][47] ,5 ,7)
1362 self . widgets [ board -1][18]. clicked . connect ( lambda : self . read_relay ( board ,19) ) 1422
1363 self . c h o o s e_ r e l a y _ l a y ou t . addWidget ( self . widgets [ board -1][18] ,2 ,2) 1423 app =[]
1364 self . widgets [ board -1][19]. clicked . connect ( lambda : self . read_relay ( board ,20) ) 1424 global restart
1365 self . c h o o s e_ r e l a y _ l a y ou t . addWidget ( self . widgets [ board -1][19] ,2 ,3) 1425 restart = True
1366 self . widgets [ board -1][20]. clicked . connect ( lambda : self . read_relay ( board ,21) ) 1426 window =[]
1367 self . c h o o s e_ r e l a y _ l a y ou t . addWidget ( self . widgets [ board -1][20] ,2 ,4) 1427 i =0
1368 self . widgets [ board -1][21]. clicked . connect ( lambda : self . read_relay ( board ,22) ) 1428 while ( restart ) :
1369 self . c h o o s e_ r e l a y _ l a y ou t . addWidget ( self . widgets [ board -1][21] ,2 ,5) 1429 restart = False
1370 self . widgets [ board -1][22]. clicked . connect ( lambda : self . read_relay ( board ,23) ) 1430 app . append ( QApplication ( sys . argv ) )
1371 self . c h o o s e_ r e l a y _ l a y ou t . addWidget ( self . widgets [ board -1][22] ,2 ,6) 1431 window . append ( MainWindow () )
1372 self . widgets [ board -1][23]. clicked . connect ( lambda : self . read_relay ( board ,24) ) 1432 window [ i ]. show ()
1373 self . c h o o s e_ r e l a y _ l a y ou t . addWidget ( self . widgets [ board -1][23] ,2 ,7) 1433 app [ i ]. exec_ ()
1374 self . widgets [ board -1][24]. clicked . connect ( lambda : self . read_relay ( board ,25) ) 1434 i +=1
1375 self . c h o o s e_ r e l a y _ l a y ou t . addWidget ( self . widgets [ board -1][24] ,3 ,0)
1376 self . widgets [ board -1][25]. clicked . connect ( lambda : self . read_relay ( board ,26) )
1377 self . c h o o s e_ r e l a y _ l a y ou t . addWidget ( self . widgets [ board -1][25] ,3 ,1)
Listing B.1: Script Interface gráfica do utilizador
1378 self . widgets [ board -1][26]. clicked . connect ( lambda : self . read_relay ( board ,27) )
1379 self . c h o o s e_ r e l a y _ l a y ou t . addWidget ( self . widgets [ board -1][26] ,3 ,2)
1380 self . widgets [ board -1][27]. clicked . connect ( lambda : self . read_relay ( board ,28) )
1381 self . c h o o s e_ r e l a y _ l a y ou t . addWidget ( self . widgets [ board -1][27] ,3 ,3) 1 import time
1382 self . widgets [ board -1][28]. clicked . connect ( lambda : self . read_relay ( board ,29) ) 2 import RPi . GPIO as GPIO
1383 self . c h o o s e_ r e l a y _ l a y ou t . addWidget ( self . widgets [ board -1][28] ,3 ,4) 3 import spidev
1384 self . widgets [ board -1][29]. clicked . connect ( lambda : self . read_relay ( board ,30) ) 4 from MAX1240_v2 import MAX1240
1385 self . c h o o s e_ r e l a y _ l a y ou t . addWidget ( self . widgets [ board -1][29] ,3 ,5) 5 from MCP3201 import MCP3201
1386 self . widgets [ board -1][30]. clicked . connect ( lambda : self . read_relay ( board ,31) ) 6 from TLV2541 import TLV2541
1387 self . c h o o s e_ r e l a y _ l a y ou t . addWidget ( self . widgets [ board -1][30] ,3 ,6) 7 from ADS7229 import ADS7229
1388 self . widgets [ board -1][31]. clicked . connect ( lambda : self . read_relay ( board ,32) ) 8
1389 self . c h o o s e_ r e l a y _ l a y ou t . addWidget ( self . widgets [ board -1][31] ,3 ,7) 9 from MCP23S17_v3 import MCP23S17
1390 self . widgets [ board -1][32]. clicked . connect ( lambda : self . read_relay ( board ,33) ) 10 import random
1391 self . c h o o s e_ r e l a y _ l a y ou t . addWidget ( self . widgets [ board -1][32] ,4 ,0) 11
1392 self . widgets [ board -1][33]. clicked . connect ( lambda : self . read_relay ( board ,34) ) 12 class Reading_code ( object ) :
1393 self . c h o o s e_ r e l a y _ l a y ou t . addWidget ( self . widgets [ board -1][33] ,4 ,1) 13 """ Esta class inicia todos os ADC ’s para fazer a leitura e estabelece a
1394 self . widgets [ board -1][34]. clicked . connect ( lambda : self . read_relay ( board ,35) ) comunica o
1395 self . c h o o s e_ r e l a y _ l a y ou t . addWidget ( self . widgets [ board -1][34] ,4 ,2) 14 entre o raspeberry e o expansor para efetuar leituras .
1396 self . widgets [ board -1][35]. clicked . connect ( lambda : self . read_relay ( board ,36) ) 15 """
1397 self . c h o o s e_ r e l a y _ l a y ou t . addWidget ( self . widgets [ board -1][35] ,4 ,3) 16
17

91
18 def __init__ ( self , spiDevice = spidev . SpiDev () , MCP1_ = MCP23S17 , MCP2_ = MCP23S17 ,72 else :
iGPIO = GPIO ) : 73 if ( channel <24) :
19 """ I n i c i a l i z a o dos pacotes Spidev () e GPIO do raspberry e i n i c i a l i z a o 74 IADC =1
dos ADC ’s 75 else :
20 """ 76 IADC =2
21 77 else :
22 self . __spi = spiDevice 78 IADC =3
23 self . GPIO = iGPIO 79 else :
24 self . MCP1 = MCP1_ 80 count = sum ( list_adc )
25 self . MCP2 = MCP2_ 81 if ( lv == -1) :
26 self . __spiMode = 0 b00 82 if ( count ==1) :
27 83 for i in range (0 , len ( list_adc ) ) :
28 84 if ( list_adc [ i ]== True ) :
29 MAX12 = MAX1240 (3 , self . __spi , self . MCP1 ) 85 index = i
30 TLV25 = TLV2541 (4 , self . __spi , self . MCP1 ) 86 IADC = index
31 MCPADC = MCP3201 (5 , self . __spi , self . MCP1 ) 87 if ( count ==2) :
32 ADS = ADS7229 (26 , self . __spi , self . MCP2 , iGPIO = GPIO ) 88 c =0
33 self . dic ={0: MAX12 ,1: TLV25 ,2: MCPADC ,3: ADS } 89 for i in range (0 , len ( list_adc ) ) :
34 self . Tboard =0 # estas duas variaveis s o iniciadas para o teste de uma leitura 90 if ( list_adc [ i ]== True ) :
ser feita consecutivemente na mesma r e f e r n c i a 91 list_index [ c ]= i
35 self . Tchannel =0 92 c +=1
36 93 if ( board ==1) :
37 94 IADC = list_index [0]
38 def reading_func ( self , board , channel , lv , type_read , auto , list_adc ) : # se lv = -1 95 else :
e n t o leitura de HV se lv = (0 -3) leitura LV 96 IADC = list_index [1]
39 """ F u n o que efetua a leitura do canal , envia o respetivo e n d e r e o para o 97 if ( count ==3) :
expansor e ADC . 98 if ( board ==1) :
40 Como s e g u r a n a , desliga o r e l que e s t ligado alta t e n s o e verifica - se99 IADC =0
se o canal COM e s t a zero em leituras sequenciais . 100 else :
41 """ 101 if ( channel <24) :
42 assert board in range (1 ,2) , " Input incorreto na variavel board " 102 IADC =1
43 assert channel in range (0 ,47) , " Input incorreto na variavel channel " 103 else :
44 104 IADC =2
45 list_index =[0 ,0] 105 else :
46 EN_ADC =7 106 IADC =3
47 EN_ADC_LV =1 107 else :
48 EN_MUX =0 108 IADC =0
49 switch_V_RD =0 109 EN_MUX =1
50 110 ADC = self . dic [ IADC ]
51 111 MOUT = IADC
52 # leituras HV e LV 112
53 if ( lv == -1) : # HV 113 self . __setupSPI ()
54 DMUX_A =15 - channel %16 114 if ( self . Tboard != board ) | ( self . Tchannel != channel ) : # teste a zero
55 EN_DMUX =63 -2**(( board -1) *3+(( channel ) //16) ) 115 self . Tboard = board
56 HVR_COM = board 116 self . Tchannel = channel
57 SWITCH_LV =0 117 ADC = self . dic [ IADC ]
58 READ_RELAY =1 118 if ( lv == -1) :
59 else : # LV 119 assert ADC . readVoltage () ==0 , " Leitura n o nula , board : " + str ( board )
60 DMUX_A =0 + " canal : " + str ( channel +1)
61 EN_DMUX =63 120 else :
62 HVR_COM =0 121 assert ADC . readVoltage () ==0 , " Leitura n o nula , Low voltage "
63 SWITCH_LV =2** lv 122
64 READ_RELAY =0 123 self . __setupSPI ()
65 124 if ( type_read ==0 or type_read ==1) : # leitura ADC
66 125 GPIOW1 =( switch_V_RD < <15) |( HVR_COM < <13) |( EN_ADC < <10) |( EN_DMUX < <4) | DMUX_A #
67 if ( type_read ==0 or type_read ==1) : e n d e r e o de 16 bits de controlo
68 if ( auto == True ) : 126 GPIOW2 =( MOUT < <7| EN_MUX < <6| READ_RELAY < <5| EN_ADC_LV < <4| SWITCH_LV )
69 if ( lv == -1) : 127 self . MCP1 . writeGPIO ( GPIOW1 )
70 if ( board ==1) : 128 self . MCP2 . writeGPIO ( GPIOW2 )
71 IADC =0 129 data = ADC . readVoltage ()

92
130 # data = random . randint (0 ,10000) 1 import time
131 2 import RPi . GPIO as GPIO
132 self . __setupSPI () 3 import spidev
133 if ( type_read ==0 or type_read ==2) : # leitura voltimetro 4 from MCP3201 import MCP3201
134 if ( lv == -1) : 5
135 READ_RELAY =0 6
136 else : 7 from MCP23S17_v3 import MCP23S17
137 READ_RELAY =1 8 import random
138 GPIOW1 =( switch_V_RD < <15) |( HVR_COM < <13) |( EN_ADC < <10) |( EN_DMUX < <4) | DMUX_A # 9
e n d e r e o de 16 bits de controlo 10 class Reading_code2 ( object ) :
139 GPIOW2 =( MOUT < <7| EN_MUX < <6| READ_RELAY < <5| EN_ADC_LV < <4| SWITCH_LV ) 11 """ Esta class inicia todos os ADC ’s para fazer a leitura e estabelece a
140 self . MCP1 . writeGPIO ( GPIOW1 ) comunica o
141 self . MCP2 . writeGPIO ( GPIOW2 ) 12 entre o raspeberry e o expansor para efetuar leituras .
142 13 """
143 # no final desligo o voltimetro ? 14
144 if ( lv == -1) : 15
145 EN_DMUX =63 # desligar r e l HV 16 def __init__ ( self , spiDevice = spidev . SpiDev () , MCP_ = MCP23S17 , iGPIO = GPIO ) :
146 READ_RELAY =1 17 """ I n i c i a l i z a o dos pacotes Spidev () e GPIO do raspberry e i n i c i a l i z a o
147 else : dos ADC ’s
148 SWITCH_LV =0 # desligar r e l LV 18 """
149 READ_RELAY =0 19
150 20 self . __spi = spiDevice
151 self . __setupSPI () 21 self . GPIO = iGPIO
152 GPIO_defaul1 =( switch_V_RD < <15) |( HVR_COM < <13) |( EN_ADC < <10) |( EN_DMUX < <4) | DMUX_A 22 self . MCP = MCP_
153 GPIO_defaul2 =( MOUT < <7| EN_MUX < <6| READ_RELAY < <5| EN_ADC_LV < <4| SWITCH_LV ) 23 self . __spiMode = 0 b00
154 24
155 self . MCP1 . writeGPIO ( GPIO_defaul1 ) 25
156 self . MCP2 . writeGPIO ( GPIO_defaul2 ) 26
157 27 self . MCPADC = MCP3201 (3 , self . __spi , self . MCP )
158 if ( type_read !=0 or type_read !=1) : 28 self . Tboard =0 # estas duas variaveis s o iniciadas para o teste de uma leitura
159 data =0 ser feita consecutivemente na mesma r e f e r n c i a
160 return data 29 self . Tchannel =0
161 30
162 def HV_IN ( self , board , channel ) : 31
163 """ 32 def reading_func ( self , board , channel , lv , type_read ) :
164 Parameters 33 EN_ADC =1
165 ---------- 34 Switch_Volt =0
166 board : int 1 ou 2 35 Switch_HVIN =0
167 1 corresponde ao lAdo A , 2 corresponde ao lado B 36 # leituras HV e LV
168 channel : int 0 -47 37 if ( lv == -1) : # HV
169 o rel 1 corresponde ao channel 0 38 DMUX_A =15 - channel %16
170 """ 39 EN_DMUX =0
171 assert board in range (1 ,2) , " Input incorreto na variavel board " 40 CDMUX_A =( board -1) *3+(( channel ) //16)
172 assert channel in range (0 ,47) , " Input incorreto na variavel channel " 41 INP_DMUX =0
173 DMUX_A =15 - channel %16 42 HVR_COM = board
174 EN_DMUX =63 -2**(( board -1) *3+(( channel ) //16) ) 43 Switch_HVLV =0
175 HVR_COM = board 44 else : # LV
176 switch_V_RD =1 45 DMUX_A =0
177 EN_ADC =7 46 EN_DMUX =0
178 GPIOW1 =( switch_V_RD < <15) |( HVR_COM < <13) |( EN_ADC < <10) |( EN_DMUX < <4) | DMUX_A 47 CDMUX_A = lv +6
179 GPIOW2 =0 x50 # inativa todos as funcionalidades do EXP2 48 INP_DMUX =0
180 self . __setupSPI () 49 HVR_COM =0
181 self . MCP1 . writeGPIO ( GPIOW1 ) 50 Switch_HVLV =1
182 self . MCP2 . writeGPIO ( GPIOW2 ) 51
183 52
184 def __setupSPI ( self ) : 53 if ( self . Tboard != board ) | ( self . Tchannel != channel ) : # teste a zero
185 self . __spi . mode = self . __spiMode 54 self . Tboard = board
55 self . Tchannel = channel
Listing B.2: Classe Reading code V1 56 ADC = self . MCPADC
57 if ( lv == -1) :

93
58 assert ADC . readVoltage () ==0 , " Leitura n o nula , board : " + str ( board ) 111 GPIOW =( Switch_HVIN < <15) |( Switch_Volt < <14) |( Switch_HVLV < <13) |( HVR_COM < <11) |(
+ " canal : " + str ( channel +1) EN_ADC < <10) |( EN_DMUX < <9) |( INP_DMUX < <8) |( CDMUX_A < <4) | DMUX_A
59 else : 112 self . __setupSPI ()
60 assert ADC . readVoltage () ==0 , " Leitura n o nula , Low voltage " 113 self . MCP . writeGPIO ( GPIOW )
61 114
62 self . __setupSPI () 115
63 116 def __setupSPI ( self ) :
64 if ( type_read ==0 or type_read ==1) : # leitura ADC 117 self . __spi . mode = self . __spiMode
65 GPIOW =( Switch_HVIN < <15) |( Switch_Volt < <14) |( Switch_HVLV < <13) |( HVR_COM < <11) |(
EN_ADC < <10) |( EN_DMUX < <9) |( INP_DMUX < <8) |( CDMUX_A < <4) | DMUX_A # e n d e r e o de 16 bits Listing B.3: Classe Reading code V2
de controlo
66 self . MCP . writeGPIO ( GPIOW )
67
68 data = ADC . readVoltage () 1 # !/ usr / bin / python
69 # data = random . randint (0 ,10000) 2
70 3 # Copyright 2016 -2019 Florian Mueller ( c o n t a c t @ p e t r o c k b l o c k . com )
71 self . __setupSPI () 4 #
72 5 # Permission is hereby granted , free of charge , to any person obtaining
73 if ( type_read ==0 or type_read ==2) : # leitura voltimetro 6 # a copy of this software and associated documentation files ( the
74 Switch_Volt =1 7 # " Software ") , to deal in the Software without restriction , including
75 GPIOW =( Switch_HVIN < <15) |( Switch_Volt < <14) |( Switch_HVLV < <13) |( HVR_COM < <11) |( 8 # without limitation the rights to use , copy , modify , merge , publish ,
EN_ADC < <10) |( EN_DMUX < <9) |( INP_DMUX < <8) |( CDMUX_A < <4) | DMUX_A # e n d e r e o de 16 bits 9 # distribute , sublicense , and / or sell copies of the Software , and to
de controlo 10 # permit persons to whom the Software is furnished to do so , subject to
76 self . MCP . writeGPIO ( GPIOW ) 11 # the following conditions :
77 12 #
78 13 # The above copyright notice and this permission notice shall be
79 EN_DMUX =1 14 # included in all copies or substantial portions of the Software .
80 Switch_Volt =0 15 #
81 GPIOdefault =( Switch_HVIN < <15) |( Switch_Volt < <14) |( Switch_HVLV < <13) |( HVR_COM < <11)16 # THE SOFTWARE IS PROVIDED " AS IS " , WITHOUT WARRANTY OF ANY KIND ,
|( EN_ADC < <10) |( EN_DMUX < <9) |( INP_DMUX < <8) |( CDMUX_A < <4) | DMUX_A # e n d e r e o de 16 bits 17 # EXPRESS OR IMPLIED , INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
de controlo 18 # MERCHANTABILITY , FITNESS FOR A PARTICULAR PURPOSE AND
82 self . MCP . writeGPIO ( GPIOdefault ) 19 # NONINFRINGEMENT . IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
83 20 # LIABLE FOR ANY CLAIM , DAMAGES OR OTHER LIABILITY , WHETHER IN AN ACTION
84 21 # OF CONTRACT , TORT OR OTHERWISE , ARISING FROM , OUT OF OR IN CONNECTION
85 if ( type_read !=0 or type_read !=1) : 22 # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE .
86 data =0 23
87 return data 24# Modified Version
88 25# Each object receives the SPI connection and GPIO lines for the chip select and is
89 initialized using them
90 26 # the Cs of the board is not used
91 def HV_IN ( self , board , channel ) : 27 # All the pins are initialized as OUTPUTS !!
92 """ 28
93 Parameters 29 import time
94 ---------- 30
95 board : int 1 ou 2 31 import RPi . GPIO as GPIO
96 1 corresponde ao lAdo A , 2 corresponde ao lado B 32
97 channel : int 0 -47 33 import spidev
98 o rel 1 corresponde ao channel 0 34
99 """ 35
100 assert board in range (1 ,2) , " Input incorreto na variavel board " 36 class MCP23S17 ( object ) :
101 assert channel in range (0 ,47) , " Input incorreto na variavel channel " 37 """ This class provides an abstraction of the GPIO expander MCP23S17
102 EN_ADC =1 38 for the Raspberry Pi .
103 Switch_Volt =0 39 It is depndent on the Python packages spidev and RPi . GPIO , which can
104 Switch_HVIN =1 40 be get from https :// pypi . python . org / pypi / RPi . GPIO /0.5.11 and
105 DMUX_A =15 - channel %16 41 https :// pypi . python . org / pypi / spidev .
106 EN_DMUX =0 42 """
107 CDMUX_A =( board -1) *3+(( channel ) //16) 43 PULLUP_ENABLED = 0
108 INP_DMUX =0 44 PULLUP_DISABLED = 1
109 HVR_COM = board 45
110 Switch_HVLV =0 46 DIR_INPUT = 0
47 DIR_OUTPUT = 1

94
48 104 " GPIOA " : 0 b00000000 ,
49 LEVEL_LOW = 0 105 " GPIOB " : 0 b111111101 ,
50 LEVEL_HIGH = 1 106 " IODIRA " : 0 b00000000 ,
51 107 " IODIRB " : 0 b00000000 ,
52 """ Register addresses for IOCON . BANK = 0 as documentined in the technical data 108 " GPPUA " : 0 ,
sheet at 109 " GPPUB " : 0 ,
53 http :// ww1 . microchip . com / downloads / en / DeviceDoc /21952 b . pdf 110 }
54 """ 111 self . __spi = spiDevice
55 R EG IS T ER _ AD DR E SS E S = { 112 self . __setupGPIO ()
56 113
57 " IODIRA " : 0 x00 , 114 def configureMCP ( self ) :
58 " IODIRB " : 0 x01 , 115 """
59 " IPOLA " : 0 x02 , 116 Configuration of the port expander :
60 " IPOLB " : 0 x03 , 117 SEQOP bit of IODIR register is set to 1 to disable sequential operation
61 " GPIOA " : 0 x12 , 118 All pins are set as outputs ( IODIR registers set to 0)
62 " GPIOB " : 0 x13 , 119 """
63 " OLATA " : 0 x14 , 120
64 " OLATB " : 0 x15 , 121 self . __writeRegister ( MCP23S17 . R EG I ST ER _ AD D RE SS E S [ " IOCON " ] , MCP23S17 . IOCON_INIT )
65 " IOCON " : 0 x0A , 122 self . __writeRegister ( MCP23S17 . R EG I ST ER _ AD D RE SS E S [ " IODIRA " ] , 0 b00000000 )
66 " GPPUA " : 0 x0C , 123 self . registerValue [ " IODIRA " ] = 0 b00000000
67 " GPPUB " : 0 x0D 124 self . __writeRegister ( MCP23S17 . R EG I ST ER _ AD D RE SS E S [ " IODIRB " ] , 0 b00000000 )
68 125 self . registerValue [ " IODIRB " ] = 0 b00000000
69 } 126
70 127
71 """ Bit field flags as documentined in the technical data sheet at 128 def setPullupMode ( self , pin , mode ) :
72 http :// ww1 . microchip . com / downloads / en / DeviceDoc /21952 b . pdf 129 """ Enables or disables the pull - up mode for input pins .
73 """ 130
74 IOCON_UNUSED = 0 x01 131 Parameters :
75 IOCON_INTPOL = 0 x02 132 pin -- The pin index (1 - 8 for BANK B and 21 - 28 for the BANK A )
76 IOCON_ODR = 0 x04 133 mode -- The pull - up mode ( MCP23S17 . PULLUP_ENABLED , MCP23S17 . PULLUP_DISABLED )
77 IOCON_HAEN = 0 x08 134 """
78 IOCON_DISSLW = 0 x10 135
79 IOCON_SEQOP = 0 x20 136 assert pin in range (1 , 9) or pin in range (21 , 29)
80 IOCON_MIRROR = 0 x40 137 assert ( mode == MCP23S17 . PULLUP_ENABLED ) or ( mode == MCP23S17 . PULLUP_DISABLED )
81 IOCON_BANK = 0 x80 138
82 139 if pin in range (21 , 29) :
83 IOCON_INIT = IOCON_SEQOP # Variable that stores IOCON bits that are to be active 140 address = MCP23S17 . R E GI ST E R_ A DD RE S SE S [ " GPPUA " ]
84 141 data = self . registerValue [ " GPPUA " ]
85 CMD_WRITE = 0 x40 # Write command 142 noshifts = pin - 21
86 CMD_READ = 0 x41 # Read command 143 else :
87 144 address = MCP23S17 . R E GI ST E R_ A DD RE S SE S [ " GPPUB " ]
88 def __init__ ( self , spiDevice = spidev . SpiDev () , device_id =0 x00 , pin_reset = -1 , 145 data = self . registerValue [ " GPPUB " ]
chip_select = -1 , iGPIO = GPIO ) : 146 noshifts = ( pin + 7) & 0 x07
89 """ 147
90 Constructor 148 if mode == MCP23S17 . PULLUP_ENABLED :
91 Initializes all attributes with 0. 149 data |= (1 << noshifts )
92 150 else :
93 Keyword arguments : 151 data &= (~(1 << noshifts ) )
94 device_id -- The device ID of the component , i . e . , the hardware address ( 152
default 0) 153 self . __writeRegister ( address , data )
95 pin_cs -- The pin of the Raspberry Pi that will be used as chip select of the 154
MCP 155 if pin in range (21 , 29) :
96 pin_reset -- The pin of the Raspberry Pi that will be used as reset of the MCP 156 self . registerValue [ " GPPUA " ] = data
97 """ 157 else :
98 self . device_id = device_id 158 self . registerValue [ " GPPUB " ] = data
99 self . __pin_reset = pin_reset 159
100 self . __chip_select = chip_select 160 def setDirection ( self , pin , direction ) :
101 self . __GPIO = iGPIO 161 """ Sets the direction for a given pin .
102 self . __spiMode = 0 b00 162
103 self . registerValue = { 163 Parameters :

95
164 pin -- The pin index (0 - 15) 222 level -- The logical level to be set ( LEVEL_LOW , LEVEL_HIGH )
165 direction -- The direction of the pin ( MCP23S17 . DIR_INPUT , MCP23S17 . DIR_OUTPUT 223
) """
166 """ 224
167 225 assert pin in range (1 , 9) or pin in range (21 , 29)
168 assert pin in range (1 , 9) or pin in range (21 , 29) 226 assert ( level == MCP23S17 . LEVEL_HIGH ) or ( level == MCP23S17 . LEVEL_LOW )
169 assert direction == MCP23S17 . DIR_INPUT or direction == MCP23S17 . DIR_OUTPUT 227
170 228 if pin in range (21 , 29) :
171 if pin in range (21 , 29) : 229 address = MCP23S17 . R E GI ST E R_ A DD RE S SE S [ " GPIOA " ]
172 address = MCP23S17 . R E GI S TE R_ A DD RE S SE S [ " IODIRA " ] 230 data = self . registerValue [ " GPIOA " ]
173 data = self . registerValue [ " IODIRA " ] 231 noshifts = pin - 21
174 noshifts = pin - 21 232 else :
175 else : 233 address = MCP23S17 . R E GI ST E R_ A DD RE S SE S [ " GPIOB " ]
176 address = MCP23S17 . R E GI S TE R_ A DD RE S SE S [ " IODIRB " ] 234 data = self . registerValue [ " GPIOB " ]
177 data = self . registerValue [ " IODIRB " ] 235 noshifts = ( pin + 7) & 0 x07
178 noshifts = ( pin + 7) & 0 x07 236
179 237 if level == MCP23S17 . LEVEL_HIGH :
180 238 data |= (1 << noshifts )
181 if direction == MCP23S17 . DIR_INPUT : 239 else :
182 data |= (1 << noshifts ) 240 data &= (~(1 << noshifts ) )
183 else : 241
184 data &= (~(1 << noshifts ) ) 242 self . __writeRegister ( address , data )
185 243
186 self . __writeRegister ( address , data ) 244 if pin in range (21 , 29) :
187 245 self . registerValue [ " GPIOA " ] = data
188 if pin in range (21 , 29) : 246 else :
189 self . registerValue [ " IODIRA " ] = data 247 self . registerValue [ " GPIOB " ] = data
190 else : 248
191 self . registerValue [ " IODIRB " ] = data 249 def writeGPIO ( self , data ) :
192 250 """ Sets the data port value for all pins .
193 def digitalRead ( self , pin ) : 251 Parameters :
194 """ Reads the logical level of a given pin . 252 data - The 16 - bit value to be set .
195 253 """
196 Parameters : 254 assert data <= 0 b11 1111 111 111 111 1
197 pin -- The pin index (0 - 15) 255
198 Returns : 256 self . registerValue [ " GPIOA " ] = ( data & 0 xFF )
199 - MCP23S17 . LEVEL_LOW , if the logical level of the pin is low , 257 self . registerValue [ " GPIOB " ] = ( data >> 8)
200 - MCP23S17 . LEVEL_HIGH , otherwise . 258 self . __writeRegister ( MCP23S17 . R EG I ST ER _ AD D RE SS E S [ " GPIOA " ] , data & 0 xFF )
201 """ 259 self . __writeRegister ( MCP23S17 . R EG I ST ER _ AD D RE SS E S [ " GPIOB " ] , data >> 8)
202 260
203 assert pin in range (1 , 9) or pin in range (21 , 29) 261 def readGPIO ( self ) :
204 262 """ Reads the data port value of all pins .
205 if pin in range (21 , 29) : 263 Returns :
206 self . registerValue [ " GPIOA " ] = self . __readRegister ( MCP23S17 . 264 - The 16 - bit data port value """
R EG IS T ER _ AD DR E SS E S [ " GPIOA " ]) 265
207 if self . registerValue [ " GPIOA " ] & (1 << ( pin - 21) ) != 0: 266 data_GPIOA = self . __readRegister ( MCP23S17 . RE G IS TE R _A DD R ES S ES [ " GPIOA " ])
208 return MCP23S17 . LEVEL_HIGH 267 data_GPIOB = self . __readRegister ( MCP23S17 . RE G IS TE R _A DD R ES S ES [ " GPIOB " ])
209 else : 268
210 return MCP23S17 . LEVEL_LOW 269 self . registerValue [ " GPIOA " ] = data_GPIOA
211 else : 270 self . registerValue [ " GPIOB " ] = data_GPIOB
212 self . registerValue [ " GPIOB " ] = self . __readRegister ( MCP23S17 . 271 data = ( data_GPIOB << 8) | data_GPIOA
R EG IS T ER _ AD DR E SS E S [ " GPIOB " ]) 272 return data
213 if self . registerValue [ " GPIOB " ] & 1 << (( pin + 7) & 0 x07 ) != 0: 273
214 return MCP23S17 . LEVEL_HIGH 274 def __writeRegister ( self , address , value ) :
215 else : 275
216 return MCP23S17 . LEVEL_LOW 276 command = MCP23S17 . CMD_WRITE | ( self . device_id << 1)
217 277 self . __setupSPI ()
218 def digitalWrite ( self , pin , level ) : 278 self . __GPIO . output ( self . __chip_select , self . __GPIO . LOW )
219 """ Sets the level of a given pin . 279 self . __spi . xfer2 ([ command , address , value ])
220 Parameters : 280 self . __GPIO . output ( self . __chip_select , self . __GPIO . HIGH )
221 pin -- The pin index (0 - 15) 281

96
282 def __readRegister ( self , address ) : 38 time . sleep (0.0001) # wait 9 us for conversion to complete ( time specified is
283 actually 7.5 us )
284 command = MCP23S17 . CMD_READ | ( self . device_id << 1) 39 self . __setupSPI ()
285 self . __setupSPI () 40 data = self . __spi . xfer2 ([0 , 0])
286 self . __GPIO . output ( self . __chip_select , self . __GPIO . LOW ) 41 self . __MCP . digitalWrite ( self . __chip_select , self . __MCP . LEVEL_HIGH )
287 data = self . __spi . xfer2 ([ command , address , 0]) 42
288 self . __GPIO . output ( self . __chip_select , self . __GPIO . HIGH ) 43 first_byte = data [0]
289 return data [2] 44 second_byte = data [1]
290 45 # The first bit is ’1 ’ and only represents the end of conversion
291 def __setupGPIO ( self ) : 46 # so it must be deleted
292 47 first_byte = ( first_byte & 0 x7F ) << 5
293 self . __GPIO . setup ( self . __chip_select , self . __GPIO . OUT ) 48 second_byte = second_byte >> 3
294 self . __GPIO . output ( self . __chip_select , self . __GPIO . HIGH ) 49 self . __voltageBits = first_byte | second_byte
295 50
296 def __setupSPI ( self ) : 51 return self . __voltageBits
297 52
298 self . __spi . mode = self . __spiMode 53
54 def __setupSPI ( self ) :
55 self . __spi . mode = self . __spiMode
Listing B.4: Classe Exapansor MCP23S17
Listing B.5: Classe ADC MAX1240

1 import time
2 import spidev 1 import time
3 from MCP23S17_v3 import MCP23S17 2 import spidev
4 3 from MCP23S17_v3 import MCP23S17
5 class MAX1240 ( object ) : 4
6 """ This class provides an abstraction of the 12 - bit 5 class MCP3201 ( object ) :
7 ADC MAX1240 for the Raspberry Pi . 6
8 It is depndent on the Python packages spidev and RPi . GPIO , which can 7
9 be get from https :// pypi . python . org / pypi / RPi . GPIO /0.5.11 and 8 def __init__ ( self , chip_select , spiDevice = spidev . SpiDev () , MCP = MCP23S17 ) :
10 https :// pypi . python . org / pypi / spidev . 9 """
11 """ 10 Constructor
12 11 Initializes all attributes
13 def __init__ ( self , chip_select , spiDevice = spidev . SpiDev () , MCP = MCP23S17 ) : 12
14 """ 13 Keyword arguments :
15 Constructor 14 vref -- reference voltage for voltage calculations
16 Initializes all attributes 15 chip_select -- pin of the MCP23S17 port expander , to be used as chip select
17 16 """
18 Keyword arguments : 17
19 vref -- reference voltage for voltage calculations 18 self . __chip_select = chip_select
20 chip_select -- pin of the MCP23S17 port expander , to be used as chip select 19 self . __MCP = MCP
21 """ 20 self . __spi = spiDevice
22 21 self . __spiMode = 0 b00
23 self . __chip_select = chip_select 22 self . __voltageBits = 0
24 self . __MCP = MCP 23
25 self . __spi = spiDevice 24
26 self . __spiMode = 0 b00 25 def readVoltage ( self ) :
27 self . __voltageBits = 0 26
28 27
29 28 self . __MCP . digitalWrite ( self . __chip_select , self . __MCP . LEVEL_LOW )
30 def readVoltage ( self ) : 29 time . sleep (0.0001) # wait 9 us for conversion to complete ( time specified is
31 """ actually 7.5 us )
32 Reads the voltage as a word of 12 bits . Bytes are sent with MSB first , and bits30 self . __setupSPI ()
are clocked 31 data = self . __spi . xfer2 ([0 , 0])
33 at the rising edge o SCLK 32 self . __MCP . digitalWrite ( self . __chip_select , self . __MCP . LEVEL_HIGH )
34 Returns and integer less then 4096 33
35 """ 34 first_byte = data [0]
36 self . __setupSPI () 35 second_byte = data [1]
37 self . __MCP . digitalWrite ( self . __chip_select , self . __MCP . LEVEL_LOW ) 36 # The first bit is ’1 ’ and only represents the end of conversion

97
37 # so it must be deleted 1 import time
38 first_byte = ( first_byte & 0 x1F ) << 8 2 import spidev
39 second_byte = second_byte > >1 3 from MCP23S17_v3 import MCP23S17
40 self . __voltageBits = first_byte | second_byte 4 import RPi . GPIO as GPIO
41 5
42 return self . __voltageBits 6 class ADS7229 ( object ) :
43 7
44 8 CONF1 =0 xE9FD >> 8
45 def __setupSPI ( self ) : 9 CONF2 =0 xE9FD & 0 xFF
46 self . __spi . mode = self . __spiMode 10 LEIT1 =0 xD000 >> 8
11 LEIT2 =0 xD000 & 0 xFF
Listing B.6: Classe ADC MCP3201 12
13 def __init__ ( self , chip_select , spiDevice = spidev . SpiDev () , MCP = MCP23S17 , iGPIO =
GPIO ) :
14
1 import spidev
15 self . __MCP = MCP
2 import RPi . GPIO as GPIO
16 self . __spi = spiDevice
3 import time
17 self . __spiMode = 0 b01
4 from MCP23S17_v3 import MCP23S17
18 self . __chip_select = chip_select
5
19 self . __GPIO = iGPIO
6 class TLV2541 ( object ) :
20 self . __voltageBits = 0
7
21 self . __MCP . digitalWrite (25 , self . __MCP . LEVEL_LOW )
8 SP I_M AX_F REQ UEN CY = 20 * 10**6
22 self . __setupSPI ()
9 SP I_M IN_F REQ UEN CY = 100 * 10**3
23 self . __spi . xfer2 ([ self . CONF1 , self . CONF2 ])
10 CONVERSION_TIME = 3.5 * 10**( -6)
24 self . __MCP . digitalWrite (25 , self . __MCP . LEVEL_HIGH )
11 SPI_MODE = 0 b01
25
12
26 def readVoltage ( self ) :
13 def __init__ ( self , chip_select , spi = spidev . SpiDev () , MCP = MCP23S17 ) :
27
14
28 self . __MCP . digitalWrite (25 , self . __MCP . LEVEL_LOW )
15 self . __chip_select = chip_select
29 self . __setupSPI ()
16 self . __MCP = MCP
30 data = self . __spi . xfer2 ([ self . LEIT1 , self . LEIT2 ])
17 self . __spi = spi
31 self . __MCP . digitalWrite (25 , self . __MCP . LEVEL_HIGH )
18 self . __voltageBits = 0
32 first_byte = data [0]
19
33 second_byte = data [1]
20 def readVoltage ( self ) :
34
21
35 first_byte = first_byte << 4
22 self . __setupSPI ()
36 second_byte = second_byte >> 4
23 self . __spi . xfer2 ([0]) # one SCLK must be sent when CS is high
37 self . __voltageBits = first_byte | second_byte
24 self . __MCP . digitalWrite ( self . __chip_select , self . __MCP . LEVEL_LOW )
38
25 self . __setupSPI ()
39 return self . __voltageBits
26 buff = self . __spi . xfer2 ([0 , 0])
40
27
41 def __setupSPI ( self ) :
28 self . __MCP . digitalWrite ( self . __chip_select , self . __MCP . LEVEL_HIGH )
42 self . __spi . mode = self . __spiMode
29 self . __setupSPI ()
30 self . __spi . xfer2 ([0]) # one SCLK must be sent when CS is high
31 Listing B.8: Classe ADC ADS7229
32 time . sleep ( self . CONVERSION_TIME )
33
34 MSB = buff [0]
35 LSB = buff [1]
36 LSB >> 4
37 MSB << 4
38 data = MSB | LSB
39
40 return data
41
42 def __setupSPI ( self ) :
43 self . __spi . mode = self . SPI_MODE

Listing B.7: Classe ADC TLV2541

98

Você também pode gostar