Hallo ^^ Ich habe eine Frage zu einem Problem das mich beschäftigt: ich möchte mit einem tiny15 eine art Frequenzvervielfacher bauen. Das soll so aussehen das er eine sehr niedrige Frequenz um den Faktor ~1000 (1024 würd auch gehen) erhöht. Die Eingangsfrequ. liegt zb. an INT0 an soll an einem Pin multiplizert wieder rauskommen. 0,5Hz -> ~500Hz (also das pin muss hier mit 1kHz togglen) 0,8Hz -> ~800Hz 1,3Hz -> ~1300Hz in diesem Bereich soll sich das ganze abspielen. so in etwa, es muss nicht Quarzgenau sein, ich verwende den tiny15 ja mit dem internen oszi 1,6MHz (geht ja nicht anders^^) Das ich eine Frequenz einlese mit einer Zählroutine bekomme ich gut hin, aber wie kann man aus diesem Wert nun das 1000fache an einem anderen Pin rausbuchsieren. wäre sehr dankbar für wenn mir da wer weiterhelfen könnte! mfg
Das wird wohl mit einem Mikrocontroller nicht funktionieren. Du kannst Frequenzen (vorausgesetzt du willst einen exakten Dutycycle) ab einer bestimmten Größe nur noch als Teiler deiner Quarzfrequenz erzeugen. Auch wird es problematisch, wenn du z.B. 3KHz eingibst. Dann wird sicherlich nicht 3MHz rauskommen, sondern irgendwas weit daneben. Für solche Sachen nimmt man eigentlich analoge Schaltungen --> PLL. Nur glaube ich nicht, dass man mit einer PLL eine Frequenz derartig weit hochtakten kann ... Um was geht es denn eigentlich dabei ? Villeicht findet sich ja eine andere Lösung. EDIT: Aso. Der Tiny hat ja nur 1,6MHz ... nu ja. Dann schätze ich mal ... wenn du sehr gut programmierst wirst du villeicht 800KHz Ausgang schaffen (vorausgesetzt das Ding hat einen Timer - sonst nich mehr wie 200 KHz). Allerdings liegen zwischen deinen erzeugbaren Frequenzstufen schnell mal viele KHz (vor allem im Maximalbereich). (Prognose in Frequenzstufen : 800.000 - 533.333 - 400.000 - 320.000 - 266.666 - 228.000 - 200.000 - 177.777 - 160.000)
nun so hoch möchte ich ja garnicht hinaus, als höchste Ausgangsfrequenz sind ca 1,5Khz gedacht. Die Frage die ich vor allem habe ist: mit was für einer Frequenz sollte ich den Frequenzzähler betreiben um einen schönen wert zu bekommen. Und wie kann ic heinen so aufgenommenen Wert so herummurksen das ic han einem Pin wieder genau die 1000fache Frequenz vom Eingang habe. Ich habe nur Eingangsfrequ. von 0,5 bis 1,5 Hz in etwa, also nie mehr als 1500Hz (1,5kHz)!
Ich hab mal sowas für die Verdopplung von Freqenzen gemacht,das hat recht gut funktioniert: http://www.loetstelle.net/projekte/frequencydoubler/frequencydoubler.php
Ich schlage folgenden Algoritmus vor: Messe die Zeit eines Eingangsimpulses in Systemtakten mit Hilfe eines Zählers (+Interrupt-Routine). Teile den Wert durch 1024/2048 und gib dies als Wert für einen zweiten Zähler, der dann den Ausgangspin ansteuert. An deiner Stelle würde ich mir aber vorher das Datenblatt des CD4046 (PLL) ansehen, ob du damit nicht einfacher und schneller zum Ziel kommst. Muss nicht immer µC sein.
eine Pll wäre schon fein. Ich habe mal mit einer Pll im Laborunterricht in der Schule was gebaut, wir haben dort einen Pulsmesser gebaut, das Problem war das wir den 4046 nicht zum laufen gebracht haben wegen der niedrigen Frequenz am Eingang (1-2Hz). Und ich hab nun auch wieder sehr tiefe Frequenzen unter 1Hz leider. Unser Professor meinte das der 4046 nicht mit so tiefen Frequenzen kann.. :/ lag mit irgendwas am RC glied zwischen Komparator und VCO..
Wenn du die Lösung nicht mit dem Controller direkt bekommen kannst, hier eine kleine Anregung: Ja, mit der PLL, da war was mit dem Kondensator: Der darf keine Verluste haben, egal welcher Art, also erst recht kein ELKO, am besten Styroflex. Der 4046 geht, habe damit mal einen digitalen Drehzahlmesser fürs Auto entworfen. Der vervielfacht die Frequenz am Unterbrecherkontakt, um eine bessere Auflösung (für 3-4 Stellen am Display) zu bekommen. Das hat aber auch Einschwingzeit, bzw. Einrastzeit der PLL. Die Frequenzen bewegen sich im Bereich wenige kHz. Die 4046 unterscheiden sich etwas, bitte Details zwischen 4046 und 74HC4046 in den Datenblättern beachten. Gruß Dietmar
Man misst eine halbe Periode und schiebt den Wert zehnmal nach rechts. Diesen Wert übergibt man dann einem Timer, der einen OC-Pin wackeln lässt. Ich weiß nicht, ob das mit einem Tiny15 geht. Ausserdem kann man damit nur symmetrische Perioden herstellen. Und bei einer "Einstiegsfrquenz" von 0,5Hz braucht man schon einen etwas grösseren Zählerumfang (3-4Bytes).
Ne PLL für 0,5Hz kannste voll vergessen, die braucht ja Stunden zum Einschwingen. Nen MC zu nehmen ist schon ganz richtig. Wie man nen 32Bit Timer bastelt, steht ja in der Codesammlung. Peter
Die Frage ist, wie genau beide Frequenzen zu einander sein müssen. Wir brauchten einen Umsetzer für die Ausgangsdrehzahl eines Automatikgetriebes.(Mit geänderter Ausgangsübersetzung). Vorher war eine Analogschaltung mit F/U und U/F Umsetzer drin, hat aber nicht so richtig funktioniert, weil die nicht bis auf Null regeln konnte. Das Getriebe hat einen eigenen Steuerrechner und reagiert darauf mit Notlaufprogramm. Kurz gesagt, es funktioniert. War aber nich ganz ohne.
Richtige PLL Multiplikatoren gibt's bei ... http://www.icst.com/ http://www.icst.com/icscs/SearchByType.aspx?parttype=Synthesizers Da kann man z.B. 100 MHz in 0,1 MHz Schritten erzeugen, aus einem 4 MHz Quarz ; siehe ICS307. Klaus
Du kannst die Eingangsimpulsdauer über einen 16 Bit Zähler (möglichst genau) ermitteln und in eine Variable schreiben. Diesen Wert umrechnen und einen zweiten Zähler damit laden. Der Interrupt für den zweiten Zähler toggelt den Ausgang. Bei dualem Teilungsverhältnis kein Problem, muss man nur ein paar Bits verschieben. z.B 1/1024 = 10 Bit Will man ein ungeradzahliges Verhältnis haben muss man dividieren oder multiplizieren und das braucht unter Umständen viel Rechenzeit. In meinem Fall war das zu langsam ( auch mit Tabellen), weshalb ich einen Prozessor mit Hardware-Multiplizierer genommen habe. (Drehzahl bis um 5000 U/min) Wenn deine Eingangsfrequenz nicht grösser wird als oben angegeben sollte es auch ohne gehen. Entscheidene ist auch wie schnell sich die Eingangsfrequenz ändern kann, um entsprechend darauf zu reagieren.
@Klaus "Da kann man z.B. 100 MHz in 0,1 MHz Schritten erzeugen" Und was hat das mit dem Thema zu tun ? Hier ist von max 1,3kHz die Rede. Peter
Auch wenn peter dannegger wieder schreiben wird: "Und was hat das mit dem Thema zu tun ?" hier noch'n Tipp ... Stichwort: Reziproker Frequenzzähler http://www.mino-elektronik.de/fmeter/fmeter.htm http://www.mino-elektronik.de/ Wenn man die Eingangsfrequenz (niedrig) genau ausgezählt hat, kann man mit einem "Frequenzgenerator" die vielfache erzeugen. Bei ein paar kHz sollte das per SW möglich sein. Ob ein "Tiny" Prozessor mit irgendeinem instabilen internem Takt das in der gewünschten Genauigkeit bringt, ist eine andere Frage.
danke für die vielen antworten ^^ also das hat mich jetzt auf was gebracht! wenn ich mit einer frequenz X einlese, dann muss ich diesen Wert mit der Frequenz 2*X*Multiplikator hinauszählen, so kann ich ja jede beliebigen Multiplikation der urfrequenz wieder hinausschicken oder? hab ich 0,5Hz am Eingang, lese ich mit 100Hz ein = 2000 der Wert, den kann ich einfach wieder mit 2*100*1000Hz= 200kHz herunterzählen und ein Pin togglen. dann hätt ich 100Hz am am Ausgang = 50Hz Frequenz ^^ jetzt hab ich aber noch ne schikane, ich würde nämlich auch gerne das Tastverhältnis frei wählen am Ausgang, sagen wir von so klein wie möglich bis 0,5 das scheint auch kompliziert zu sein... es würde ja super gehen wenn ich meinen Ausgang noch phasenverschieben kann und den Phasenverschub einstellen kann, am besten mit nem poti über ADC. oje der arme kleine tiny und meine ideen ^^ __ ___ ___ __ __ ___ ___ ___ __ Ausgang __ ___ ___ ___ _ ___ ___ ___ __ Phasenverschob. Ausgang _ __ __ _ __ ____ ____ ____ ___ Ausgang mit neuem Tasverhältnis kann man das erkennen was ich meine? das muss nich fürhterlich genau sein, es sollt nur genau das tuen, hm
Statt den Ausgang bei jedem Zählerüberlauf zu toggeln, müsste man bei bestimmten Werten des zweiten Zählers ein-/ausschalten. Hat der Tiny15 Capture/Compare ? Kenn mich mit PIC besser aus.
aber die multiplizierte Frequenz will ich eh nimmer anrühren, es geht jetzt um das Originalsignal also zb. wenn ich die 0,5Hz am Eingang habe will ich genau dieses Signal phasenverschoben (des faktor will ich einstellen) auch ausgeben, bzw nur die UND verknüpfung davon, ich erhoffe mir so ein verändertes Tastverhältnis 0,5Hz __--__--__-- ->[Tiny15]-> ___-___-___-___- 0,5Hz
Ich besorg mir erstmal das Datenblatt vom Tiny15. Es gibt übrigens auch fertige Wandler für Spannung/ Frequenz und umgekehrt (s.Anhang), die wollte ich ursprünglich verwenden, waren aber mit 1Hz-100Khz zu langsam.
also bei mir wäre die Frequenz davon super drinnen.. hm hab mir was überlegt wegen tastverhältnis, aber das wird kopliziert. Ich lese also einen Wert ein, disen Teile ich durch 2. lade das Ergebnis in 2 Register. Sagen wir das erste ist die länge der high, das andere die Länge der low Flanke. hab ich zb [250] gemessen verfrachte ich das in 2 Register: [125] [125] Nun ziehe ich zb. 50 ab udn addiere das beim anderen [075] [175] und lade einmal das 1. dann das 2. register immer in meinen Timmer, oder das erste als OCR1A und das zweite als OCR1B und resette da den Timer udn toggle mit dem Timer das OCR Pin. So hätte ich ja ein variables Tastverhältnis.. aber kann man das vlt mit ner kleinen Schaltung nicht leichter machen oder ist das ein guter Ansatz? jetzt möchte ich parallel zu allem (Frequenz multiplizieren und pahsenverschobenes Eingangssignal ausgeben) auch noch mit einem Poti am ADC von 0,0 bis 0,5 (notfall hinauf bis 1,0) das Tastverhältnis einstellen vom Phasenverschobenen Eingangssignal (kennt man sic hda noch aus?) wenn ich das hoinbekomme wäre es perfekt ^^
Hab das Datenblatt mal kurz überflogen. Wäre eigentlich am einfachsten mit PWM zu machen, da kann man aber leider den BasisTakt nich beliebig klein wählen. Du musst den Ausgangs-Timer ja sowieso nachladen, da könnte man abwechselnd die High- und Low-Zeit laden, mit Phasenverschiebung wirds etwas komplizierter. Ich würde es erstmal ohne probiern, da kann man schon genug Fehler einbauen.
ohne ins datenblatt bom t13 geschaut zu haben, wuerde ich es grob so machen: volatile uint8_t delay; main() { //timer und int initialisieren sei(); for(;;) { delayschleife(delay); PORTx ^= 1<<y; } SIGNAL(interrupt) { delay=TIMER; TIMER=0; } delayschleife einfach so "dimensionieren" dass sie die richtigen faktor erzeugt. gruss, alex.
@Arnobaer: Vergiß mal die PLL und zusätzlichen Hardwareaufwand. Miß die Interruptfrequenz, d.h. genau genommen die CPU-Takte für eine Periode der Eingangsfrequenz. Lade damit, bzw. einem daraus berechneten Wert, einen Timer so, daß er die gewünschte Timer-Überlauf-Frequenz erzeugt und beim Timer-Interrupt einen Ausgangspin mit der gewünschten Frequenz ansteuert. Das ist reine Software. Gruß Dietmar
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.