Teste de Um Encoder Heidenhain de 1024 Pulsos Com Arduino
Teste de Um Encoder Heidenhain de 1024 Pulsos Com Arduino
****************************************************************************
-- IDE do Arduino Versão 1.6.7
-- Autor: Eduardo Avelar
-- Blog: easytromlabs.com
-- email: [email protected]
-- Dezembro, 2016
****************************************************************************/
/*//////////////////////////////////////////////////////////////////////////////
Deverá ser utilizado o Arduino Mega devido ao numero de pinos de interrupção
necessária para este teste, que no caso deverá ser de 6 pinos, sendo eles;
A, /A, B, /B, Z, /Z
// Arduino Interrupt reference: //
// https://www.arduino.cc/en/Reference/AttachInterrupt //
// //
// Board Digital Pins Usable For Interrupts //
// Uno, Nano, Mini, other 328-based 2, 3 //
// Mega, Mega2560, MegaADK 2, 3, 18, 19, 20, 21 //
// Micro, Leonardo, other 32u4-based 0, 1, 2, 3, 7 //
// Zero all digital pins, except 4 //
// MKR1000 Rev.1 0, 1, 4, 5, 6, 7, 8, 9, A1, A2 //
// Due all digital pins //
// 101 all digital pins //
// //
// Board int.0 int.1 int.2 int.3 int.4 int.5 //
// Uno, Ethernet 2 3 //
// Mega2560 2 3 21 20 19 18 //
// 32u4 based (e.g Leonardo, Micro) 3 2 0 1 7 //
// Due, Zero, MKR1000, 101 interrupt number = pin number //
*****************************************************************************
Conexão com o Display:
LCD RS pin to digital pin 53
LCD Enable pin to digital pin 52
LCD D4 pin to digital pin 51
LCD D5 pin to digital pin 50
LCD D6 pin to digital pin 49
LCD D7 pin to digital pin 48
LCD R/W pin to ground
LCD VSS pin to ground
LCD VCC pin to 5V
10K resistor:
ends to +5V and ground
wiper to LCD VO pin (pin 3)
////////////////////////////////////////////////////////////////////////////*/
// include LCD library:
#include <LiquidCrystal.h>
// Inicia a biblioteca do display com os pinos de dados
LiquidCrystal lcd(53, 52, 51, 50, 49, 48);
// Variável Volatile devido ao uso em mais de uma fonte de interrupção.
// O compilado armazena na memória RAM e não em um registrador.
volatile int long counterAB = 0;
volatile int laps = 0;
uint8_t dir = 0;
void setup() {
Serial.begin(9600);
// Numero de linhas e colunas do LCD
lcd.begin(16, 2);
// AttachInterrupt0, digital Pin 2, Sinal A
// Ativa interrupção em qualquer mudança do sinal
attachInterrupt(digitalPinToInterrupt(2), ai0, CHANGE);
// AttachInterrupt1, digital pin 3, Sinal B
// Ativa interrupção em qualquer mudança do sinal
attachInterrupt(digitalPinToInterrupt(3), ai1, CHANGE);
///////////////////////////////////////////////////////////////////////////////
//AttachInterrupt2, digital Pin 21, Sinal /A
attachInterrupt(digitalPinToInterrupt(21), ai2, FALLING);
//AttachInterrupt3, digital pin 20, Sinal /B
attachInterrupt(digitalPinToInterrupt(20), ai3, FALLING);
//AttachInterrupt4, digital pin 19, Sinal Z
attachInterrupt(digitalPinToInterrupt(19), ai4, RISING);
//AttachInterrupt5, digital pin 18, Sinal /Z
attachInterrupt(digitalPinToInterrupt(18), ai5, FALLING);
// Cursor na Coluna 0, linha 1
lcd.setCursor(0, 0);
lcd.print("Pulsos: ");
// Cursor na Coluna 0, linha 2
lcd.setCursor(0, 1);
lcd.print("laps: ");
}
void loop() {
// Cursor na coluna 8, linha 1
lcd.setCursor(8, 0);
lcd.print(counterAB);
lcd.print(" ");
// Cursor na coluna 6, line 2
lcd.setCursor(6, 1);
lcd.print(laps);
lcd.print(" ");
}
// AttachInterrupt0, digital Pin 2, Sinal A - Qualquer mudança de borda (CHANGE)
void ai0() {
// Determina qual o sentido de giro do encoder para o contador de voltas
if (digitalRead(3) == LOW) {
dir = 1;
}
else {
dir = 0;
}
// Incrementa ou decrementa o contador de acordo com a condição do sinal no canal B
if (digitalRead(3) == HIGH && digitalRead(2) == LOW) {
counterAB ++;
}
else {
counterAB --;
}
if (digitalRead(3) == LOW && digitalRead(2) == HIGH) {
counterAB ++;
}
else {
counterAB --;
}
}
// AttachInterrupt1, digital Pin 3, Sinal B - Qualquer mudança de borda (CHANGE)
void ai1() {
// Determina qual o sentido de giro do encoder para o contador de voltas
if (digitalRead(2) == HIGH) {
dir = 1;
}
else {
dir = 0;
}
// Incrementa ou decrementa o contador de acordo com a condição do sinal no canal A
if (digitalRead(2) == LOW && digitalRead(3) == HIGH) {
counterAB --;
}
else {
counterAB ++;
}
if (digitalRead(2) == HIGH && digitalRead(3) == LOW) {
counterAB --;
}
else {
counterAB ++;
}
}
// AttachInterrupt2, digital Pin 21, Sinal /A
void ai2() {
// Vazio
}
// AttachInterrupt3, digital Pin 20, Sinal /B
void ai3() {
// Vazio
}
// AttachInterrupt4, digital Pin 19, Sinal Z
// Conta numero de voltas do Disco do encoder
void ai4() {
if (dir) {
laps ++;
}
else {
laps --;
}
}
// AttachInterrupt5, digital Pin 18, Sinal /Z
void ai5() {
// Vazio
}
https://www.easytromlabs.com/arduino/arduino-lab-09-leitura-de-um-encoder-industrial-
heidenhain-com-o-arduino/?share=email&print=print