PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Frequenz von Timer LM555CN messen



i-mon
06.03.2007, 18:46
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

bL1nK
06.03.2007, 19:08
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.

i-mon
06.03.2007, 19:14
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.

bL1nK
06.03.2007, 19:22
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.

i-mon
06.03.2007, 19:26
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.

i-mon
06.03.2007, 20:30
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 (;;) {

}}

bL1nK
06.03.2007, 21:09
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.

i-mon
06.03.2007, 22:51
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.

bL1nK
07.03.2007, 09:15
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.

Reeper
07.03.2007, 12:54
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

i-mon
07.03.2007, 13:25
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.