You are on page 1of 22

UNIVERSIDADE FEDERAL DO PARANÁ

CURSO DE GRADUAÇÃO EM ENGENHARIA ELÉTRICA

AMANDA PRESENDO PASSERO GRR 20172190


ANA JÚLIA NIELSEN ALVES GRR 20175962
TIAGO JULES ROCHA NEIVA DE LIMA GRR 20162862

PROJETO FINAL PARA DISCIPLINA DE INSTRUMENTAÇAO E CONTROLE

Etapa I do Projeto Final de


Instrumentação e Controle, referente a
controle de um motor por meio do uso de
encoder rotativo incremental e um Arduino
UNO.

Professor Doutor José Carlos da Cunha.

CURITIBA 2019
1. INTRODUÇÃO SOBRE O FUNCIONAMENTO DO ROTARY ENCODER

Encoder (Celesco Transducer Product)


Encoders são dispositivos/sensores eletromecânicos cuja funcionalidade é
transformar posição em sinal elétrico digital. Com a utilização de encoders é possível
quantizar distâncias, controlar velocidades, medir ângulos, número de rotações,
realizar posicionamentos, rotacionar braços robóticos e etc. O tipo mais comum de
encoder é o com saída incremental em quadratura, sinal disposto através de canais
(canal A, canal B, canal Z e complementares). Tal saída pode ser fixa em 5 Volts
VDC/VCC (saída TTL) ou numa faixa de tensão de 5 a 30 Volts VDC/VCC (saída HTL,
compreende 12V, 24V, etc).

TECNOLOGIAS CONSTRUTIVAS DOS ENCODERS:

Os encoders podem ser implementados usando diferentes tipos de técnicas:


MECÂNICO (faixas/trilhos condutores): uma série de pastilhas de cobre
gravadas em uma PCB são usadas para codificarem as informações. As escovas de
contato detectam as áreas condutoras. Essa forma de codificador é raramente vista,
exceto em multímetros digitais.

ÓPTICO: é utilizada uma cabeça de leitura fixa que inclui uma fonte luminosa
(LED infravermelho) e, um receptor fotodetector (fototransistor ou fotodiodo) que emite
luz através de fendas em um disco de metal ou vidro. Versões reflexivas também
existem. Essa é uma das tecnologias mais comuns.

MAGNÉTICO: faixas/tiras de material magnetizado são colocadas no disco


rotativo e são detectadas por um sensor de efeito Hall ou sensor magnetorresistivo. Os
sensores de efeito Hall também são usados para detectar os dentes da engrenagem
diretamente, sem a necessidade de um disco codificador em separado.

ENCODER ÓPTICO:

O encoder é composto basicamente por um disco com marcações, um


componente emissor e um receptor. Os encoders ópticos utilizam led como o
componente emissor e um sensor fotodetector como o receptor (Figuras 1 e 2). Os
fotodiodos detectam a luz que passa através do disco e emitem formas de onda de
pulso correspondentes aos padrões translúcidos e opacos nos segmentos do disco
(bloqueio e desbloqueio do feixe de luz do led para o fotodetector), sendo que também
existem modelos que funcionam com base em franjas de interferência. Desse modo à
medida que o disco vai girando o fotodetector, juntamente com um circuito eletrônico,
repassa para as saídas do encoder um sinal em forma de uma onda quadrada,
proporcional ao número de marcações. Sendo assim, a resolução do encoder é o
número de janelas ou de setores transparentes/opacos que equivale a quantidade de
ondas quadradas, ou clock, gerado em uma volta do encoder, podendo ser
incrementada pela detecção das bordas das janelas.
Figura1 Figura 2

 
  
  
  
  

Disco de
Disco de Disco de Disco de
resolução de Disco de resolução
resolução de 32 resolução de 64 resolução de 128
16 de 516 pulsos/volta
pulsos/volta pulsos/volta pulsos/volta
pulsos/volta
Princípio de funcionamento dos encoders por reflexão.

Quando se utilizam regiões opacas e transparentes o emissor e o receptor precisam


ser colocados em cada lado do elemento em movimento (vide Figura acima).

Existem dois tipos principais de encoders: incremental e absoluto. O


codificador(encoder) incremental lê as mudanças no deslocamento angular, enquanto
o codificador absoluto lê o ângulo absoluto do eixo codificado. Eles são
implementados usando três tecnologias comuns; óptica, mecânica ou magnética, já
mencionadas.

Exemplos de discos ópticos incrementais e absolutos. O disco incremental gera dois


sinais de onda quadrada com uma diferença de fase de 90˚ entre eles. O disco
absoluto gera dados codificados binários. (Fonte da imagem: Digi-Key Electronics)

O disco absoluto na figura acima possui quatro saídas, fornecendo um código binário
exclusivo para cada segmento do disco, dezesseis nesse caso (conforme
demonstrado na tabela abaixo). Uma alternativa ao código binário é o código cinza,
que é um código binário em que palavras binárias adjacentes diferem apenas por uma
transição de bit único.
Número do Setor Faixa Setorial (em graus) Código Binário

0 360/0 - 22.5 0000

1 22.5 - 45 0001

2 45 - 67.5 0010

3 67.5 - 90 0011

4 90 - 112.5 0100

5 112.5 - 135 0101

6 135 - 157.5 0110

7 157.5 - 180 0111

8 180 - 202.5 1000

9 202.5 - 225 1001

10 225 - 247.5 1010

11 247.5 - 270 1011

12 270 - 292.5 1100

13 292.5 - 315 1101

14 315 - 337.5 1110

15 337.5 - 360/0 1111


1.1 ROTARY ENCODER INCREMENTAL (CODIFICADOR DE ROTAÇÃO
INCREMENTAL):
O encoder óptico incremental indica a posição relativa ao ponto onde o encoder foi
ativado. O tipo mais comum do mercado possui 3 sinais de saída: "A", "B" e "O", mas
há também modelos com saídas tipo diferencial com os sinais A, /A, B, /B, Z e /Z; com
esses sinais adquire-se o ângulo de rotação, o sentido da rotação e o início/fim de
uma volta. O sinal A é o sinal principal, que fornece os pulsos (ou clock) à medida que
o encoder gira. O sinal B é equivalente ao sinal A, porém defasado em + ou -90°, cujo
objetivo é sinalizar o sentido da rotação, e o sinal O (ou Z ou I) indica o início de uma
revolução.
Quando o sinal B estiver adiantado em 90º do sinal A o encoder gira no sentido
anti-horário, neste caso a borda de subida de um sinal A se encontra com o sinal B
no estado 1, analogamente, quando a B estiver em 0 durante a borda de subida do
sinal A, o encoder estará girando no sentido horário.

O terceiro sinal do encoder, o sinal O ou Z ou I, tem por objetivo indicar a posição "0"
(zero) do encoder, com essa informação é possível detectar o número de voltas completas
que o dispositivo acoplado ao encoder gerou.

  
  
Disco de resolução de 32 Disco de resolução de
pulsos/volta, sem sinal de sincronismo 32 pulsos/volta, com sinal de sincronismo
Os principais problemas dos encoders ópticos são provenientes de partículas de
sujeira e/ou efeitos devidos a vibrações e, os encoders ópticos incrementais ainda tem
uma desvantagem adicional que é a necessidade de contadores externos para
determinar o ângulo absoluto para uma dada rotação. Na prática, um encoder
incremental de posição pode ser formado por uma régua linear, ou por um disco de
baixa inércia, interfaceado a um dispositivo cuja posição deve ser determinada.

2. EXPERIMENTAÇAO E AQUISIÇAO DE DADOS NO


FUNCIONAMENTO DO ENCODER

2.1.CONDICIONAMENTO DO SINAL DO SENSOR

A aquisição do sinal do encoder foi de forma direta, não necessitando de


linearização:

9505
9513
9517
9512
9509
9510
9507
9503
9505
9502
9510
9507
9510
9506
9510
9509
9511
9514
9512
9515
9516
9516
9521
9512
9506
9521
9528
9522
9512
9516
9513
9518
9515
9507
9511
9507
9505
9505
9505
9502
9509
9506
9510
9508
9508
9510
9512
9513
9512
9512
9515
9522
9515
9503
9522
9525
9527
9522
9519
9520

2.2 CALIBRAÇÃO DO ENCODER

Código de calibração

import numpy as np
import matplotlib.pyplot as plt
import json
from matplotlib.ticker import MultipleLocator
import scipy
from scipy import interpolate
from scipy import stats
from scipy.stats import norm
import csv
def get_data(file):
data = list()
with open(file, 'r') as f:
reader = csv.reader(f)
for row in reader:
for i in range(0, len(row)):
data.append(float(row[i]))
f.close()
return data

results = np.array(get_data('medidas.csv'))

# calculando a média

mean = np.sum(results) / np.size(results)

# desvio da média

deviation = results - mean

# variância - só falta somar

variance = deviation * deviation

standard_uncertainty = np.sqrt(np.sum(variance) / (np.size(variance) -


1))

print("Mean: {:.2f}".format(mean))

print("Standard uncertainty: {:.2f}".format(standard_uncertainty))

b0 = 0

b1 = 75 / mean

reg_y = np.poly1d([b1, b0])

calibration_deviation = reg_y(deviation)

#: distribuição estatistica dos dados brutos


yp = deviation

diff_yp = np.max(yp) - np.min(yp)

loc, scale = norm.fit(yp)

whist, bin_edges = np.histogram(yp,


bins=50,
density=True)

wbin_edges = list()

for i in range(np.size(bin_edges) - 1):


wbin_edges.append(bin_edges[i] + (bin_edges[i + 1] - bin_edges[i]) / 2)

bin_edges = np.array(wbin_edges)

bin_width = 0.9 * (diff_yp) / np.size(bin_edges)

stddev = norm.std(loc, scale)

mean = norm.mean(loc, scale)

# whist = whist / np.sum(whist)

hist = whist

rv_x = np.arange(np.min(yp), np.max(yp), (np.max(yp) - np.min(yp)) /


100)

rv_values = norm.pdf(rv_x, loc, scale)

c_interval = norm.interval(0.95, loc, scale)

rv_x_confidence_interval = np.arange(c_interval[0],
c_interval[1],
abs(c_interval[0] - c_interval[1]) / 100)

rv_values_confidence_interval = norm.pdf(rv_x_confidence_interval, loc,


scale)

#: histograma
plt.clf()

plt.bar(bin_edges,
hist,
color='#a4c0f4',
edgecolor="#000000",
width=bin_width,
linewidth=0.1,
align='center',
label="Histograma")

plt.plot(rv_x,
rv_values,
linestyle="dashed",
color='#000000',
label="Distribuição")

plt.plot(rv_x_confidence_interval,
rv_values_confidence_interval,
color="#000000")

plt.fill_between(rv_x_confidence_interval,
0,
rv_values_confidence_interval,
facecolor='#4a84ef',
label="Intervalo de confiança (95%)")

plt.xlabel("Desvios da média (pulsos)")

plt.ylabel("Frequência do Intervalo")

plt.legend(loc='best', ncol=1, shadow=True, fancybox=True)

plt.show()

#: calibração

yp = calibration_deviation

diff_yp = np.max(yp) - np.min(yp)

loc, scale = norm.fit(yp)

whist, bin_edges = np.histogram(yp,


bins=50,
density=True)

wbin_edges = list()

for i in range(np.size(bin_edges) - 1):


wbin_edges.append(bin_edges[i] + (bin_edges[i + 1] - bin_edges[i]) / 2)

bin_edges = np.array(wbin_edges)

bin_width = 0.9 * (diff_yp) / np.size(bin_edges)

stddev = norm.std(loc, scale)

mean = norm.mean(loc, scale)

# whist = whist / np.sum(whist)

hist = whist

rv_x = np.arange(np.min(yp), np.max(yp), (np.max(yp) - np.min(yp)) /


100)

rv_values = norm.pdf(rv_x, loc, scale)

c_interval = norm.interval(0.95, loc, scale)

rv_x_confidence_interval = np.arange(c_interval[0],
c_interval[1],
abs(c_interval[0] - c_interval[1]) / 100)

rv_values_confidence_interval = norm.pdf(rv_x_confidence_interval, loc,


scale)

#: histograma

plt.clf()

plt.bar(bin_edges,
hist,
color='#a4c0f4',
edgecolor="#000000",
width=bin_width,
linewidth=0.1,
align='center',
label="Histograma")

plt.plot(rv_x,
rv_values,
linestyle="dashed",
color='#000000',
label="Distribuição")

plt.plot(rv_x_confidence_interval,
rv_values_confidence_interval,
color="#000000")

plt.fill_between(rv_x_confidence_interval,
0,
rv_values_confidence_interval,
facecolor='#4a84ef',
label="Intervalo de confiança (95%)")

plt.xlabel("Desvios do Valor Verdadeiro Convencional (cm)")

plt.ylabel("Frequência do Intervalo")

plt.legend(loc='best', ncol=1, shadow=True, fancybox=True)

plt.show()

print("Repeatability: +/- {:.6f} cm".format(c_interval[1]))

print("Resultados da curva de calibração => a equação que transforma


pulsos em cm é:")

print(reg_y)
Curva de calibração normalizada, com intervalo de confiança de 95%
(altura padrão do elevador de 75cm)

Para a curva de calibração consideramos a altura padrão do elevador (75cm) e


a contagem de pulsos. Dados obtidos:

 9512.25 pulsos por ciclo completo;


 Incerteza padrão: 6.34 pulsos por ciclo completo
 Incerteza(repetibilidade): +/- 0.097190 cm a cada 75 cm

Resultados da curva de calibração > a equação que transforma pulsos em cm


é:
Distância (cm) = 0.007885 × pulsos

REFERÊNCIAS:

Notas de aula do professor José Roberto Cunha – Instrumentação e Controle


(TE 331)

https://www.embarcados.com.br/condicionamento-de-sinais-analogicos/

https://www.hitecnologia.com.br/blog/o-que-%C3%A9-encoder-para-que-serve-
como-escolher-como-interfacear/

https://www.digikey.ca/en/articles/techzone/2018/dec/how-to-use-rotary-
encoders-convert-mechanical-rotation-digital-signals

https://www.solidswiki.com/index.php?title=Absolute_Encoders

BALBINOT, Alexandre e BRUSAMARELLO, Valner João. Instrumentação e


Fundamentos de Medidas, vol. 2, ed. LTC, 2010.
3. CONCLUSÕES:

Etapa 1 ➢ Condicionamento do sinal do sensor ➢ Aquisição das medidas (conversão


A/D) e calibração ➢ Visualização das medidas (display, tela do computador, celular,
etc.) ➢ Relatório parcial (acompanhamento) – via Moodle

Etapa 2 ➢ Condicionamento do sinal do atuador ➢ Acionamento do atuador por PWM


(conversão D/A) ➢ Análise dos dados do Sensor ➢ Relatório parcial
(acompanhamento) -via Moodle

Etapa 3 ➢ Identificação da dinâmica do Sistema (Planta) ➢ Análise da resposta


temporal do conjunto sensor/atuador ➢ Obtenção do modelo matemático do conjunto
sensor/atuador ➢ Relatório parcial (acompanhamento) - via Moodle

A melhor forma de iniciar os cálculos para o condicionamento dos


sinais é partir do conversor A/D para o sensor. Nesse exemplo
abordaremos o processador ATMEGA328P-PU, microprocessador de
8 bits fabricado pela ATMEL, utilizado nos populares ARDUINOs UNO,
PRO, PRO Mini e Nano. As tensões de alimentação desses ARDUINOs
é de 5V ou 3,3V, conforme o modelo. Para o nosso exemplo
adotaremos a tensão de alimentação de 5 Vcc. A referência interna do
conversor A/D adotada para o nosso exemplo será de 5V, ou seja, a
excursão total do sinal na entrada do conversor A/D, para que se
aproveite ao máximo a sua resolução, deverá ser entre 0 e 5V. Confira
os detalhes das entradas analógicas do ARDUINO no artigo
técnico Arduino - Entradas Analógicas.
 
Observação: Note que nas especificações do conversor A/D existe
uma opção para que se utilize uma referência interna de 1,1 V do
ATMEGA328, o que para esse caso específico seria bem melhor, uma
vez que a excursão da saída do sensor se aproxima muito da faixa de
entrada do conversor A/D. Mas foi adotado Vcc (% Vcc) para que se
possa ilustrar melhor uma das situações bastante frequentes de
condicionamento nesse tipo de projeto.
 
Observe na Figura 5 a arquitetura interna do conversor A/D do
processador ATMEGA328P.
 
Figura 5 -
Esquema do conversor A/D do ATMEGA328P
 
Na Figura 5 pode-se observar que existem 8 canais de entradas
analógicas multiplexadas na entrada do conversor A/D. Nos projetos
do ARDUINO são utilizadas apenas 6 (destaque do ARDUINO UNO
na Figura 6).
 

Figura 6 -
Esquema elétrico do ARDUINO UNO com as entradas analógicas em destaque
 
Na Figura 7 pode-se observar um resumo das principais
especificações do conversor A/D do ATMEGA328. Note que o
conversor tem 10 bits de resolução, uma precisão de 8 bits e taxa
máxima de amostragem de 76,9 kSPS (kiloAmostras por segundo - 8
bits).
 

Figura 7 - Resumo


das especificações do conversor A/D do ATMEGA328P
 
Os 10 bits de resolução definem que a faixa de entrada de 5 Vcc pode
ser dividida em 1024 degraus discretos de medição (quantização), ou
seja, 5 V/1024 ≅ 0,0049 V (4,9 mV), porém a precisão do conversor
A/D está nos 8 bits, se não forem calculadas médias. Isso implica que
a unidade discreta de medição é de 5 V/256 ≅ 0,020 V (20 mV). A
esses valores calculados se dá o nome de sensibilidade. Qualquer
sinal que seja uma fração desse valor não pode ser medido pelo
conversor.
 
Se avançarmos um pouco mais nas especificações do conversor A/D
do ATMEGA328, encontramos que as operações de amostragem e
S/H foram otimizadas para impedâncias de saída do circuito, que for
conectado ao pino do conversor A/D, de 10 kΩ ou menos. Circuitos
com baixa impedância de saída só deverão ser utilizados para sinais
que variam lentamente. Outra informação muito importante é a ênfase
que o manual dá para a necessidade de se utilizar um filtro analógico
de anti-alising. Veja o destaque na Figura 8.
 
Figura 8 -
Descrição do circuito de entrada do conversor A/D do ATMEGA328P
 
Colocados todos esses dados, podemos iniciar os cálculos para o
acoplamento do sensor ao conversor A/D. A excursão total do sensor
para as nossas especificações é de 600 mV - 100 mV = 500 mV. Ou
seja, a saída do sensor terá 100 mV de offset, mais uma excursão total
de 500 mV. Observando a Figura 2, pode-se concluir que é necessário
subtrair 100 mV da saída do sensor e amplificar a saída em 10 vezes
para se obter uma excursão útil de 5 V na saída do conjunto e otimizar
a conversão A/D.

As 16 entradas analógicas do Arduino Mega 2560 têm resolução de 10bits. Por


padrão, o fundo de escala da entrada analógica é 5Vcc, medidos com
referência ao terra (0Vcc) da placa. O conversor ADC (Analog Digital
Converter) do microcontrolador ATmega2560, através de comparações e
aproximações, providencia em registros específicos os valores
correspondentes as tensões aplicadas em cada entrada analógica, conforme
Equação 1 [4]. ADC= V I N .1024 V REF (1) Onde V I N é a tensão aplicada na
entrada analógica em questão e V REF a tensão de referência selecionada –
neste caso, 5Vcc.

You might also like