Forum: Mikrocontroller und Digitale Elektronik Gabellichtschranke löst zu viele Interrupts aus


von Daniel N. (danile97)


Angehängte Dateien:

Lesenswert?

Hallo,

ich habe zur Drehzahlmessung eine Gabellichtschranke verbaut, an der 
einmal pro Umdrehung ein Aluplättchen durchgeht. So soll die Drehzahl 
meiner Kleinwindanlage gemessen werden.

Zum Problem:
Teilweise funktioniert die Messung, teilweise zeigt mir das Messgerät 
auch eine Drehzahl von etwas über 700 U/min oder 400U/min an, obwohl die 
Anlage höchstens 200U/min hat. Folglich muss das Interrupt direkt wieder 
ausgelöst werden.

Ich habe es schon mit einem Low-Pass-Filter versucht- hat nix geholfen, 
auch die Widerstände etwas anzupassen hat leider nicht den gewünschten 
Erfolg gebracht.

Weiß jemand wo der Fehler liegen könnte? Vielen Dank im Voraus!

Lichtschranke: 
http://www.pollin.de/shop/dt/NDA5ODc4OTk-/Bauelemente_Bauteile/Aktive_Bauelemente/Optoelektronik/Gabellichtschranke_TCST1300_TFK_847_.html

Hier der gekürzte Programmcode:
1
//Globale Variablen für Drehzahlmesser
2
volatile uint8_t rotationszaehler=0;  //jede Umdrehung
3
volatile uint16_t rotationszeit=0;      //jede ms
4
5
int main(void)
6
{
7
  DDRD  &= ~ (1<<PD3);      //PD3 als Eingang
8
  //Interrupts
9
  MCUCR |= (1<<ISC11) | (1<<ISC10);      //INT1 steigende Flanke löst Interrupt aus (Drehzahlmesser)
10
  GICR  |= (1<<INT1);                      //Interrupt an INT1 aktiviert
11
12
  uint16_t drehzahl=0;
13
14
  sei();              //Interrupts enable
15
16
    //Drehzahl
17
    
18
    /*Damit die Drehzahl beim Einschalten des Messgeräts nicht zu hoch ist, 
19
    beginnt der Zähler bei 0 und wird in jeder Schleife aber auf 1 zurückgesetzt*/
20
21
    if (rotationszaehler>=2 && rotationszeit>80)
22
    {
23
      drehzahl = (uint16_t)(600000UL / rotationszeit); //zähler/zeit= f[1/ms] => n[1/10min]= f[1/ms] * 600s/min * 1000ms/s
24
      rotationszaehler=1;
25
      rotationszeit=0;
26
    }
27
    
28
    if (rotationszeit>6000)    //Ist nach 6s die Anlage nicht einmal durch die Lichtschranke gegangen, wird die Zeit wieder auf 5000ms zurückgesetzt zur Begrenzung der Daten
29
    {
30
      drehzahl=0;
31
      rotationszeit=5000;
32
      rotationszaehler=0;
33
    }
34
}
35
36
ISR(INT1_vect)  //Für Drehzahlmesser, steigende Flanke
37
{
38
  rotationszaehler++; //bei jedem Interrupt wird der Zähler eins hochgesetzt
39
}
40
41
ISR(TIMER1_COMPA_vect)
42
{
43
  rotationszeit++;
44
}

: Bearbeitet durch User
von WaMin (Gast)


Lesenswert?

Der Zugriff auf rotationszeit ist nicht atomisch.

von Wolfgang (Gast)


Lesenswert?

Dein Phototransistor ist verpolt.

Auch würde ein Schmitt-Trigger für das Optokopplersignal einen sauberen 
Puls formen, wenn man den mit einem angemessenen Tiefpass davor 
kombiniert. Eine Totzeit  nach einem Interrupt könnte Doppelpulse auch 
per Software unterbinden.

von Daniel N. (danile97)


Angehängte Dateien:

Lesenswert?

Oh stimmt- Der Transistor im Datenblatt verwendet den NPN aber 
andersrum- also an der Polung liegts nicht.

Eine Softwareunterbindung könnte ich versuchen. Auch einen 
Schmitt-Trigger.
Würde es Sinn machen, das Signal nicht auf der Kollektorseite, sondern 
auf der Emitterseite abzugreifen, also auch dementsprechend den 
Widerstand auf die Emitterseite zu ziehen?

Im Anhang der Richtige Schaltplan

: Bearbeitet durch User
von Jacko (Gast)


Angehängte Dateien:

Lesenswert?

Die Beschaltung des Optokopplers ist etwas eigenwillig.
Im Inversbetrieb bis 5 V funktionieren die meisten
Transistoren, aber mit Eigenschaften, die nicht im
Datenblatt aufgeführt werden.

Hast du jetzt nur den Emitterpfeil an der falschen Seite
gezeichnet? Oder entspricht die zeichnerisch umständliche
Abbildung wirklich der Realität?

Also:

- entweder Kollektor direkt an 5V und R17 (unten) direkt
  an Masse.

- oder Kollektor- und Emitter-Anschluss am Optokoppler
  tauschen, das gibt auch eine viel schönere (weil
  einfachere) Grafik.

Damit wäre das Optokoppler Signal schon mal elektrisch
optimiert.

von Wolfgang (Gast)


Lesenswert?

Daniel N. schrieb:
> Im Anhang der Richtige Schaltplan

Die Schaltung ist mehr als lebensgefährlich - zumindest für die 
Leuchtdiode.

Ein falscher Dreh am Poti und die Diode legiert durch...

Wenn du dich schon nicht traust, einen vernünftigen Vorwiderstand für 
die LED auszurechen, solltest du wenigstens einen Festwiderstand in 
Serie schalten, der so dimensioniert ist, dass der Strom garantiert 
deutlich unter dem zulässigen Maximalstrom bleibt.

von Daniel N. (danile97)


Lesenswert?

Die aktualisierte Schaltung habe ich oben hinzugefügt- diese entspricht 
der Realität.

Ich messe vor ich die Schaltung wieder anschalte den Widerstand des 
Poti. Unter 200 Ohm bin ich bisher nicht gegangen- sind dann 11mA.

: Bearbeitet durch User
von Jacko (Gast)


Lesenswert?

Danke, dass du uns mit deinen falschen PNGs beschäftigst.

Ist dein Code auch anders, als gezeigt?
Dann braucht man sich dazu ja keine Gedanken machen.

von Daniel N. (danile97)


Lesenswert?

Tut mir leid! Nein der Code ist so wie hier dargestellt.

von Magnus M. (magnetus) Benutzerseite


Lesenswert?

Hast Du die Lichtschranke auch ausreichend gegen Lichteinfall aus der 
Umgebung abgeschirmt?

von Daniel N. (danile97)


Lesenswert?

Die Lichtschranke ist in einem geschlossenen Gehäuse untergebracht- also 
in einer sehr dunklen Umgebung.

von Magnus M. (magnetus) Benutzerseite


Lesenswert?

Wie lang ist die Leitung zwischen Lichtschranke und dem µC?

von Daniel N. (danile97)


Lesenswert?

Die Leitung ist knappe 10m lang- ich habe mir auch schon überlegt, ob 
dadurch eine Störung hervorgerufen wird. Das Kabel liegt direkt neben 
den Stromführenden Kabeln der Anlage. Jedoch trat das auch auf, wenn die 
Anlage nur mit 0,2A oder gar nicht belastet war.

: Bearbeitet durch User
von Wolfgang (Gast)


Lesenswert?

Daniel N. schrieb:
> ich habe zur Drehzahlmessung eine Gabellichtschranke verbaut, an der
> einmal pro Umdrehung ein Aluplättchen durchgeht. So soll die Drehzahl
> meiner Kleinwindanlage gemessen werden.

Hast du dir mal ausgerechnet, wie lange die Lichtschranke bei maximaler 
Drehzahl unterbrochen wird?

von Joe F. (easylife)


Lesenswert?

Lasse mal den 1k serienwiderstand weg, nimm 1k als pullup statt 10k und 
plaziere den pullup am uC und nicht 10m entfernt am optokoppler.
dann wenn möglich das signal am uC mal mit dem oszilloskop 
angucken/aufzeichnen, ob da ein einigermassen digital aussehendes signal 
anliegt.

von Daniel N. (danile97)


Lesenswert?

Vielen Dank für eure Antworten! Oszi hab ich leider nicht, wäre gerade 
jetzt natürlich geschickt..

Aber diese Konfiguration werde ich ausprobieren.
Auch werde ich noch eine Programmzeile hinzufügen:
1
    if (rotationszaehler>=2 && rotationszeit<=80){rotationszaehler=1;}

Diese soll verhindern, dass der Zähler auf 2 gesetzt werden kann, bevor 
die 80ms Wartezeit vorbei sind.

von Magnus M. (magnetus) Benutzerseite


Lesenswert?

Daniel N. schrieb:
> Die Leitung ist knappe 10m lang- ich habe mir auch schon überlegt,
> ob
> dadurch eine Störung hervorgerufen wird.

Mit Sicherheit!

> Das Kabel liegt direkt neben
> den Stromführenden Kabeln der Anlage.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Magnus M. schrieb:
> Mit Sicherheit!
>> Das Kabel liegt direkt neben
>> den Stromführenden Kabeln der Anlage.
Da muss kein Strom drauf sein, da reichen schon "normale" Störungen, 
wenn ein derartig hochohmiges Signal quer durch die Bude geführt wird...

Ich würde da auch niemals nicht auf einen Interrupt gehen, sondern das 
Signal in einem 1ms Timertic pollen und dann mal anständig entprellen 
und filtern. Denn so ein Interrupt kann dir ganz schön die Rechenzeit 
stehlen, wenn er wegen jeder Störung aufgrufen wird.

: Bearbeitet durch Moderator
von Daniel N. (danile97)


Lesenswert?

Vielen Dank für eure Antworten! Also ich werde es jetzt mal so 
versuchen, den 10k durch einen 1k zu ersetzen und den 1k wegzulassen.
Hilft das nix werde ich es nochmal über einen Tiefpass versuchen und 
hilft auch das nix, werde ich einen Schmitt-Trigger verwenden oder die 
Software umprogrammieren.

von Joe F. (easylife)


Lesenswert?

Daniel N. schrieb:
> ich werde es jetzt mal so
> versuchen, den 10k durch einen 1k zu ersetzen

... und am uC anzuordnen und nicht 10m entfernt ...

von Wolfgang (Gast)


Lesenswert?

Daniel N. schrieb:
> Also ich werde es jetzt mal so
> versuchen, den 10k durch einen 1k zu ersetzen und den 1k wegzulassen.

Blind an den Widerständen zu ändern, wird nichts bringen.
Wenn du schon kein Oszi hast, prüfe mit dem Multimeter, welche 
Spannungen dein Spannungsteiler bei offener bzw. unterbrochener 
Lichtschranke liefert.

Das lange Kabel ist ausgesprochen ungünstig. Wenigstens sollte der 1kΩ 
zum µC hin direkt beim µC sitzen, damit die Leitung nicht noch über 
diesen Widerstand von einstreuenden Störungen getrennt ist - der 
Lichtschrankenteiler ist der "Treiber" für die Leitung.

"Widerstand ganz weglassen" und "Tiefpass einbauen" ist ein Widerspruch. 
Bevor du über einen Tiefpass nachdenkst, nochmal die Frage: "Wie lang 
ist dein Unterbrechungspuls bei maximaler Drehzahl"?

Ohne irgendwelche Daten zu deinem Aufbau ist das Stochern im Nebel.

von c-hater (Gast)


Lesenswert?

Daniel N. schrieb:

> hilft auch das nix, werde ich einen Schmitt-Trigger verwenden

Das tust du bereits. Die Digitaleingänge der AVR8 sind sämtlich 
Schmitt-Trigger-Eingänge. Wenn du Datenblätter lesen würdest, wüßtest du 
das...

Zum Problem: Wenn überhaupt was von den Vorschlägen in diesem Thread 
hilft, dann nur ein Tiefpass. Dabei ist es egal, in welcher Form der 
realisiert wird. Man kann es in Hardware tun oder auf verschiedene Arten 
in Software.

Das Problem ist nur: man kann die Zeitkonstante nicht beliebig hoch 
wählen, sonst siehst du nämlich dein Nutzsignal auch nicht mehr. Je nach 
Art der Störungen kann das letztlich durchaus dazu führen, dass es 
einfach garnicht geht, wenn nämlich die untere Grenzfrequenz des 
Störsignal nicht weit genug von der oberen Grenzfrequenz des Nutzsignals 
entfernt ist.

Deswegen (aber nicht nur deswegen) wäre es sehr viel sinnvoller, den 
Aufbau der Hardware zu ändern und zwar so:

An der Meßstelle wird nur die eigentliche Lichtschranke plaziert, und 
auf der Platine fügst du zu deiner Schaltung einen Optokoppler hinzu. 
Die Idee ist: die Lichtschranke steuert eine niederohmige Strohmschleife 
für die lange Übertragungsstrecke. Die ist von Hause aus sehr viel 
unempfindlicher gegen Störungen. Wenn du dann noch verdrilltes Kabel 
benutzt, sollte es mit an Sicherheit grenzender Wahrscheinlichkeit ohne 
Störungen abgehen.

Schaltung also etwa so:

                                                 ----------o VCC
Lichtschranke     langes Kabel    Empfänger mit | Optokoppler
                                                |
    --------------------------------|===|-------*-|===|-*--o Pin
   |                                            |       |
   |     ---------------------------|===|---   _|_      |
  _|_ |/ C                                  |  \ /    |/ C
  \ / |                                     |   |     |
   |  |\ E                                  |   |     |\ E
   |    |                                    ---        |
    ----*-----------------------------------------------*--o GND

Gegen kurze Spikes hoher Energie kann man zusätzlich noch einen kleinen 
Kondensator parallel zur LED des Optokopplers einbauen, aber vermutlich 
wird das in deiner Anwendung nicht nötig sein. Schaden kann's allerdings 
auch nicht, sofern der Kondensator klein genug bleibt, dass das 
Nutzsignal noch durchkommt.

von Wilhelm M. (wimalopaan)


Lesenswert?

Bei den Gabel- und Reflexlichtschranken tauchen zwei Probleme auf:

1) Wo ist der Schaltpunkt im analogen Signal?
2) Das Signal ist durch verschiedenen Einflüsse (optischer Verlauf, 
elektrische Störungen) nicht trapezförmig.

Deswegen habe ich die besten Ergebnisse erzielt, indem ich

- den Mittelwert des Signals der Lichtschranke bilde, und
- mit einem Schmitt-Trigger mit einstellbarer Hysterese

arbeite.

Das ganze kann man per SW machen. Dazu muss man dann das Analogsignal 
mit AD-Wandler lesen und die o.g. Sachen in SW machen.

Ist aber die Messstelle weit entfernt, sollte man m.E. anders vorgehen: 
denn man muss die Lichtschranke sowieso mit Versorgung ausstatten. Dann 
kann man auch eine kleine Platine machen, auf der ein Dual-OpAmp sitzt, 
wobei der eine den Mittelwert bildet und der andere der Schmitt-Trigger 
ist. Zudem hat man dann eine geringer Ausgangsimpedanz und man kann das 
Kabel ohne Probleme lang machen ...

von Martin S. (sirnails)


Lesenswert?

Bevor du nicht ausrechnest, welche RC Kombination da rein gehört, und du 
das Ergebnis nicht auch per Hardware umgesetzt hast, macht es überhaupt 
keinen Sinn, weiter herum zu raten!

von Wilhelm M. (wimalopaan)


Lesenswert?

Martin S. schrieb:
> Bevor du nicht ausrechnest, welche RC Kombination da rein gehört, und du
> das Ergebnis nicht auch per Hardware umgesetzt hast, macht es überhaupt
> keinen Sinn, weiter herum zu raten!

Wieso raten? Ich habe das zig mal umgesetzt ...

von m.n. (Gast)


Lesenswert?

Die ganzen Angstäußerungen wegen Kabellänge oder Interuptverarbeitung 
kann ich nicht teilen.

Wie c-hater schon schrieb, haben AVRs Schmitt-Trigger an den Eingängen, 
sodaß ein gut gefiltertes Signal, welches sich um Vcc/2 herum bewegt, 
für eine störungsfreie Erkennung ausreicht. Für 200 Upm (bzw. 3,3 Hz) 
kann der RC-Tiefpass alle externen Störungen filtern, muß aber direkt am 
µC liegen und bei 10 kOhm Pullup einen Widerstand >= 100 KOhm verwenden.

Beim Optokoppler ist darauf zu achten, daß der Pullup-Widerstand in der 
Kollektorleitung (Schaltbild: "Einfacher.png")liegt und das 
Tastverhältnis möglichst 50% beträgt. Dann lassen sich die Pegel für 
hell und dunkel auch mit einem Voltmeter ermitteln. Der Tiefpass kann 
dann für < 10 Hz ausgelegt werden.

Das Programm zur Auswertung ist ja sehr schlicht.

von Martin S. (sirnails)


Lesenswert?

Wilhelm M. schrieb:
> Martin S. schrieb:
>> Bevor du nicht ausrechnest, welche RC Kombination da rein gehört, und du
>> das Ergebnis nicht auch per Hardware umgesetzt hast, macht es überhaupt
>> keinen Sinn, weiter herum zu raten!
>
> Wieso raten? Ich habe das zig mal umgesetzt ...

Doch nicht Du :)

Der TO!

Es ist doch ganz klar, dass eine Gabellichtschranke nahe der 
Schaltschwelle einfach ein Zappeln erzeugt - selbst mit Hysterese, weil 
das Licht des Senders nicht homogen und parallel erzeugt wird. Es 
handelt sich sicher nicht um eine Laserlichtschranke.

Ein Tiefpass ist hier schon abhilfe genug, wenn der Rest der Schaltung 
stimmt. Alles andere ist herumgedokter an Symptomen, obwohl zwei 
primitive Bauteile das Problem weitgehend lösen werden.

von PittyJ (Gast)


Lesenswert?

Hast du mal mit einem Oszilloskop gemessen, was am Prozessorbeinchen 
überhaupt anliegt? Erst wenn man kennt, was dort ankommt kann man 
Gegenmaßnahmen ergreifen.

Ansonsten ist das doch ein Stochern im Nebel. Ein Widerstand hier, ein 
Programmzeile da, und bei Sonnenschein funktioniert es wieder nicht.

Also erst mal Fakten sammeln.

von c.m. (Gast)


Lesenswert?

10m kabel? was für eins? ein schönes geschirmtes netzwerkkabel oder 
klingeldraht?

das ist natürlich eine rhetorische frage ;-)

von Wilhelm M. (wimalopaan)


Lesenswert?

m.n. schrieb:
> Die ganzen Angstäußerungen wegen Kabellänge oder Interuptverarbeitung
> kann ich nicht teilen.
>
> Wie c-hater schon schrieb, haben AVRs Schmitt-Trigger an den Eingängen,
> sodaß ein gut gefiltertes Signal, welches sich um Vcc/2 herum bewegt,
> für eine störungsfreie Erkennung ausreicht.

Genau, Du musst den Arbeitspunkt der Lichtschranke auf Vcc/2 einstellen 
... was aus vielen Gründen nicht immer gelingt bzw. durch externe 
Faktoren driften kann.

Deswegen mein Vorschlag mit der adaptiven Schaltung, aka 
Mittelwertbildung. Und der zweite OpAmp als Schmitt-Trigger ist 
Ausgangstreiber. Wenn man dann noch die Adern verdrillt, kann man locker 
100m Kabel verwenden ...

Wer es noch eleganter haben möchte, spendiert direkt auf dem Platinchen 
einen tiny85 o.ä., um die Daten per nrf24l01 o.ä. über Funk zu senden.

von Daniel N. (danile97)


Lesenswert?

Vielen vielen Dank für eure Beiträge!

Also die Sache mit dem OPV zur Signalübertragung ist für mich mit sehr 
hohem Aufwand verbunden, da die Anlage schon aufgestellt ist.

Wolfgang schrieb:
> "Wie lang
> ist dein Unterbrechungspuls bei maximaler Drehzahl"?

Sorry- die Frage ist etwas untergegangen. Also die Drehzahl sollte 
eigentlich nicht höher als 400U/min gehen- messen möchte ich aber bis 
600U/min. Das Aluplättchen mit 12mm Breite bewegt sich auf einem Radius 
von etwa 180mm.
=> f= (600/60)Hz *2*pi*180mm/12mmm = 942Hz.
Die Zeit, in der die Lichtschranke unterbrochen wird, also das Signal 
"high" sein sollte, ist dann etwas mehr als 1ms.

m.n. schrieb:
> Dann lassen sich die Pegel für
> hell und dunkel auch mit einem Voltmeter ermitteln.

Problem dabei ist, dass ich die Anlage nicht in einer solchen Stellung 
halten kann, in der das Plättchen die Schranke verdeckt. Und das 
Multimeter ist zu langsam, um einen schnellen Puls zu messen- da springt 
die Anzeige nur irgendwie hoch.



Ich werde jetzt folgende Dinge versuchen und arbeite mich vom primitiven 
zum komplizierteren:

1) 1kOhm statt 10kOhm verwenden und direkt am AVR, den 1kOhm lasse ich 
weg
2) Software"filterung":

1
    if (rotationszaehler>=2 && rotationszeit<=80){rotationszaehler=1; rotationsfehlerzaehler++;} 
2
    
3
    if (rotationszaehler>=2 && rotationszeit>80)
4
    {
5
      drehzahl = (uint16_t)(600000UL / rotationszeit); 
6
      rotationszaehler=1;
7
      rotationszeit=0;
8
      rotationsfehler=rotationsfehlerzaehler;
9
      rotationsfehlerzaehler=0;
10
    }

Idee dabei ist, einfach mal zu zählen, wie oft denn ein fehlerhaftes 
Interrupt ausgelöst wird. Somit kann ich auch ohne Oszi ganz grob 
erkennen, wie das Signal in etwa aussehen muss.

3) Tiefpass.
4) Mittelwertbildung über ADC

Ich denke aus diesen Dingen müsste ich erstens erkennen, wie fehlerhaft 
das Signal wirklich ist und kann dann entsprechende Gegenmaßnahmen 
einleiten.

: Bearbeitet durch User
von Wilhelm M. (wimalopaan)


Lesenswert?

Am besten ergatterst Du erst mal für <100€ ein USB-Oszilloskop ...

von m.n. (Gast)


Lesenswert?

Daniel N. schrieb:
> => f= (600/60)Hz *2*pi*180mm/12mmm = 942Hz.

Ach so! Bei einem Tastverhältnis 1:100 kannst Du jeden Tiefpass 
vergessen, sondern mußt die Impulsübertragung vom Optokoppler zum µC 
niederomhig ausführen. Dafür gibt es 1000 und eine Möglichkeit vom 
Transistor als Inverter oder Emitterfolger mit 100 - 200 Ohm 
Lastwiderstand, über einen einfachen Logik-Inverter bis zum speziellen 
Treiberbaustein.

Ich weiß nicht, wieweit Deine Programmiererfahrung reicht. Aber zur 
Übersicht gebe ich Dir Beispiele für Frequenz/Drehzahlmessung auf AVRs, 
die auch einfach anzupassen sind.
Einmal hier u.a. auch für Arduino oder als Frequenz-Spannungswandler: 
http://mino-elektronik.de/fmeter/fm_software.htm
und mit kleinerer Auflösung und Anzeige: 
http://mino-elektronik.de/7-Segment-Variationen/LCD.htm#lcd2

von m.n. (Gast)


Lesenswert?

Ergänzung: Wenn Du unbedingt noch eine Totzeit per Hardware einfügen 
möchtest, geht das mit RC-Glied + Diode, womit der 1 ms Impuls gedehnt 
werden kann.

von Daniel N. (danile97)


Lesenswert?

Nun die ersten Testergebnisse:
Mit dem 10k und 1k zusammen und dem "Softwarefilter" hat es nicht 
funktioniert. In der kurzen Zeit, in der ich den Drehzahlmesser getestet 
habe, bin ich auf maximal 7 Interrupts wärend den 80ms Wartezeit 
gekommen. Trotzdem muss es danach auch noch ein Interrupt gegeben haben, 
denn es wurde mir als höchste Drehzahl 722,8rpm angezeigt, was natürlich 
nicht sein kann, denn es war nahezu windstill und die Anlage hat nur mit 
geschätzt 120rpm gedreht.

Aber auch der Test ohne den 1k Widerstand zum AVR hin und mit 1k statt 
10k hat keinen Erfolg gebracht- wieder 6 Interrupts und maximaler 
Drehzahlwert: 722,8rpm.

Auffällig ist, dass die Drehzahl bis etwa 120rpm oder so meist korrekt 
angezeigt wird, ab dann, evtl. da die Anlage belastet wird, aber nicht 
mehr und als maximaler Wert werden die 722,8rpm angegeben.

@m.n.: Danke für die Links- ich werde mir das anschauen!

: Bearbeitet durch User
von Joe F. (easylife)


Lesenswert?

Ich vermute ohne einigermaßen vernünftiges Messequipment (Oszilloskop) 
kommst du da nicht weiter.

von Peter D. (peda)


Lesenswert?

Man kann natürlich auch ganz einfach eine Totzeit mit einem Timer 
aufsetzen, die etwas kürzer als die maximale Drehzahl ist.
Der Flankeninterrupt disabled sich selbst und startet den Timer. Der 
Timerinterrupt löscht das Pendingflag (d.h. setzt es auf 1!) und enabled 
ihn wieder.

von Daniel N. (danile97)


Lesenswert?

@Peter:

Ja das habe ich mir auch gedacht und mit einer if-Bedingung wollte ich 
im Prinzip dasselbe machen, leider muss es auch nach dieser Zeit zu 
einem Interrupt gekommen sein, obwohl die Drehzahl eigentlich zu gering 
ist, um nach der kurzen Zeit wieder ein Interrupt auslösen zu können.

von Peter D. (peda)


Lesenswert?

Dann wird wohl der Arbeitpunkt deiner Schaltung nicht stimmen.
Miß am Eingang des MC mit einem Multimeter und drehe die Scheibe langsam 
durch. Es müssen <1V bzw. >4V zu messen sein.

von Joe F. (easylife)


Lesenswert?

Daniel N. schrieb:
> Das Aluplättchen mit 12mm Breite bewegt sich auf einem Radius
> von etwa 180mm.

Kann man den Unterbrecher eigentlich nicht breiter als 1% des Umfanges 
machen?
So kommst du bei 200U/min auf eine Unterbrechungszeit von ca. 33ms.

Was für eine Gabellichtschranke ist das eigentlich genau 
(Hersteller/Modell)?

von wendelsberg (Gast)


Lesenswert?

Frueher (als noch Alles besser war) haben wir in solchen Faellen eine 
Stromschleife verwendet. 20mA fliessen = 1, 0mA=0. Stoereinflusse auf 
Hin- und Rueckleiter heben sich auf, wenn diese im selben Kabel sind. 
Sien sie verdrillt, noch besser.

wendelsberg

von Joe F. (easylife)


Lesenswert?

Korrektur: Unterbrechungszeit ist sogar nur 3ms (1/(200/60))*0,01

wendelsberg schrieb:
> Frueher (als noch Alles besser war) haben wir in solchen Faellen eine
> Stromschleife verwendet. 20mA fliessen = 1, 0mA=0.

Naja, das erreicht man ja, wenn man den Pullup am uC plaziert, und 
entsprechend niederohmig dimensioniert.
Mit 1K fließen dann schon mal 5mA.

Das Problem dabei ist, dass der Transistor in der Lichtschranke auch 
genügend durchsteuern muss, um den Strom zu liefern.

: Bearbeitet durch User
von Daniel N. (danile97)


Lesenswert?

@Joe:

Es handelt sich um folgende Schranke: 
http://www.pollin.de/shop/dt/NDA5ODc4OTk-/Bauelemente_Bauteile/Aktive_Bauelemente/Optoelektronik/Gabellichtschranke_TCST1300_TFK_847_.html

Leider kann ich am Aufbau nichts ändern.


Peter D. schrieb:
> Dann wird wohl der Arbeitpunkt deiner Schaltung nicht stimmen.
> Miß am Eingang des MC mit einem Multimeter und drehe die Scheibe langsam
> durch. Es müssen <1V bzw. >4V zu messen sein.

Das werde ich wohl mal machen müssen. Den Arbeitspunkt muss ich dann 
über den Kollektorwiderstand einstellen. Im Stillstand kann ich auch von 
unten messen- da hatte ich etwa 4,5V- je nach Widerstand. Nur im 
unterbrochenen Zustand kann ich auf die Schnelle nicht messen.

von Joe F. (easylife)


Lesenswert?

Und welche von diesen?

TCST1103, TCST2103
TCST1202, TCST2202
TCST1300, TCST2300

Die sind jedenfalls alle ziemlich schlecht.
Das Transferverhältnis ist je nach Modell nur 1.5% .. 20%

D.h. wenn du die LED mit 11mA betreibst, kannst du am Ausgang max. 2.2mA 
bis im schlechtesten Fall nur 0,16mA erwarten.

Bei einer so langen Leitung reicht das nicht.

von wendelsberg (Gast)


Lesenswert?

Joe F. schrieb:
> Das Problem dabei ist, dass der Transistor in der Lichtschranke auch
> genügend durchsteuern muss, um den Strom zu liefern.

Dann muss vor Ort eben noch verstaerkt werden.
Grundsaetzlich gilt ja, dass ein starkes Signal schwieriger zu stoeren 
ist.
Allerdings koennte man ja das Segment eine halbe Umdrehung gross machen, 
dann sollten die Ein- und Auszeit immer etwa gleich lang sein. Auch die 
vorkommende Beschleunigung kann man abschaetzen und das Signal mit 
diesen Informationen auf Plausibilitaet pruefen.

wendelsberg

von m.n. (Gast)


Lesenswert?

Daniel N. schrieb:
> Leider kann ich am Aufbau nichts ändern.

Welchen AVR verwendest Du denn? ATmega328 auf einem Arduino-Board?
Dann versuch doch ersteinmal das Programm zum Laufen zu bringen, damit 
Du nicht auf zwei Baustellen gleichzeitig schaffen mußt.

Ein 50 Hz Signal muß 3000 Upm liefern. Das sollte doch einfach 
aufbereitet werden können: kleiner Trafo + Optokoppler.

von Heiko G. (heikog)


Lesenswert?

Daniel N. schrieb:
> Nur im unterbrochenen Zustand kann ich auf die Schnelle nicht messen.

Kommst du an die Lichtschranke nicht heran um da was zwischenzuschieben, 
zum Beispiel eine Pappe?

Alternativ kannst du auch das Poti vor der LED auf maximalen Widerstand 
und damit minimalen LED-Strom stellen (oder diese Leitung auftrennen 
wenn das geht), das sollte dem unterbrochenen Zustand zumindest 
näherkommen.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

wendelsberg schrieb:
> Dann muss vor Ort eben noch verstaerkt werden.
Warum, frage ich mich, verwendet man da nicht einfach einen 
kommerziellen Sensor, der gleich nach dem Anlegen einer Spannung sicher 
funktioniert?

Und wenn das dann tadellos läuft und die Schaltung 10000 mal aufgebaut 
werden muss, dann kann man sich selber eine billigere Lösung stricken...

von Daniel N. (danile97)


Lesenswert?

Ich verwende einen normalen ATmega32 ohne Arduino.

Stimmt, die LED könnte ich abschalten- das müsste funktionieren! Ich 
werde das direkt testen, danke.

von W.S. (Gast)


Lesenswert?

Das liest sich ja grauselig!

Ich sag dazu nur: Einfach mal 22nF zwischen µC-Eingang und Masse 
schalten und den Schlitz in der Schlitzscheibe so breit machen, daß er 
die halbe Scheibe beträgt. Alternativ die Breite der "durchgehenden 
Alu-Scheibe" so breit machen, daß sie für ne halbe Umdrehung gut ist. 
Kurzum: HALBKREIS.

Das sollte dicke ausreichen.

W.S.

von Daniel N. (danile97)


Lesenswert?

Es kann doch nicht sein, dass eine einfache Gabellichtschranke nicht 
funktioniert. Ich habe deshalb mal getestet, welchen Einfluss die Kabel 
wirklich haben- ich habe die LED komplett abgetrennt, trotzdem reagierte 
der Controller ab und an mal. Damit ist klar, dass die Messung entweder 
durch die Kabel verfälscht oder sogar so gestört wird, dass eine präzise 
Messung nicht möglich ist.

Ich werde nun noch versuchen, den Interrupt auf 0V am Eingang des 
Controllers sodass wenn die Lichtschranke durchschält, ein high-Pegel am 
Eingang anliegt. Evtl. können so die Störungen behoben werden.

Wenn nicht, werde ich mir einen Schmitt-Trigger mit OPV zusammenbauen 
und oben an der Anlage anbringen.

von m.n. (Gast)


Lesenswert?

Ich glaube nicht an Störungen des Signals. Ich glaube, daß Dein Programm 
nicht funktioniert. Aber das willst Du wohl nicht testen.

von Wolfgang (Gast)


Lesenswert?

Daniel N. schrieb:
> Ich habe deshalb mal getestet, welchen Einfluss die Kabel
> wirklich haben- ich habe die LED komplett abgetrennt, trotzdem reagierte
> der Controller ab und an mal.

Dann sind die von deiner Leitung eingefangenen Störungen so kräftig, 
dass sie deine Schaltschwelle überschreiten.

Mögliche Gegenmaßnahmen:

 * Signal kräftiger machen (mehr Strom, höherer Spannungshub)
 * Impulsstörungen durch Tiefpass platt machen
 * Signal so langsam machen, dass es gut durch den Tiefpass durch kommt
 * Störungen durch Abschirmung und/oder verdrillen der Leitungen 
verringern

von Alexander S. (alex998)


Lesenswert?

Daniel N. schrieb:
> Es handelt sich um folgende Schranke:
> 
http://www.pollin.de/shop/dt/NDA5ODc4OTk-/Bauelemente_Bauteile/Aktive_Bauelemente/Optoelektronik/Gabellichtschranke_TCST1300_TFK_847_.html

Wenn du das nächste Mal bei Pollin bestellst nimm gleich eine passende 
Lichtschranke:
https://www.pollin.de/shop/dt/NTI0OTc4OTk-/Bauelemente_Bauteile/Aktive_Bauelemente/Optoelektronik/Gabellichtschranke_VISHAY_TCYS5201.html

Hab schon mehrere davon verbaut, funktionieren absolut problemlos. Und 
kosten 5ct weniger...

von Daniel N. (danile97)


Lesenswert?

Das mit dem Tiefpass hat zur Besserung verholfen- erst ab einer Drehzahl 
von etwa 220U/min kamen die Störungen, aber funktionierte eben auch 
nicht einwandfrei. Kabel verdrillen ist relativ schwer, da sie in einem 
Rohr geführt werden und ich schlecht an die Kabel selbst komme.

von Wolfgang (Gast)


Lesenswert?

Daniel N. schrieb:
> ... erst ab einer Drehzahl von etwa 220U/min kamen die Störungen

Sitzt deine Störquelle vielleicht direkt neben der Lichtschranke?

Wieviel Strom lässt du durch deine LED fließen und wieviel Strom kannst 
du dann auf der Empfängerseite damit steuern. Wie weit nutzt du das aus 
und wieviel Reserve hast du ggf. noch beim (sinnvoll) zulässigen LED 
Strom?

Welche Grenzfrequenz hat dein Tiefpass und wie sieht dahinter dein 
Nutzsignal aus?

Du könntest beispielsweise mit deinem µC einfach mal messen, in welchem 
Zeitabstand die Pulse kommen. Wenn du seriell mit 115kBd ausgibst und 
keine Romane schreibst, sollte zumindest zu erkennen sein, ob die 
Störpulse von schlechte Flanken deines Unterbrechersignals kommen, i.e. 
als Burst immer nahe deiner Marke auftreten oder allgemein eingestreut 
werden und mehr oder weniger gleichmäßig über die Zeit verteilt sind. Es 
reicht doch, wenn du immer über bspw. 10ms die Impulse zählst, die Zahl 
ausgibst und das mit einem Terminalprogramm mitloggst.

von Toto mit Harry (Gast)


Lesenswert?

Ich sehe hier bei der unübersichtlichen Rechnung einen tiefen Eingriff 
der geheimen Timer1 Initialisierung und der unbekannten F_CPU.. ohne die 
eine fremde Begutachtung des Problems einfach nicht möglich ist.

Vorher ist das nur die Glaskugel..

Wieso überhaupt:
drehzahl = (uint16_t)(600000UL / rotationszeit); //zähler/zeit= f[1/ms] 
=> n[1/10min]= f[1/ms] * 600s/min * 1000ms/s


Ich mache selbst viel mit Timern.. aber irgendwie ist das ganze komisch 
kommentiert.. wäre es nicht 60000UL bei Z.B: Timer1 Prescaler1 
ocra=16000

von Keller Im (Gast)


Lesenswert?

Klemme doch die Lichtschranke vom AVR ab und baue eine Lichtschranke
auf Deinem Tisch auf. Nur so kommst Du voran.
Kläre ob Schaltung und Programm überhaupt separat funktionieren.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.