Go Down

Topic: Magnetic Encoder auslesen (Read 216 times) previous topic - next topic

bluebravo

Jan 02, 2015, 04:48 pm Last Edit: Jan 02, 2015, 04:53 pm by bluebravo
Hallo alle zusammen.
Ich habe hier ein Problem. Ich habe einen DC Motor wo hinten dran ein Magnetic Encoder drauf ist.
Jetzt hatte ich versucht ihn mit dem Code auszulesen.
Der Motor hat 6 Adern, wovon eine gelb (1) ist und der rest ist weiss.
Die gelbe und die daneben (2) ist plus und minus vom motor.
Denke also das die andren 4 adern vom Encoder sind.

Code: [Select]

/*
Pay attention to the interrupt pin,please check which microcontroller you use.
http://arduino.cc/en/Reference/AttachInterrupt
*/
 
//The sample code for driving one way motor encoder
const byte encoder0pinA = 2;//A pin -> the interrupt pin 2
const byte encoder0pinB = 4;//B pin -> the digital pin 4
byte encoder0PinALast;
int duration;//the number of the pulses
boolean Direction;//the rotation direction
   
   
void setup()

  Serial.begin(57600);//Initialize the serial port
  EncoderInit();//Initialize the module
}
   
void loop()
{
  Serial.print("Pulse:");
  Serial.println(duration);
  duration = 0;
  delay(100);
}
   
void EncoderInit()
{
  Direction = true;//default -> Forward 
  pinMode(encoder0pinB,INPUT); 
  attachInterrupt(0, wheelSpeed, CHANGE);//int.0
}
   
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--;
}

Da wird mir aber immernur 0 angezeigt.
Kann ich den dafür eigentlich verwenden?
Braucht ihr bilder von dem Encoder?

beste grüße Matze

Serenifly

Der Typ des Encoders wäre nett.


Der Code wird generell falsch sein, aber Interrupts sind für so was gar nicht nicht gut. Das kann man locker mit Pollen machen.

Am besten geht es über einen Timer-Interrupt. Dieser Code ist für den Fall dass das ein ganz normaler Drehencoder ist mit zwei phasenverschobenen Signalen:
http://www.meinduino.de/arduino-grundlagen/2014/09/20/drehencoder1.html
http://www.meinduino.de/arduino-grundlagen/2014/09/21/drehencoder2.html

Teil 1 beschreibt die Theorie und hat einen einfachen Code wo in loop() abgefragt wird. In Teil 2 ist dann der bessere Code.

sschultewolter

http://www.mikrocontroller.net/articles/Drehgeber

Hat sich bei mir gut bewährt. Muss aber an den Arduino Aufbau angepasst werden
Arduino Yun und Due abzugeben, bei Interesse PN.

uwefed

Der Encoder hat wahrscheinlich eine Spannungsversorgung und 2 Ausgänge.

grüße Uwe

bluebravo

#4
Jan 02, 2015, 08:39 pm Last Edit: Jan 02, 2015, 08:53 pm by bluebravo
Hallo, danke erstmal für die Antworten.
Genau Uwe, 2 der 6 sind die Spannungsversorgung für den Encoder und die letzten beiden sind die 2 Ausgänge.
Wie der encoder heißt, weiß ich nicht.
Ist von einem Philips FC9910 Saugroboter der Antrieb.

1+2 sind die Spannung für den Motor.
3+4 ist so wie ich das sagen würde, die Spannung für den Encoder.
5+6 sollten demnach die Ausgänge vom Encoder sein.

Ungefähr so sieht er aus

uwefed

Quote
Ungefähr so sieht er aus
Was heißt das? So oder nicht so?
DIe Platine hat eine Elektrolytkondensator vorgesehen. Darum ist die Polarität der Versorgungsspannung leicht zu erkennen.

bluebravo

Sorry,
genauso sieht er aus.

Go Up