|
|
View previous topic :: View next topic |
Author |
Message |
ze.vana
Joined: 11 Jun 2011 Posts: 15
|
Rotary Encoder |
Posted: Sun Jun 12, 2011 4:08 am |
|
|
Hello
It is my first time participating at forum.
I'm Jose from Brazil and I'd like to share discoveries and doubts too with all you.
Well I have been reading some posts about Rotary Encoders, I've been interested in it. So it's a long
time ago that I've been trying to develop an sin/cos and TTL Encoder Tester that works
fast and does not lose pulses. Then I got to implement this. Sure for not to get it more complicated
I added an external hardware (just a dual flip-flop D and four Nand gates) to detecting direction
A and B encoder pulses. It really works very well, Encoder can be rotated in high speed and it maintain
the zero point value. But it still needs some improvement. Looking at the code comments you can see
some difficulties that I have (like showing value on a LCD). Although I've been working for years on CNC/PLC
programming, I am beginner in CCS programming. If someone has an idea of improvement the code I would appreciate it.
Code: |
#include <18F452.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
#include <lcd.c>
int16 T0,T1;
float R; //R is the result of Timer1 - Timer0
//I had to put a FLOAT instead INT16
void print_lcd(){ //because of LCD did not work well with INT16,
lcd_init(); //I don't know why!
lcd_gotoxy(1,1);
printf(lcd_putc,"\f%g" R);
delay_ms(200);
}
void print_serial() {
t1=GET_TIMER1(); //get counter UP value
t0=GET_TIMER0(); //get counter DOWN value
R=T1-T0; //R is the actual encoder value
printf("\f R:%g T1:%Lu T0:%Lu ",R,T1,t0 );
delay_ms(200);
if(t0 > t1){ //prevent to not anti-clockwise first
SET_TIMER0(0);
SET_TIMER1(0);
}
}
#int_timer2
void timer_t2(){
static int tmp;
tmp++;
if(tmp <=5){ //it divides the timing of showing
print_lcd(); //LCD and serial
}
if(tmp>=5){
print_serial();
}
if(tmp>=10){
tmp=0;
}
}
void main(){
set_tris_a(0xff);
set_tris_b(0xff);
set_tris_c(0xff);
set_tris_d(0xff);
//TIMER0 16 bits as counter /DOWN- ext input T0CKI RA4
SETUP_TIMER_0(RTCC_EXT_H_TO_L|RTCC_DIV_1);
SET_TIMER0(0);
ENABLE_INTERRUPTS ( INT_TIMER0 );
ENABLE_INTERRUPTS ( GLOBAL );
// TIMER1 16 bits as counter /UP- ext input T1CKI RC0
SETUP_TIMER_1(T1_EXTERNAL | T1_DIV_BY_1 );
ext_int_edge(H_TO_L);
set_timer1(0);
enable_interrupts(int_timer1);
enable_interrupts(global);
//TIMER2 int
SETUP_TIMER_2(T2_DIV_BY_1,0xc0,2);
set_timer2(0);
enable_interrupts(int_timer2);
enable_interrupts(global);
while(true){
}
} |
|
|
|
Jerry I
Joined: 14 Sep 2003 Posts: 96 Location: Toronto, Ontario, Canada
|
|
Posted: Tue Jun 14, 2011 3:50 am |
|
|
Quote: |
I added an external hardware (just a dual flip-flop D and four Nand gates) to detecting direction A and B encoder pulses.
|
Do you have a schematic of how you added the external hardware.
Thanks |
|
|
ze.vana
Joined: 11 Jun 2011 Posts: 15
|
Hardware scheme |
Posted: Thu Jun 16, 2011 2:59 pm |
|
|
I don't know how to put image here maybe is not allowed, I can send it by email: [email protected].
Jose |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|