Go Down

Topic: How to sync motor speed??? (Read 6126 times) previous topic - next topic

SuperMiguel

#15
Apr 11, 2012, 05:27 am Last Edit: Apr 11, 2012, 05:50 am by SuperMiguel Reason: 1

Does it look like this?:
http://www.ebay.com/itm/FAULHABER-DC-12V-Motor-2342L012CR-Gear-64-1-Encoder-12CPR-free-ship-/130585677299

The 12CPR likely indicates it's using a pair of hall sensors and a multipole disk magnet for the encoder.
Which would be 64:1 x 12 CPR = 768 CPR at the shaft. With the gear head that is a pretty good count.

Edit: Just saw the back of the motor, it's slotted disk and opto, not multipole magnetic and hall...


Ya mine is a round pcb on the back not a rectangle one..




SuperMiguel

few code modification:
Code: [Select]

int E1 = 5;     //Right Motor Power
int E2 = 6;     //Left Motor Power
int M1 = 4;    //Right Motor Direction
int M2 = 7;    //Left Motor Direction
const byte encoder0pinA = 2; //Interrupt 0
const byte encoder0pinB = 12;
const byte encoder1pinA = 3; //Interrupt 1
const byte encoder1pinB = 13;
byte overflow;
byte encoder0PinALast;
byte encoder1PinALast;
int duration0;//Encoder0 number of pulses
int duration00;
int duration1;//Encoder1 number of pulses
int duration11;
boolean Direction0;
boolean Direction1;

int SetPoint = 0; // 0 would be straight ahead
double Kp = 25; // needs tunning
int error = 0;
int speed = 100; // set the speed of which the vechicle should move
int output = 0;

void setup()

  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  Serial.begin(9600);//Initialize the serial port
  EncoderInit();//Initialize the module
  timer_init();
 
}

void loop()
{
//  Serial.print("Left Pulse:");
//  Serial.println(duration00);
//  Serial.print("Right Pulse:");
//  Serial.println(duration11);

  digitalWrite(M1,LOW); //Forward
  digitalWrite(M2,LOW);
  delay(1500);

  digitalWrite(M1,HIGH); //Backwards
  digitalWrite(M2,HIGH);
  delay(1500);

  speed = 0; //STOP!!!!!!
  Kp = 0;
  delay(4000);
  speed = 100;
  Kp = 25;
}
ISR(TIMER1_OVF_vect)
{
  overflow++;
  if(overflow>=10)
  {
  Preg(duration0, duration1);
  duration00=duration0;
  duration0=0;
  duration11=duration1;
  duration1=0;
  overflow=0;
  }
}
void Preg(int SpeedL, int SpeedR)
{
  noInterrupts(); // Disable interrupts, no need to slow down the P regulator
  error = ((SpeedL-SpeedR)-SetPoint);
  output = (Kp*error);
  if(error >= 0) // its turning left of the setpoint, reduce E1 (right motor)
  {
    analogWrite(E2, speed);
    analogWrite(E1, (speed-output)); // Subtract the error value multiplied by Kp from E1
  }
  if(error < 0) // turning right of our setpoint, reduce E0
  {
    analogWrite(E2, (speed+output)); // This time we add the error since its negative
    analogWrite(E1, speed);
  }
  interrupts(); //Enable interrupts again
}

void timer_init(void)
{
  TIMSK1 |= (1<<TOIE1); // Enable Timer1 overflow interrupt at 16MHz = 16 000 000 / 2^16 = 244Hz
}
void EncoderInit()
{
  Direction0 = true;
  Direction1 = true; 
  pinMode(encoder0pinB,INPUT);
  attachInterrupt(0, wheelSpeed0, CHANGE);
  pinMode(encoder1pinB,INPUT); 
  attachInterrupt(1, wheelSpeed1, CHANGE);
}


void wheelSpeed0()
{
  //Encoder 0 Code
  int Lstate = digitalRead(encoder0pinA);
  if((encoder0PinALast == LOW) && Lstate==HIGH)
  {
    int val0 = digitalRead(encoder0pinB);
    if(val0 == LOW && Direction0)
    {
      Direction0 = false; //Reverse
    }
    else if(val0 == HIGH && !Direction0)
    {
      Direction0 = true;  //Forward
    }
  }
  encoder0PinALast = Lstate;

  if(!Direction0)  duration0++;
  else  duration0++;
}

void wheelSpeed1()
{
  //Encoder 1 Code
  int Lstate1 = digitalRead(encoder1pinA);
  if((encoder1PinALast == LOW) && Lstate1==HIGH)
  {
    int val1 = digitalRead(encoder1pinB);
    if(val1 == LOW && Direction1)
    {
      Direction1 = false; //Reverse
    }
    else if(val1 == HIGH && !Direction1)
    {
      Direction1 = true;  //Forward
    }
  }
  encoder1PinALast = Lstate1;

  if(!Direction1)  duration1++;
  else  duration1++;
}


SuperMiguel

Is there a better implementation of this????

PeterH


Is there a better implementation of this????


Is this just a general 'please make my code better' or is there some specific problem you want help with?
I only provide help via the forum - please do not contact me for private consultancy.

SuperMiguel



Is there a better implementation of this????


Is this just a general 'please make my code better' or is there some specific problem you want help with?


Ya is there a lib to help me find kp?? And is my pid implementation correct?? Should I try using the pid lib?? Any benefits??

krazatchu

Here's a more conventional example:
http://letsmakerobots.com/node/865
Michael
----------------------
http://www.krazatchu.ca

rocketgeek

I hadn't seen the LetsMakeRobots article before, but it looks really good. I would try to use a tested library (like the one I linked to earlier), because it will get you to your goal faster.

SuperMiguel


I hadn't seen the LetsMakeRobots article before, but it looks really good. I would try to use a tested library (like the one I linked to earlier), because it will get you to your goal faster.



Cant figure out how to use that library.. Can you give me an example on how i would use it? the examples on that article are no that clear to my problem

I have a FaulHaber motor 2342L. but I don't have encoder datasheet. Could you let me know the diagram of Encoder pins (Vcc, GND, channel A/B, motor+, motor-)?
Thank you so much.

How fast does your robot need to go? If it's slow you could consider using stepper motors, which are extremely easy to synchronize perfectly.

Robin2


I have a FaulHaber motor 2342L. but I don't have encoder datasheet. Could you let me know the diagram of Encoder pins (Vcc, GND, channel A/B, motor+, motor-)?
Thank you so much.


You have added your question to a very old thread. I think you will find it more useful to start a new thread with a title relevant to your own question.

...R

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy