Archiv verlassen und diese Seite im Standarddesign anzeigen : Frequenz von Timer LM555CN messen
Hallo,
ich habe ein kleine Aufgabe vor mir. Ich habe mir eine Schaltung mit einem LM555CN folgendermaßen aufgebaut: http://www.lighthugger.de/wordpress/wp-content/wetter_plan.gif
Ein Kondensator am LM555CN ist variabel (seine Kapazität wird durch den Füllstand eines Gefäßes bestimmt). Dadurch müsste sich die Frequenz mit der Kapazität ändern.
Wie bekomme ich das nun hin, dass ich die Frequenzänderung messen kann? Leider habe ich von Timern noch keine so große Ahnung. Als Controller habe ich einen Mega32 mit 4MHz
Gruß, Werner
wenn das jetzt die 'katze' liest reist er mir wahrscheinlich wieder den popo auf :D aber naja
kuck dir mal das kapitel an: 16-bit Timer/Counter1 >> Input Capture Unit
das is ein 'hardware-feature' des timers der is geeignet um frequenzen zu messen
das blöde ist bloss wenn ich deinen schaltplan richtig interpretiere kommts du auf PD5, für frequenzmessungen musst du auf nen ADC eingang oder input-capture pin.
Vielen Dank für die schnelle Antwort.
Was die Ports angeht, bin ich recht flexibel. Also wäre z.B. Port 20=ICP1=Portd.6 am Mega 32 der Richtige. Bin mal gespannt, ob mein avr so schnell zählen kann. Also bei nem 200nF-Kondensator erkennt man noch, dass die LED blinkt, bei 100nF schon nicht mehr und ich liege mit meiner Kapazität im pF- Bereich.
boah ich steh grad aufm schlauch wie magst du das messen?
tau = R * C ?
du könntest evtl deinen µC nehmen und nen externen quarz ranhängen mit 16MHz ;) dann hast ne auflösung von 62,5ns.
Die Grundidee stammt eigentlich vom anderen Forum:
http://www.mikrocontroller.net/topic/13998
Heute hab ich meinen "Kondensator" auch schon direkt an den AVR gehängt, allerdings schwankte da der Wert nur zwischen 20 und 25. Das ist leider zu ungenau.
Hmm, also wenn ich das richtig verstanden habe, ist der erste Schritt das Setzen der Bits in TCCRB1:
ICES1=1 und CS10 =1
Bei ICNC1 =1 ist auch noch die Rauschunterdrückung aktiviert.
int main(void) {
TCCR1B=0xC1;
sei();
for (;;) {
}}
du frägst mich vielleicht fragen ;) dazu müsst ich das jetzt lesen.
auf jedenfall Prescaler einstellen sonst geht nix, dann noch evtl den interrupt anschalten der bei nem logic-wechsen am inputcaputer-pin kommt damit du das register auslesen kannst und dann sei()
würd ich mal sagen so ausm bauch.
Das Problem ist, dass es überall heißt, jaaa, das macht man mit dem 16 bit Timer und ICR. Nur leider finde ich nirgendwo ein Beispiel. Das wäre für mich als Einsteiger sehr wichtig.
schau mal hier: http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Die_Timer.2FCounter_des_AVR
is jetzt zwar nicht dein atmega32 aber die sind immer nach dem gleichen grundprinzip aufgebaut von den registern her.
Hallo i-mon,
im Wiki ist noch eine gute Seite:
https://www.roboternetz.de/wissen/index.php/Timer/Counter_(Avr)
Anmerkung für beide Programme:
Frequenz: 100kHz anstatt 1MHz
Prescaler: CS20 anstatt CS22
Vielen Dank. Mittlerweile habe ich einen guten Code gefunden und für meine Zwecke angepasst.
An der Luft bekomme ich Werte um die 50000, wenn mein Flachbandkabel voll im Wasser hängt 30000. Es schwankt zwar extrem, aber es wird für eine vernünftige Regenmessung reichen. Im Anhang habe ich noch meinen Code.
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.