Kann es sein dass Du die Frage schon einmal im Bascom-Forum gestellt hast?
Kann es sein dass Du die Frage schon einmal im Bascom-Forum gestellt hast?
Es geht darum.
Hab hier einen CNY 70 der die Drehzahl eines Motor misst.
Die LED habe ich mit Timer0 gepulst.
Der Transitor geht dann auf einen Eingang des AVR.
Es muß nicht genau die Frequenz gemessen werden sondern
nur unterschieden werden, ob eine Frequenz anliegt (dann Variable +1) oder 0V Level.
OK, das habe ich verstanden: CNY70 arbeitet als Reflexlichtschranke und soll zur Unterdrückung von Störlicht mit 1kHz getaktet werden, in Deinem Fall von Timer0 per PMW. (letzteres geraten)
Da ich die mögliche Drehzahl des Motors nicht kenne (es mach schon einen Unterschied, ob Du bis 10.000 U/min oder bis zu 100.00 U/min messen willst) - könnte Deine Modulation mit 1kHz viel zu gering sein, weil schlicht und einfach zu wenig Zeit bleibt um das Ende des Impulses zu messen.
Beispiel: Deine Messung erfolgt per Reflexion an einem Rad, der Reflektor ist ca. 10mm vom Zentrum entfernt. Der Einfacheit halber ist alle 36° ein Reflektor, so dass 360°/36° = 10 Sekmente möglich wären - sondt wird es zu winzig. Wenn Du also mehr Segmente brauchst (genauer bzgl. des Drehwinkels), oder weniger - z.B. nur 1 Segment über die Hälfte des Umfangs (ca. 31,5mm weiß, 31,5mm schwarz) - dann ist die mögliche Messzeit sehr verschieden.
Bei 1kHz ist die HIGH-Phase alse 0,5ms, so dass sich in unserem Beispiel mit 1 Segment und z.B. 10.000 U/min ==> 166,6 U/sec in etwa 166,6 x 63mm = 10.495,8mm/s bzw. 10,4958 mm/ms zurückgelegt werden. Das heißt: Das halbe Segment ist ja nur 31,5mm lang und so passen gerade noch 3 Impulse (!!) auf den weißen Reflektor.
Die Wahrscheinlichkeit, dass Störungen mit 1kHz durch die Luft flimmern ist relativ groß - und damit ist die erwünschte Wirkung nicht gut genug. Empfehlung: Frequenz hochsetzen. Normale TV-Fernbedienungen arbeiten oft im Bereich 35...45kHz.
habe es mal so versucht.
geht relativ gut.
'Auwertung einer Drezahl mit einem CNY70
'Die LED des CNY70 wird an Protb.5 mit Timer2 gepulst
'am Transitor des CNY wird das Singnal mit einem RC Hochpaß aufbereitet und
'auf den INT0 (Portd.2) gegeben.
'Die Signale an Portd.2 werden während einer Torzeit(Timer0/Merker1) gezählt
'Liegt eine Frequenz an gab es während der Torzeit ca.6 Impulse
'Liegt eine Frequenz an wird hochgezählt und gewartet bis die Frequenz wieder weg ist.
'Liegt erneut eine Frequenz an wird wieder hochgezählt
$regfile = "m8adef.dat"
$crystal = 1000000
$hwstack = 40
$swstack = 16
$framesize = 32
Dim Wert As Word 'Erkannte Impulse
Dim Zaehler As Word 'Impulse Frequenz zählen
Dim Merker As Bit 'Merker Torzeit abgelaufen
Dim Merker2 As Bit 'Frequenz Ja/Nein
Config Portb.5 = Output 'Ausgang LED CNY 70
Config Portd.2 = Input 'Impulseingang
Config Portb.1 = Output 'Anzeige-LED Frequenz erkannt
Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.3 , Rs = Portb.0
Config Lcd = 20 * 4
Cursor Off
Cls
Config Timer0 = Timer , Prescale = 256 'Torzeit Impulse
On Timer0 Torzeit
Enable Timer0
Config Timer2 = Timer , Prescale = 8 'LED Pulsen CNY70
On Timer2 Ledpulsen
Enable Timer2
Config Int0 = Rising 'Interrupt zum Frquenz zählen
On Int0 Eingangsimpuls
Enable Int0
Enable Interrupts
Do
If Merker = 1 Then Gosub Auswerten 'Auswert nach Torzeit Frequenz Ja/Nein '
Locate 1 , 1
Lcd Wert ; " " 'Anzeige der erkannten Impulse
Loop
End
Auswerten:
Merker = 0 'Torzeitmerker auf 0
If Zaehler > 3 And Merker2 = 0 Then 'Prüfung neuer Frequenzimpuls Ja/Nein bei dieser Torzeit ca.6 Impulse
Incr Wert 'Erkannte Impulse hochzälen
Portb.1 = 1 'Frequenz erkannt
Else
Portb.1 = 0 'Frequenz nicht erkannt
End If
If Zaehler > 3 Then
Merker2 = 1 'Frequenz erkannt
Else
Merker2 = 0 'keine Frequenz erkannt
End If
Zaehler = 0 'Zähler auf 0 für nächsten Durchgang
Return
Ledpulsen:
Timer2 = 130
Toggle Portb.5 'LED CNY70 pulsen
Return
Eingangsimpuls:
Incr Zaehler
Return
Torzeit:
Timer0 = 100 'Timer0 auf Startwert 100
Merker = 1 'Torzeit abgelaufen
Return
Ich würde das etwas anders machen. Ich würde die Frequenz mit einem AMV erzeugen. Mit dem Empfänger des CNY gehst du auf einen Monoflop und somit musst du nur das Signal vom Monoflop auswerten. Frequenz würde ich ebenfalls auf ca. 30kHz (oder mehr) hochgehen.
MfG Hannes
Klar Frequenz kann ich erhöhen.
Wie im Titel vom Programm steht nehm ich das Signal vom Transistor des CNY 70 und filter die Gleichspannung mit einem RC Hochpass weg und mach mit einem OP LM358 TTL Pegel drauß.
Hat noch jemand andere Programmieransätze oder Vereinfachungen?
Der TTL Pegel ist ja wieder ein 30kHz Signal.
Das kannst Du nun mit dem Controller auswerten, oder Du schaltest noch ein Monoflop nach, wie Hannes schon vorschlug, und kannst dann die Impulse direkt mit dem AVR zählen.
Die Triggerschwelle des LM 358 würde ich einstellbar machen um die Impulse auch sicher zu detektieren.
Ja richtig...Hab ein Poti an den - Eingang des LM358 dran gebaut um
die Empfindlichkeit und Abstand zur reflecktierenden Markierung
ein zu stellen. Wollte die Außenbeschaltung weitestgehend gering
halten und in der Software erledigen. Aber welches retriggerbares Monopflop würdet ihr vorschlagen.
Lesezeichen