|
|
|
![]() |
|
|||||||
|
||||||||
![]() |
|
|
Thread Tools | Rate Thread | Display Modes |
|
|
|
#1
|
|||
|
|||
|
gyro problem
I have the gyro on the analog input 01. i am using kevin's code with the gyro and adc enabled. i am getting a reading in the printf for both the rate and the angle. coding it is the trouble.
i am using mecanum programming i found from alan. it works very well on its own. Code:
/*******************
function: deadband()
inputs: inp, input value
center, value of input that represents neutral
band, size of deadband to consider neutral
output: scaled and deadband-compensated output value
inputs below center will yield negative output
inputs above center will yield positive output
inputs within deadband either side of center will yield 0
usage: typically call with joystick value (0-254) as input,
joystick neutral (127) as center, and a small number (5)
as the size of the deadband. The white POS joysticks
should probably have a much larger band (10) instead.
*******************/
int deadband(int inp, int center, int band)
{
int oup;
if (inp < center-band)
oup = inp - center + band;
if (center-band <= inp && inp <= center+band)
oup = 0;
if (center+band < inp)
oup = inp - center - band;
return oup;
}
/*********************
function: pwm_limit()
inputs: inp, input value
output: scaled and range-limited output value
usage: call with signed value (+/- 127) as input,
will return a valid pwm value
*********************/
unsigned char pwm_limit (signed int inp)
{
if(inp<-127)
inp = -127;
if (inp>127)
inp = 127;
inp = inp+127;
return (char)inp;
}
void Teleop(void)
{
l_y = deadband(p1_y,127,10);
r_y = deadband(p2_y,127,10);
l_x = deadband(p1_x,127,10);
r_x = deadband(p2_x,127,10);
l_y = l_y/2;
r_y = r_y/2;
l_x = l_x/2;
r_x = r_x/2;
speed = l_y+r_y;
turn = l_y-r_y;
slide = -l_x-r_x;
/*
if(temp_gyro_angle <= -75) //gyro
{
turn = turn+15;
}
if(temp_gyro_angle >= 75)
{
turn = turn-15;
}
*/
front_r = speed-turn+slide;
front_l = speed+turn-slide;
back_r = speed-turn-slide;
back_l = speed+turn+slide;
pwm01 = pwm_limit(front_r);
pwm02 = 255 - pwm_limit(front_l);
pwm03 = pwm_limit(back_r);
pwm04 = 255 - pwm_limit(back_l);
}
suggestions? |
|
#2
|
|||||
|
|||||
|
Re: gyro problem
Print out the pwm values to see if they correspond to what you are seeing or not. If so, your code is causing the pwm values to do weird things; if the pwm values are steady but the motors are doing weird things, that might point to a wiring problem.
Put printf's inside your conditionals (if(temp_gyro_angle <= -75)...) to see what is going on. You are increasing/decreasing 'turn' based on gyro. What type is turn? char? int? Is it static? If turn is a static char and you are increasing it by 15 38 times per second, it will overflow more than 2 times each second (15*38/256). |
|
#3
|
||||
|
||||
|
Re: gyro problem
This may be a shot in the dark .... but try plugging the gyro into analog input 02. This fixed a problem we experienced with the gyro.
|
|
#4
|
|||
|
|||
|
Re: gyro problem
thanks for the help. i wont really be able to check it until thursday at competition, so i want to make sure this is right.
turn is declared as a signed int. will this have the same affect? how would i go about fixing that? this gyro is completly new to me. |
|
#5
|
||||
|
||||
|
Re: gyro problem
try using a feedback loop...a simple one would look like:
turn = turn - temp_gyro_angle / 15; or something like that. this will get you (theoretically) a robot that always points forward. you may want to make the ratio that you multiply temp_gyro_angle by higher or lower depending on how fast/slow you want it to correct. also, gnormhurst, he couldn't be overflowing because turn is set every step... |
|
#6
|
|||
|
|||
|
Re: gyro problem
you mean divide by? and yes i get what you mean. but again, i won't be able to test until competition.
|
|
#7
|
||||
|
||||
|
Re: gyro problem
well you are multiplying by 1/15, so i mean multiply.
|
|
#8
|
||||
|
||||
|
Re: gyro problem
I think that you should use Get_Gyro_Angle() to get data from the gyro. That is how we used it. Also We had a similar problem with our field centric omni drive. It was caused by a division by 0. Good Luck from 1647
|
|
#9
|
|||
|
|||
|
Re: gyro problem
Code:
signed int speed, turn, slide;
signed int front_r, front_l, back_r, back_l;
long int l_y, r_y, l_x, r_x;
static unsigned int i = 0;
static unsigned int j = 0;
int temp_gyro_rate;
long temp_gyro_angle;
int temp_gyro_bias;
long temp_gyro_angle_fast;
long Encoder_Count;
i++;
j++; // this will rollover every ~1000 seconds
// enable this block of code to test your gyro
if(j == 10)
{
printf("\r\nCalculating Gyro Bias...\r\n");
}
if(j == 38) // let the gyro stablize for a second before starting a calibration
{
// start a gyro bias calculation
Start_Gyro_Bias_Calc();
}
if(j == 191) // allow calibration routine to run for four seconds
{
// terminate the gyro bias calculation
Stop_Gyro_Bias_Calc();
// reset the gyro heading angle
Reset_Gyro_Angle();
temp_gyro_bias = Get_Gyro_Bias();
printf("Gyro Bias=%d\r\n", temp_gyro_bias);
}
if(i == 35 && j >= 191)
{
temp_gyro_rate = Get_Gyro_Rate();
temp_gyro_angle = Get_Gyro_Angle();
printf("Gyro Rate=%d\r\n", temp_gyro_rate);
printf("Gyro Angle=%d\r\n\r\n", (int)temp_gyro_angle);
|
|
#10
|
|||||
|
|||||
|
Re: gyro problem
Quote:
Code:
// reset the loop counter
if(i >= 38)
{
i = 0;
}
|
![]() |
| Thread Tools | |
| Display Modes | Rate This Thread |
|
|
Similar Threads
|
||||
| Thread | Thread Starter | Forum | Replies | Last Post |
| Problem with gyro... | capenga | Programming | 21 | 16-02-2006 19:25 |
| Gyro not accurate - Problem | naor52 | Programming | 15 | 27-01-2006 16:50 |
| Gyro code problem | AMIRAM | Programming | 10 | 23-01-2006 04:26 |
| Gyro | magical hands | Programming | 2 | 14-01-2005 20:57 |