Go Down

Topic: RESOLVED Arduino Due : input to use attach interrupt not work (Read 291 times) previous topic - next topic

bvking

Hi,
I 'm trying to use a program with 2 attachinterrupt  witch work with a Uno.

But it doesn't work at all with the Arduino Due.
I have tried attachinterrupt  with input 2,3. and 52, 53.

It's to set speed with a PID algorithm as below

Code: [Select]

//The sample code for driving one way motor encoder
#include <PID_v1.h>
const byte encoder0pinA = 52;//A pin -> the interrupt pin 0
const byte encoder0pinB = 53;//B pin -> the digital pin 3

int E_left =11; //The enabling of L298PDC motor driver board connection to the digital interface port 5
int M_left =12; //The motor of L298PDC motor driver board connection to the digital interface port 4
int M_right = 13;

byte encoder0PinALast;
double duration,abs_duration;//the number of the pulses
boolean Direction;//the rotation direction
boolean result;

double val_output;//Power supplied to the motor PWM value.
double Setpoint;
double Kp=0.6, Ki=5, Kd=0; 
PID myPID(&abs_duration, &val_output, &Setpoint, Kp, Ki, Kd, DIRECT);
 
void setup()

  Serial.begin(9600);//Initialize the serial port
   pinMode(M_left, OUTPUT);   //L298P Control port settings DC motor driver board for the output mode
   pinMode(M_right, OUTPUT);
   pinMode(E_left, OUTPUT);
   Setpoint =80;  //Set the output value of the PID
   myPID.SetMode(AUTOMATIC);//PID is set to automatic mode
   myPID.SetSampleTime(5);//Set PID sampling frequency is 100ms
  EncoderInit();//Initialize the module
}
 
void loop()
{   
      advance();//Motor Forward
      abs_duration=abs(duration);
      result=myPID.Compute();//PID conversion is complete and returns 1
      if(result)
      {
        Serial.print("Pulse: ");Serial.println(duration);
        Serial.print("Pulse: ");Serial.println(duration);
       
        duration = 0; //Count clear, wait for the next count
        Serial.print("val_output"); Serial.println(val_output);// TENSION in MOTOR TO REGULATE SPEED with SETPOINT
        Serial.print("Setpoint"); Serial.println(Setpoint);
        Serial.print("Direction"); Serial.println(Direction);
        Serial.print("Result"); Serial.println(result);
      }
       

}
 
void EncoderInit()
{
  Direction = true;//default -> Forward 
  pinMode(encoder0pinB,INPUT); 
  attachInterrupt(0, wheelSpeed, CHANGE);
}
 
void wheelSpeed()
{
  int Lstate = digitalRead(encoder0pinA);
  if((encoder0PinALast == LOW) && Lstate==HIGH)
  {
    int val = digitalRead(encoder0pinB);
    if(val == LOW && Direction)
    {
      Direction = false; //Reverse
    }
    else if(val == HIGH && !Direction)
    {
      Direction = true;  //Forward
    }
  }
  encoder0PinALast = Lstate;
 
  if(!Direction)  duration++;
  else  duration--;

}
void advance()//Motor Forward
{
     digitalWrite(M_left,LOW);
      digitalWrite(M_right,HIGH);
     
     analogWrite(E_left,val_output);
}
void back()//Motor reverse
{
     digitalWrite(M_left,HIGH);
     digitalWrite(M_right,LOW);
     analogWrite(E_left,val_output);
}

void Stop()//Motor stops
{
     digitalWrite(E_left, LOW);
}


Thanks

ard_newbie

There is an issue there:

Code: [Select]

pinMode(encoder0pinB,INPUT); 
  attachInterrupt(0, wheelSpeed, CHANGE);

bvking

Hi M. Are_newbie,

It is.  attachInterrupt(53, wheelSpeed, CHANGE);

Great now. Thanks a lot

Go Up