Archiv verlassen und diese Seite im Standarddesign anzeigen : Frequenzwandlung
Hi,
ich möchte ein "relativ einfaches" Projekt umsetzen: An einem Eingangspin bekommt der Controller (MEGA8) ein Rechtecksignal, das von einem Sensor kommt, der die Drehzahl einer Welle misst. Dabei gibt der Sensor über eine halbe umdrehung ein low signal, und über die andere halbe Umdrehung ein high Signal - ganz einfach also.
Nun möchte ich die Frequenz des Ausgangssignals über ein Potentiometer verringern oder erhöhen können. Frage ist wie setze ich das in Code um?
Dachte da an Verwendung von Pulsein und Pulseout, mit letzterem habe ich aber noch nie gearbeitet und müsste ich mir erst mal experimentell ein Bild davon machen wie der Befehl funzt, da man sich auf die Bascom hilfe teilweise nicht verlassen kann. Vielleicht hat ja jemand vorab schon mal eine Idee.
Sauerbruch
03.01.2008, 22:59
Hmmm... also erstmal muss ich fragen, ob ich das richtig verstanden habe:
Deine Welle dreht sich z.B. 10 mal pro Sekunde, der Controller bekommt also ein Signal von 10 Hz, und soll daraus ein Signal generieren, das je nach Stellung eines Potis z.B. von 8-12 Hz veränderbar ist.
Richtig?
Und wenn ja: Welche Timer hast Du noch frei?
Hi,
absolut richtig verstanden. Timer stehen alle dafür zur verfügung.
Sauerbruch
04.01.2008, 09:32
Okay, dann würd´ ich es so machen (aber ohne Gewähr, dass es nicht vielleicht einfacher geht =P~ ):
1. Die variable Frequenz erzeugst Du mit Timer2 im "CTC"-Modus. Clear Timer on Compare bedeutet, dass der Timer solange hochzählt, bis der Zähler den Wert des Output-Compare-Registers (OCR2) erreicht. Bei "Gleichstand" wird der Output-Compare-Pin (B.3 beim Mega8) getoggelt und der Timer auf 0 zurückgesetzt. Somit hast Du ein Rechtcksignal, dessen Frequenz Du mit dem OCR2-Register beeinflussen kannst.
2. In das OCR2-Register muss also ein Wert, der einer halben (!) Wellenumdrehung entspricht (da der Output-Compare-Pin ja getoggelt wird, und der Timer deshalb für einen vollen Ausgangszyklus zweimal hochzählen muss), +/- einem Wert, den Du mit dem Poti generiertst. Hierfür nimmst Du den andren 8Bit-Timer (Timer0):
Du lässt Timer0 für eine komplette Umdrehung hochzählen und teilst den Wert durch 2. Damit hast Du immer genaue Werte, auch wenn Dein Wellen-Signal nicht 100% symmetrisch ist.
(Wellensignal an einen Interrupt-Engang, z.B. auf fallende Flanke konfigurieren, und in der ISR: Drehzahl = Timer0, Timer0 = 0, return )
Drehzahl = Drehzahl/2 kannst Du dann im Hauptprogramm machen...
3. Mit dem Poti und Getadc(x) erzeugst Du einen Wert zwischen 0 und 1023, den Du nur auf die gewünschte Größenordnung zuschneiden und zu "Drehzahl" addieren müsstest. Dieses Ergebnis wird dann in´s OCR2-Register geschrieben - fertich!
Im Datenblatt auf S. 111 ist ein schönes Diagramm zum CTC-Modus, ein Bild sagt mehr als 1000 Worte O:) . Etwas erschwerend ist, dass Bascom den CTC-Mdus offenbar nicht direkt unterstützt. Aber diese Funktion inklusive Prescaler etc. wird von nur einem einzigen Register (TCCR2) kontrolliert, das man ganz enfach "zu Fuß" setzen kann. Mehr dazu auf Seite 117!
Gutes Gelingen,
Daniel
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.