Re: Timer / Counter

Hallo, Leute
Habe vor, die Drehzahl eines Motors zu steuern. Ich will Anzahl der Impulse pro Sekunde zählen und zwar beispielsweise alle paar Sekunden. Eine Gabellichtschranke soll die Impulse liefern.

int lichtschranke = 2;    // Lichtschranke 
unsigned long currentTime;
unsigned long loopTime;
int cycles;
void setup()
{
  Serial.begin(9600);
  pinMode(lichtschranke, INPUT);      // lICHTSCHRANKE ALS iNPUT 
  currentTime = millis();       // Zeit, seit dem Start des Programms wird ausgelesen
  loopTime = currentTime; 
  cycles += digitalRead(lichtschranke);
}
 void loop()
{
  currentTime = millis();             // 
  if(currentTime >= (loopTime + 1000)){  //Vergleich vom Timer mit der Variable loopTime + 1 Sekunde
   cycles += digitalRead(lichtschranke); // Anzahl der Zyklen in der Zeit soll gezählt werden 
    Serial.println(cycles);     // Ausgabe am seriellen Monitor
    loopTime = currentTime;     // in  loopTime wird eine neuer Wert geschrieben
  }
 }

Mein Problem: die Impulse werden einfach hochgezählt und angezeigt.
Wie mache ich das besser?

User_ino:
Hallo, Leute
Habe vor, die Drehzahl eines Motors zu steuern. Ich will Anzahl der Impulse pro Sekunde zählen und zwar beispielsweise alle paar Sekunden. Eine Gabellichtschranke soll die Impulse liefern. ....

Ist irgendwie nicht ganz das Thema dieses Threads - willst Du nicht besser einen eigenen aufmachen?

Bei einer Gabellichtschranke hast du erst mal das Problem, dass das ein Analogsignal ist und nicht digital. Wenn du bei einem Motor eine Scheibe mit Löchern hast (wie einer Computermaus), ist das Signal sinusoid!

Das muss man erst mal mit einem Schmitttrigger-NAND (4093) oder einem Komparator aufbereiten, so dass man richtige LOW und HIGH Pegel hat. Danach gibt man dieses Signal auf einen Interrupt-Eingang. Dann bekommst du auch jeden Impuls mit.

Serenifly:
Bei einer Gabellichtschranke hast du erst mal das Problem, dass das ein Analogsignal ist und nicht digital. Wenn du bei einem Motor eine Scheibe mit Löchern hast (wie einer Computermaus), ist das Signal sinusoid!

Wahrscheinlich ist es nicht perfeckt rechteckig aber sinusförmig auf keinen Fall.
Grüße Uwe

Ich habe sowas gemeint:
http://img.alibaba.com/photo/244306672/optical_encoder_sensor_incremental_encoder_metal_encoder_disc.jpg

Ich habe das schon gemacht um die Drehzahl eines Motors zu überwachen (da man da anders als bei einem Loch pro Umdrehung sofort merkt wenn er langsamer läuft, auch wenn er langsam dreht). Es ist natürlich kein richtiger Sinus, aber sinus-ähnlich. Immerhin war es bei mir so. Hat man schön am Oszilloskop gesehen. Einfach weil der Phototransistor damit schrittweise verdunkelt wird und dann wieder schrittweise heller wird wenn die Scheibe daran vorbei fährt und das ganze nicht linear ist. Das ist auch der Fall wenn man nur einen Impuls pro Umdrehung hat.

Hängt vielleicht von der verwendeten Lichtschranke und der Form der Löcher auf der Codierscheibe ab wie es genau aussieht. Da gibt es sicherlich Unterschiede.

Setze eine Scheibe mit einem fehlenden Segment ein. Sie hat keine Löcher

Anders als bei digitalRead() kann es sein, dass es mit dem Interrupt auch so sicher funktioniert. Die Eingänge sind ab einem bestimmten Pegel High. Wenn das Signal ansteigt, wird wahrscheinlich der Interrupt Triggern wenn die Schwelle erreicht ist.

Ok, einigen wie uns auf Trapezförmig.
Der Lichtstrahl sollte aber feiner sein als das Loch und so ein halbwegs Rechteckiges signal rausbekommen. Zu langsam ansteigende Flanken können Probleme bei digitalen Eingängen geben (nicht sichere erkennung des Zustandes). Ein vorgeschalteter Schnidttrigger ist bei sehr langsamen und verrauschten Flanken nicht falsch.
Grüße Uwe

Das ist nur trapezförming wenn sich der Phototransistor linear verhalten verhalten würde. Was anders als bei Photodioden nicht der Fall ist. Allgemein steigt die Spannung am Anfang stärker als am Ende. Nur in der Mitte gibt es einen einigermaßen linearen Bereich. Das hängt auch damit zusammen, dass bei Transistoren generell die Stromverstärkung mit dem Kollektorstrom abnimmt. Vielleicht hatte ich auch nur Lichtschranken, die eine ausgeprägte Nicht-Linearität haben...

Wobei das hier egal ist. Das Problem ist so oder so das Gleiche :slight_smile:

Was mir noch eingefallen ist, dass der Arduino ja auch einen internen Komparator hat. Irgendwie dumm dass das nicht in der IDE implementiert ist. Daher vergisst man ihn leicht. Hier ist eine Lib dazu:
http://www.leonardomiliani.com/2012/analogcomp-una-libreria-per-gestire-il-comparatore-analogico/?lang=en

Auf dem UNO ist AIN0 Pin 6 und AIN1 Pin 7

Wenn man die Lichtschranke (mit Pullup) mit einem Eingang verbindet und an den anderen einen Spannungsteiler/Spindeltrimmer/Poti hängt, kann man die Schaltschwelle einstellen und wenn sie erreicht ist wird ein Interrupt ausgelöst. Die Lib ist dabei an attachInterrupt() angelehnt. Das Ganze hat allerdings keine Hysterese.