Pages: [1]   Go Down
Author Topic: Interrupt bug / storing  (Read 648 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 1
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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++;
  
  }
}

Logged

Belgium
Offline Offline
Full Member
***
Karma: 6
Posts: 135
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Al zouden je microswitches contact dender hebben , zou dat je probleem kunnen veroorzaken ?.
Logged

Gear: Arduino- Uno,Due,Ethernet,  OLS, Buspirate, J-Link, TDS1002, Rigol DG1022

Pages: [1]   Go Up
Jump to: