Go Down

Topic: Interrupt bug / storing (Read 744 times) previous topic - next topic

marijnsp

Hallo allemaal!

Ik ben een robot aan het maken die een parcours moet volgen en blikjes op moet pakken.

Nu word er gebruik gemaakt van een encoder om de positie van de arm te bepalen (http://www.dfrobot.com/index.php?route=product/product&filter_name=rotary%20encoder&product_id=98#.UW6d17VT5hQ)
Als ik de arm naar een positie wil sturen gebeuren er rare dingen...  De encoder schiet van 0 naar bijvoorbeeld 30 in minder dan een seconden. Terwijl dit veel langer zou moeten duren.
Ik heb van alles geprobeerd maar kom er niet uit.

Dus mijn vraag was of EMI er iets mee te maken kan hebben. / Of mijn programma niet deugd. Of uiteraard iets anders.
Zou iemand mij hierbij kunnen helpen?

Bijvoorbaat dank!

Hier mijn code:



// Constanten
const int MicroSwitchVoorLinks = 22;
const int MicroSwitchVoorRechts = 23;

const int MicroSwitchMagazijnLinks = 25;
const int MicroSwitchMagazijnMidden = 26;
const int MicroSwitchMagazijnRechts = 27;

const int EncoderSpindel = 19;     //interrupt 4
const int EncoderTandheugel = 20;  //interrupt 3

const int MotorTandheugelRichting = 36;


//Variabelen

int MotorSpindelPWM = 4;
int MotorTandheugelPWM = 5;
int SpeedTandheugel = 0;


int MSML =0;
int MSMR =0;
int MSMM =0;
int TellerEncoderM =0;
int Direction = 0;
int aantalblikken = 0;
int Position = 0;


#include <avr/interrupt.h>



void setup()
{
 //Inputs microswitches
 pinMode (MicroSwitchMagazijnLinks, INPUT);
 pinMode (MicroSwitchMagazijnMidden, INPUT);
 pinMode (MicroSwitchMagazijnRechts, INPUT);

 // Input encoders
  pinMode (EncoderTandheugel, INPUT);


 //Output Motors
 pinMode (MotorTandheugelRichting, OUTPUT);
 pinMode (MotorTandheugelPWM, OUTPUT);



 Serial.begin(9600);

 // INTERRUPT

 attachInterrupt(3,test,RISING);
 
}

// programma

void loop()
{
 MSML=digitalRead(MicroSwitchMagazijnLinks);
 MSMM=digitalRead(MicroSwitchMagazijnMidden);
 MSMR=digitalRead(MicroSwitchMagazijnRechts);



 // Magazijnschakelaar midden HOOG, magazijn beweegt naar LINKS
 if (MSMM ==HIGH && aantalblikken ==0  ) {
   Position=-31;
   SpeedTandheugel=70;
   aantalblikken=1;
 }


 // Magazijnschakelaar RECHTS hoog, magazijn beweegt naar RECHTS
 if (MSMR ==HIGH && aantalblikken ==1   ) {
   Position=32;
   SpeedTandheugel=50;
   aantalblikken=2;
 }

 // Magazijnschakelaar LINKS hoog, magazijn beweegt naar MIDDEN
 if (MSML ==HIGH && aantalblikken ==2 ) {
   Position=0;
   SpeedTandheugel=50;
   aantalblikken=3;
 }

 //-------------------------------

 if (TellerEncoderM<Position){
   Direction=LOW;

 }

 if (TellerEncoderM>Position){
   Direction=HIGH;

 }

 if (TellerEncoderM==Position){
   SpeedTandheugel=0;
 }

 analogWrite(MotorTandheugelPWM, SpeedTandheugel);
 digitalWrite(MotorTandheugelRichting , Direction);




 Serial.println (TellerEncoderM);


}


// interrupt
void test ()
{
 if (Direction == HIGH){
   TellerEncoderM--;
 
 }

 if (Direction ==LOW){
   TellerEncoderM++;
 
 }
}


astrofrostbyte

Al zouden je microswitches contact dender hebben , zou dat je probleem kunnen veroorzaken ?.
Gear: Arduino- Uno,Due,Ethernet,  OLS, Buspirate, J-Link, TDS1002, Rigol DG1022

Go Up