Chief Delphi

Chief Delphi (http://www.chiefdelphi.com/forums/index.php)
-   Programming (http://www.chiefdelphi.com/forums/forumdisplay.php?f=51)
-   -   Encoders not changing... (http://www.chiefdelphi.com/forums/showthread.php?t=53391)

Alan Anderson 05-02-2007 23:30

Re: Encoders not changing...
 
Quote:

Originally Posted by paulcd2000 (Post 572683)
...ours runs at 128 clicks per revolution, and some are concerned that that's too fast for the RC to detect

How many revolutions per second?

We've chosen 256 counts per revolution of the drive wheel. Moving at high speed will give a couple thousand interrupts per second. Our 2005 robot didn't seem to have a problem keeping up with that kind of rate.

radicalnerd 06-02-2007 01:21

Re: Encoders not changing...
 
There might be a problem with storing a long to an int without typecasting... Kevin's Get_Encoder_n_Count() functions return a long. If you want to store them as ints you should typecast them:
Code:

LeftWheelCount = (int)Get_Encoder_1_Count();
RightWheelCount = (int)Get_Encoder_2_Count();

Otherwise you might get only the most significant bits of the long, which make the int variables 0. In other words, it's counting, but you're not printing them correctly. We had a similar problem with printf displaying longs without typecasting:

Code:

printf("Left encoder count = %d", Get_Encoder_1_Count() );      //incorrect
printf("Left encoder count = %d", (int)Get_Encoder_1_Count() ); //correct

I believe the first one tripped us up because it only printed the highest 16 bits of the long, making it appear like it's not counting.

This might be something you already know, in which case I'm sorry I can't help. But if you have a problem with encoders generating too many counts, BaneBots has an encoder divider board that we're using this year. They have jumpers to select divide by factor: 1, 4, 8, or 16. We have one 128/revolution encoder coupled 2:1 to each CIM motor shaft (that's ~5000 counts/sec at no load speed), divided by 4 so we don't overwhelm the processor with counts.

Jared Russell 06-02-2007 13:35

Re: Encoders not changing...
 
You can also try leaving things as longs and printing using "%ld" instead of "%d"

paulcd2000 06-02-2007 18:38

Re: Encoders not changing...
 
i'm not sure which motors we're using but i think they're the chalupas. i'll try typecasting the method's returns as ints. I use ints because i get paranoid about the amount of space the robot really has...:)

Thanks to everyone for all of their help! It hasn't yet been fixed, but i have great confidence it will be, thanks to this huge outpouring of help!

Uberbots 07-02-2007 00:19

Re: Encoders not changing...
 
Dont be paranoid... unless you are doing some crazy coding then you should be fine.

either way, the proper replacement macro in printf for a long is %li

Jared Russell 07-02-2007 00:22

Re: Encoders not changing...
 
%ld works just fine too ;)

http://www.cplusplus.com/reference/c...io/printf.html

Astronouth7303 07-02-2007 16:57

Re: Encoders not changing...
 
Are you sure the RC is reading the sensors correctly?

What I did to test our GTS's last year was put the last 4 PWMs in User_CCP mode (digital outputs should work equally well) and have the interrupt handler toggle that. I then hooked an oscilloscope to both the GTS and the CCP pin. The wave forms matched nearly perfectly.

In terms of software, the GTS and encoders should be very similar, ignoring direction. Even just putting an LED on the output pin and watching its apparent brightness should be helpful. (You probably won't see flickering, as it goes too fast.)

If that works, you may need to post your code so that we can look at it.

paulcd2000 08-02-2007 17:10

Re: Encoders not changing...
 
i've got one last test to determine if the problem is programming or electrical/mechanical at the root. In interrupt handler low:
Code:

        else if (INTCON3bits.INT2IF && INTCON3bits.INT2IE) // encoder 1 interrupt?
        {
                INTCON3bits.INT2IF = 0; // clear the interrupt flag
                #ifdef ENABLE_ENCODER_1
        -->    puts("1");
                Encoder_1_Int_Handler(); // call the left encoder interrupt handler (in encoder.c)
                #endif
        }
        else if (INTCON3bits.INT3IF && INTCON3bits.INT3IE) // encoder 2 interrupt?
        {
                INTCON3bits.INT3IF = 0; // clear the interrupt flag
                #ifdef ENABLE_ENCODER_2
        -->    puts("2");
                Encoder_2_Int_Handler(); // call right encoder interrupt handler (in encoder.c)
                #endif
        }

The "puts" will output to my screen every time the interupt is called. if it never gets called, then the problem in electrical/mechanical in origin. Does anyone see a problem with my logic? (I'll test it friday at 3:00)

paulcd2000 10-02-2007 12:52

Re: Encoders not changing...
 
I finally fixed it!!!! yES!! But i have no idea why it didn't work. Oh well... Thank you, everyone, for your help!

JHale 15-02-2007 18:50

Re: Encoders not changing...
 
Quote:

Originally Posted by paulcd2000 (Post 575446)
I finally fixed it!!!! yES!! But i have no idea why it didn't work. Oh well... Thank you, everyone, for your help!

Any chance in sharing what you did (I know the post is late). We are having problems with the code as well, and have ruled out the possibility of a problem with the encoders with an oscilloscope.

paulcd2000 15-02-2007 21:47

Re: Encoders not changing...
 
Sure. Well i got sick of trying stuff, so i tested the encoders stuff from kevin's stuff. It worked! So i did every step from the installation, and all of a sudden it worked. The testing steps we took were to check to see if the voltage was changing when the motors turn. If it does, check to see if the interrupt fires. If it does, check the interrupt handling routine. If that checks out, then either it's the print statements or i'm stumped :D

paulcd2000 17-02-2007 21:29

Re: Encoders not changing...
 
NEW PROBLEM: i now have one good encoder. The other one doesn't count. I've looked at the code, and everything is executed the same as the one that does work. Have yet to test the electrical portion, but my guess is that this is a brand new problem. Anyone have this or know how to fix it?

benhulett 18-02-2007 00:09

Re: Encoders not changing...
 
When you say it doesn't work, do you mean it get's stuck on a certain value? Or does it just stay at 0 while you turn it...

In Kevin's encoder_readme.txt, Step 4 states the following:

4) Disable encoders not needed for your design by following
the instructions in encoder.h. By default, all six encoders
are enabled.

Did you disable the rest of the encoders? Make sure you have the two your using enabled.

Are you using correct Digital I/O ports? (2 and 12 I think for the second encoder)

Other than that, I'm not sure why both won't work.....we had 2 working at one point by just following the readme.

paulcd2000 18-02-2007 08:34

Re: Encoders not changing...
 
yeah, i have disabled 4-6, but 2 is still active. Today when i get in, i'll check whether they're all plugged in right, and whether they even return a signal. I suspect they do, but i can't be sure.


All times are GMT -5. The time now is 23:53.

Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Copyright © Chief Delphi