Beruflich Dokumente
Kultur Dokumente
Pokok Bahasan :
Disusun Oleh :
#include <PinChangeInt.h>
#include <PinChangeIntConfig.h>
#define PIN1 4
#define PIN2 6
int encoder1PhaseA = 4;
int encoder1PhaseB = 5;
int encoder1Position = 0;
int encoder2PhaseA = 6;
int encoder2PhaseB = 7;
int encoder2Position = 0;
int n.m = LOW;
void setup() {
pinMode (encoder1PhaseA,INPUT);
pinMode (encoder1PhaseB,INPUT);
pinMode (encoder2PhaseA,INPUT);
pinMode (encoder2PhaseB,INPUT);
PCintPort::attachInterrupt(PIN1, readEncoder1,RISING);
PCintPort::attachInterrupt(PIN2, readEncoder2,RISING);
Serial.begin(9600);
}
void loop() {
Serial.print ("Enc1=");
Serial.print (encoder1Position);
Serial.print ("\t");
Serial.print ("Enc2=");
Serial.print (encoder2Position);
Serial.print ("\t");
}
void readEncoder1 ()
{
n = digitalRead(encoder1PhaseA);
if (n == HIGH) {
if (digitalRead(encoder1PhaseB) == LOW){
encoder1Position--;
} else {
encoder1Position++;
}
}
}
void readEncoder2 ()
{
m = digitalRead(encoder2PhaseA);
if (m == HIGH) {
if (digitalRead(encoder2PhaseB) == LOW){
encoder2Position--;
} else {
encoder2Position++;
}
}
}
Tabel 2.1 Hasil pembacaan nilai rotary encoder
#define PIN1 4
#define PIN2 6
int encoder1PhaseA = 4;
int encoder1PhaseB = 5;
int encoder1Position = 0;
int encoder2PhaseA = 6;
int encoder2PhaseB = 7;
int encoder2Position = 0;
int n,m = LOW;
int tickPerRev=775;
int pulsel, pulse2;
void setup() {
// setup timer2 to fire every 16 ms
TCCR2B = 0x00; // Disable INT Flag Reg: Clear Timer Overflow Flag
TCNT2 = 6; // 256-((16MHz*16 ms)/1024)
TIFR2 = 0x00; //Timer2 INT Flag Reg : Clear Time overflow Flag
TIMSK2 = 0X01; //Timer2 INT Reg : Timer 2 Overflow Interrupt Enable
TCCR2A = 0x00; //Timer2 Control Reg A: Wave gen Mode normal
TCCR2B = 0x07; //Timer2 Control Reg B: Timer Prescaler set to1024
pinMode (encoder1PhaseA,INPUT);
pinMode (encoder1PhaseB,INPUT);
pinMode (encoder2PhaseA,INPUT);
pinMode (encoder2PhaseB,INPUT);
PCintPort : :attchInterrupt (PIN1, readEncoder1, RISING);
PCintPort : :attchInterrupt (PIN2, readEncoder2, RISING);
Serial.begin(19200);
}
void loop() {
}
void readEncoder1 ()
{
n = digitalRead (encoder1PhaseA);
if (n == HIGH) {
if (digitalRead (encoder1PhaseB) == LOW) {
encoder1Position--;
pulse1--;
} else {
encoder1Position++;
Pulse1++;
}
}
}
void readEncoder2()
{
m = digitalRead (encoder2PhaseA);
if (m == HIGH) {
if (digitalRead (encoder2PhaseB) == LOW) {
encoder2Position--;
pulse2--;
} else {
encoder2Position++;
pulse2++;
}
}
}
ISR (TIMER2_OVF_vect) //interrupt service routine
{
TCNT2 = 6; //Reset Timer to 6
rps1 = (pulse1* (1 / 0.016)) /tickPerRev;
rps2 = -(pulse2* (1 / o.016)) /tickPerRev;
rpm1 = 60*rps1;
rpm2 = 60*rps2;
Piringan digerakan oleh putaran eksternal, baik berupa putaran roda ataupun
putaran shaft dari motor yang diCoupling. Putaran secara kontinius menghasilkan
pembacaan Pulsa, jarak antara pulsa high ke pulsa high lainnya melambangkan kecepatan
putaran dari motor. Semakin rapat pulsa yang terbaca maka semakin cepat putaran motor
tersebut.
Data keluaran encoder dapat digunakan untuk mebaca kecepatan motor, hal ini bisa
dilakukan apabila kita mengetahui nilai maksimal pembacaan encoder dalam satu putaran
penuh. Acuan kecepatan encoder dapat berupa detik maupun menit. Berikut persamaan
dari RPS dan RPM :
(pulse1* (1 / 0.016))/tickPerRev;
Dimana :
Pulse = pembacaan encoder
0.016 = konstanta internal timer(16 MHz)
tickPerRev= maksimal pembacaan encoder dalam satu putaran penuh