www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Frequenzen vervielfachen


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Arnobär (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Christoph Wagner (christoph)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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)

Autor: Arnobär (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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)!

Autor: dkm (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab mal sowas für die Verdopplung von Freqenzen gemacht,das hat
recht gut funktioniert:

http://www.loetstelle.net/projekte/frequencydouble...

Autor: Detlev Tietjen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Arnobär (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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..

Autor: Dietmar (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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).

Autor: peter dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: digger71 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Richtige PLL Multiplikatoren gibt's bei ...

http://www.icst.com/
http://www.icst.com/icscs/SearchByType.aspx?partty...

Da kann man z.B. 100 MHz in 0,1 MHz Schritten erzeugen, aus einem 4 MHz
Quarz ; siehe ICS307.

Klaus

Autor: digger71 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: peter dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@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

Autor: Nablus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das ist was wo DDS etwas bringt.

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Arnobaer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: digger71 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Arnobaer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja er hat 2 (output)compare register im timer

Autor: Arnobaer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: digger71 (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Arnobaer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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 ^^

Autor: digger71 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Alex Trusk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Dietmar (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.