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
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
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.
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)
Der 16F887 hat doch eine PWM, die fütterst Du mit dem Eingabewert, fertig
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.
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?
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
>> 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.
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.
ich schau mir die PWM mal genauer an, 10 Bit Auflösung würden mir reichen.
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.
Den Timer1 musst Du halt für Dein Capture nehmen und den Timer2 für PWM.
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.
> So gut und flott möchte ich auch gern programmieren können.
Übung macht den Meister ... :)
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.