Forum: Mikrocontroller und Digitale Elektronik Wert in Frequenz umwandeln


von Sven M. (sven3)


Lesenswert?

Hallo

1.Ich bin Laie und habe jetzt erst mit den PIC angefangen.
vor 20 Jahren habe ich mich schon mal mit Assembler und Basic versucht, 
so das die Grundlagen zumindest noch vorhanden sind.
Derzeit nutze ich eien 16F887

Bevor ich mich an euch hier wende, habe ich erstmal selbst 2 Wochen 
probiert, komme aber zu keinem Ergebniss.
Ich möchte auch nichts programmiert oder fertigen Code haben, sondern 
suche nur ein Idee, wie man es machen könnte.

Es geht um Folgendes:

ich bekomme über den Capture Eingang ca. alle 5-300ms einen Impuls,
diesen wandel ich dann in einen Zahlenwert um , welcher max. 16 bit ist
also ca. 65000 , der kleinste Wert wäre dann 65000/60 ~ 1000.

diesen Wert möchte ich in eine Frequenz umwandeln (je höher , desto 
besser)
bin aber natürlich durch den Takt (20Mhz)/4  eingschränkt.

Ich habe es schon mit einer Zählschleife versucht, aber diese braucht 
viel zu lange und damit ist die Ausgangsfrequenz zu niedrig.

Ein weiterer Ansatzpunkt wäre den WERT in den CCPR2 eines 16bit Compare 
Registers zu laden. Dann wäre der gewonnene Takt etwas höher, aber ich 
komme mit der Compare Funktion nicht richtig klar?
Gibt es eine andere Möglichkeit einen Zahlenwert in eine Frequenz zu
wandeln (etwa durch Auszählung einzelner Bits in einer Schleife)

das Ergebnis sollte natürlich proportional sein (1% Fehler)

Oder wäre es besser den WERT am Port auszugeben und in einen 
BCD-Frequenz Wandler Chip zu speisen (gibt es sowas?)

Danke und Grüße
Sven

von Karl H. (kbuchegg)


Lesenswert?

Dein Zahlenwert ist ein Mass für die Periodendauer

Physik:
Der Zusammenhang zwischen Frequenz und Periodendauer lautet:

    f = 1 / T

f   in Hz
T   in Sekunden

von Sven M. (sven3)


Lesenswert?

Ja,

Das ist mir bekannt.

aber wie kann man mit diesem Zahlenwert ein Pin tooglen?

(außer einer Zählschleife, welche viel zu langsam ist)

also zb. bei einem Wert von 65000 brauche ich mindestens 500hz
bei einen wert von 1000 , dann enstsprechend 30khz.

von Karl H. (kbuchegg)


Lesenswert?

Ich denke mal dein ganzer Ansatz, wie du die Ausgansgfrequenz generierst 
(das Pin-Toggeln) ist schon unbrauchbar.
Im Idealfall überlässt man das einer Timer-Hardware, der man dann 
entsprechende Werte vorgibt, so dass diese das Toggeln eigenständig 
erledigt.

Das hier
> Ein weiterer Ansatzpunkt wäre den WERT in den CCPR2 eines
> 16bit Compare Registers zu laden.

klingt schon nach einem Schritt in die richtige Richtung

> Dann wäre der gewonnene Takt etwas höher,

Ist mir zwar nicht klar, warum das so sein soll, aber gut

> aber ich komme mit der Compare Funktion nicht richtig klar?

Dann musst du dich damit beschäftigen.
(Allerdings bin ich mit PIC nicht vertraut. Das Prinzip wird wohl 
ähnlich wie auf einem AVR sein, nur die Details sind unterschiedlich)

von bingo (Gast)


Lesenswert?

Der 16F887 hat doch eine PWM, die fütterst Du mit dem Eingabewert, 
fertig

von Karl H. (kbuchegg)


Lesenswert?

bingo schrieb:
> Der 16F887 hat doch eine PWM, die fütterst Du mit dem Eingabewert,
> fertig

PWM ist der falsche Ansatz um eine bestimmte Frequenz an einem Pin zu 
generieren.

von Sven M. (sven3)


Lesenswert?

PWM wird nicht gehen....

den Compare Mode hab ich mit Assembler schon testweise zu laufen 
bekommen,
aber ich bekomme kein Ausgangssignal proportional zum gesetztem pprc 
Wert raus.
Habe auch keine ordentlich Literatur dazu, nur die Datenblätter zu den 
PICs.
Eigentlich wollte ich es mit Basic und einem Dalay Befehl realisieren, 
aber als Zeit lässt sich hier nur eine Konstante und keine Variable 
laden.
Insgesamt scheint so ein 887 zu langsam für meine Frequenzausgabe zu 
sein, weil der Systemtakt nur max. 5Mhz ist.
Ich bräuchte wohl ca. das 10fache....

Daher die Idee einen BCD - Frequenzumsetzer nachzuschalten?
welcher 16 bit Eingang in 0- 65000 Hz umwandelt.
Aber wer baut solche ICs?

von Sven M. (sven3)


Lesenswert?

habe was gefunden,
aber natürlich mit 20mhz zu schnell und auch nicht billig..

http://www.alldatasheet.com/datasheet-pdf/pdf/48151/AD/AD7008AP20.html

von bingo (Gast)


Lesenswert?

>> Der 16F887 hat doch eine PWM, die fütterst Du mit dem Eingabewert,
>> fertig

> PWM ist der falsche Ansatz um eine bestimmte Frequenz an einem Pin zu
> generieren.

Wieso denn das? Bei den PICs kann ich völlig easy eine Frequenz per PWM 
generieren, den Duty-Cycle einstellen und die Hardware macht alles 
andere. Dazu brauche ich keine Loops und keinen Interrupt, nur das 
PWM-Modul und Timer2. Derweil kann sich der Prozessor um andere Dinge 
kümmern.

von Karl H. (kbuchegg)


Lesenswert?

bingo schrieb:
>>> Der 16F887 hat doch eine PWM, die fütterst Du mit dem Eingabewert,
>>> fertig
>
>> PWM ist der falsche Ansatz um eine bestimmte Frequenz an einem Pin zu
>> generieren.
>
> Wieso denn das? Bei den PICs kann ich völlig easy eine Frequenz per PWM
> generieren, den Duty-Cycle einstellen und die Hardware macht alles
> andere.

Muss man dazu am PIC immer eine PWM benutzen.
Weil: Eigentlich brauchst du ja die PWM an sich gar nicht.

> Dazu brauche ich keine Loops und keinen Interrupt, nur das
> PWM-Modul und Timer2. Derweil kann sich der Prozessor um andere Dinge
> kümmern.

Timer ist schon klar. Aber zb auf einem AVR kann man das locker mittels 
CTC Modus machen. PWM muss man da nicht unbedingt einsetzen auch wenns 
natürlich geht.

von Sven M. (sven3)


Lesenswert?

ich schau mir die PWM mal genauer an, 10 Bit Auflösung würden mir 
reichen.

von bingo (Gast)


Angehängte Dateien:

Lesenswert?

Ich habe Dir mal eine Muster-Datei für PWM angehängt. Die ist zwar für 
den PIC12F683, die Register-Namen für Timer und PWM sind aber beim 
16F887 die gleichen, Du must halt nur die Includes, CONFIG und die 
ersten Init-Zeilen anpassen. Das Programm hat eine feste Frequenz, der 
duty-cycle beginnt bei 100% und fährt linear auf 0% runter, dann fängt 
alles von vorne an. Wenn Du xxx oder den Vorteiler von Timer2 anpasst, 
bekommst Du andere Frequenzen.

von Sven M. (sven3)


Lesenswert?

vielen Dank !

teste ich gleichmal...

von bingo (Gast)


Lesenswert?

Den Timer1 musst Du halt für Dein Capture nehmen und den Timer2 für PWM.

von bingo (Gast)


Lesenswert?

Das könnte Dich auch noch interssieren ...
http://sprut.de/electronic/pic/grund/pwm.htm

von Sven M. (sven3)


Lesenswert?

ja super.

hab noch paar Kleinigkeiten auf den 887 adaptiert.

jetzt läuft mit 15 khz

jetzt teste ich noch ein paar Frequenzwerte durch,
das Tastverhältniss stelle ich fest auf 50% ein.

So gut und flott möchte ich auch gern programmieren können.

Hut ab.

von bingo (Gast)


Lesenswert?

> So gut und flott möchte ich auch gern programmieren können.

Übung macht den Meister ... :)

von Sven M. (sven3)


Lesenswert?

ja, :-)

aber der maximale Wert von 1024 macht  Probleme,
da ich bei meiner max. Frequenz (ca. den Wert 30) laden müsste.
Weil ich aber immer damit rechnen muss, das die Capture Funktion einen 
Impuls verpasst, so komme ich dabei auf 3% Fehler was etwas zuviel ist.

Ideal wäre ein 12 Bit PWM.

von Sven M. (sven3)


Lesenswert?

Habe das Programm jetzt endlich (in mikroBasic) zum laufen gebracht,
es zeigt sich aber, das die 8 Bit der PWM zu wenig Auflösung bieten.
Denn ich bekomme (und den brauche ich auch) vom Capture Modul die 2x 8 
Bit Register CCPR1L und CCPR1h geliefert, davon schreibe ich dann den 
H-Teil in das PWM Perioden Register (PR2). Den Duty Cycle gewionne ich 
aus CCPR1H/2,
also 50/50.
Dadurch habe ich jetzt eine schlechte Auflösung, weil die 256 niedrigen 
bits
sozusagen unterm Tisch fallen. Bei einem Gesamtwert von 60000 ist dies 
noch zu verschmerzen, bei einem Wert von 2000 liegt der Fehler schon bei 
über 10%!

Da es keine 8 bit PIC mit 16 bit PWM gibt, will ich auf 16 bit umsteigen
(24F16xxx), dann gibt es noch den 18f2331, der wohl eine echte 12bit PWM 
hat?

Jetzt die Frage, wie programmiere ich die Dinger?
Habe ein Easy PIC6 Board gekauft, aber das machts nur bis zur 18ner 
Reihe.
Einen Fassungsadapter kann ich mir ja selbst basteln, und die Software 
kennt die 24er Typen auch, aber funktioniert das mit der Boardhardware?

oder hat jemand noch eine Idee um einen 16 bit Wert anders in eine 
Ausgangsfrequenz zu wandeln (ca.1khz-100khz)

Grüße Sven

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
Noch kein Account? Hier anmelden.