0% acharam este documento útil (0 voto)
71 visualizações4 páginas

Teste de Um Encoder Heidenhain de 1024 Pulsos Com Arduino

Este documento descreve como conectar e ler um encoder Heidenhain de 1024 pulsos usando um Arduino Mega devido ao número de pinos de interrupção necessários. O código configura as interrupções digitais para contar os pulsos do encoder e exibir o valor no LCD.

Enviado por

Anderson Maiello
Direitos autorais
© © All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato DOCX, PDF, TXT ou leia on-line no Scribd
0% acharam este documento útil (0 voto)
71 visualizações4 páginas

Teste de Um Encoder Heidenhain de 1024 Pulsos Com Arduino

Este documento descreve como conectar e ler um encoder Heidenhain de 1024 pulsos usando um Arduino Mega devido ao número de pinos de interrupção necessários. O código configura as interrupções digitais para contar os pulsos do encoder e exibir o valor no LCD.

Enviado por

Anderson Maiello
Direitos autorais
© © All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato DOCX, PDF, TXT ou leia on-line no Scribd
Você está na página 1/ 4

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

Você também pode gostar