ich brauche (mal wieder) kompetente Beratung , diesmal geht es
um die Programmierung analoger Inputs/ADC zB. beim PIC12(L)F1840.
Wie man die analogen Eingänge konfiguriert kann man sich mit diversen Tutorials erarbeiten. Vorab, ich habe noch keinen (zB) PIC12(L)F1840
und daher noch nichts wirklich ausprobiert, ich möchte vorher schon ein paar Fragen klären, kann ja nichts schaden sich frühzeitig zu informieren :-)
Nehmen wir an ich möchte an einem analogen Eingang eine Spannung im Tonfrequenzbereich "messen".
Diese Eingangsspannung fällt exponentiell ab, ich möchte wissen,
wann ein gewisser Wert unterschritten wird.
Ein AD-Wandler im PIC12(L)F1840 hat 10Bit-Auflösung, was bedeutet das praktisch ? 10Bit entspricht einer Auflösung von 0-1023.
Die Versorgungsspannung beträgt 5V, also läge die Auflösung bei 5V/1023,
=~ 5mV ?
Ich möchte aber zb wissen, wann 1mV unterschritten wird.
Meine Idee:
Die zu messende Spannung wird mit OpAmp (Verstärkung 100), transformiert also eine mögliche Eingangsspannung von 0 - 5V auf 0 - 500 V. Geht natürlich nicht, aber da mich ja nur der Bereich zwischen 0 und 10mV interessiert, begrenze ich den Eingang einfach mit einer Diode auf sagen wir 4,7V (das entspräche dann einer Ursprungsspannung von 50mV).
Bei 10 Bit Auflösung würde ich dann in einer Auflösung von 500µV messen.
Kann man so verfahren ?
Nächste Frage, wie debugge ich so etwas ?
Wenn ich tatsächlich die analoge Eingangsspannung mit dem ADC so (oder anders, wer weiß) messen kann, wie debugge/teste/verifiziere ich im Programm dann was ich da messe ? Ist ja nur graue Theorie und vielleicht ist mein Programm auch korrekt, aber wie bekomme ich das ohne Terminal/etc heraus ?
Sorry, ich bin neu auf diesem Gebiet und kann mir im Moment nicht vorstellen, wie ein Profi das Problem löst.
Die Versorgungsspannung beträgt 5V, also läge die Auflösung bei 5V/1023,
=~ 5mV ?
Es kommt nicht auf die Versorgungsspannung, sondern auf die gewählte Referenzspannung an.
Nehmen wir an ich möchte an einem analogen Eingang eine Spannung im
Tonfrequenzbereich "messen".
Diese Eingangsspannung fällt exponentiell ab
Eine Spannung im Tonfrequenzbereich verhält sich sinusförmig. Willst du vielleicht gar nicht den zeitlichen Verlauf der Spannung messen, sondern eventuell die Änderung der Amplitude über die Zeit?
Wie kommst du auf "exponentiell"?
Die Versorgungsspannung beträgt 5V, also läge die Auflösung bei 5V/1023,
=~ 5mV ?
Nö, die Referenzspannung des ADC wird nicht bei 5V liegen. Die kann entweder aus einer internen Referenzspannungsquelle abgeleitet werden oder extern angelegt werden -- sieh ins Datenblatt, da steht das drin.
Die Versorgungsspannung beträgt 5V, also läge die Auflösung bei 5V/1023,
=~ 5mV ?
Es kommt nicht auf die Versorgungsspannung, sondern auf die gewählte
Referenzspannung an.
Das bedeutet, dass ich die Eingangsspannung gegen eine Referenzspannung messe ? Das begrenzt (bei Referenzspannung 1V zb) dann aber auch die max messbare Spannung am analog-Eingang, oder ?
Kannst du das bitte genauer erläutern ?
Nehmen wir an ich möchte an einem analogen Eingang eine Spannung im
Tonfrequenzbereich "messen".
Diese Eingangsspannung fällt exponentiell ab
Eine Spannung im Tonfrequenzbereich verhält sich sinusförmig. Willst du
vielleicht gar nicht den zeitlichen Verlauf der Spannung messen, sondern
eventuell die Änderung der Amplitude über die Zeit?
Wie kommst du auf "exponentiell"?
Das Signal kommt aus einer E-Gitarre und fällt schnell ab.
Sämtliche Werte, die ich in meinem Ursprungspost geschrieben habe,
sind nur in der Größenordnung richtig.
Ich arbeite mich mit diesem Post in das Thema ein, das bedeutet auch, dass ich neue Begrifflichkeiten lernen muss.
Die Versorgungsspannung beträgt 5V, also läge die Auflösung bei 5V/1023,
=~ 5mV ?
Nö, die Referenzspannung des ADC wird nicht bei 5V liegen. Die kann
entweder aus einer internen Referenzspannungsquelle abgeleitet werden
oder extern angelegt werden -- sieh ins Datenblatt, da steht das drin.
Okay, wie schon in einem anderen Beitrag weiter oben geschrieben,
ich arbeite mich mit diesem Post in das Thema ein :-)
(Bevor ich dann mit etwas mehr/ausreichendem Wissen) loslege.
Theoretisch ja. Wie du das erreichst ist eine andere Frage. Ob du beim OP Ampg irgendwie limitierts oder den ADvref so wählst. Aber ich denke, es wird wegen den Noise schon probleme geben. Würde mich wundern wenn das so einfach klappen würde.
Debuggen: Es gibt mehrere Wege. Ich würde intern, erstmal einen Buffer aufmachen, da alles ring buffer mässig rein wandeln. Und dann wenn die Spannung runterfällt darauf ein IF condition schreiben und breakpoint hitten. Natürlich musst du den ADC eingang mit ein Testsignal füttern. Am besten wiederholdend damit du easy debuggen kannst. Aus dem Buffer kannst du dir angucken wie das Signal aussieht, und ob du wirklich darauf reagierst worauf du auch reagieren wolltest. Ab dem Punkt wo der Breakpoint gehittet wird, hast ja die Syncronität zum aussenwelt verlohren. Also Es ist halt immer so, dass bei jedem Breakpoint du ein klein wenig anderes Signal hast. Und das auf ein PIC12F. Würde ich mal sagen, das wird dir kein spass machen. Bin unsicher wie debuggbar die sind. Habe die überhaupt genügend PINs zum debuggen? Vielleicht nein, dann musst du natürlich über ein PIN ein UART machen und dir daten rausprinten. Wird nicht einfach.
Mach dein leben nicht schwer, kauf dir etwas was schneller ist. dsPIC oder PIC32.
Vorab, ich habe noch keinen (zB) PIC12(L)F1840
und daher noch nichts wirklich ausprobiert
Warum muß es ein PIC12(L)F1840 oder überhaupt ein PIC12 sein?
Mit einem 12Bit-ADC wäre das Problem ohne jegliche größere Klimmzüge lösbar. Und es gibt Unmassen µC, die über einen solchen verfügen. Warum also nicht einfach einen davon nehmen?
Aber auch mit 10Bit-ADCs wären (relativ) einfache Lösungen möglich, wenn der µC schon Vorverstärker enthält. Sampelt man halt dasselbe Signal auf einem Kanal "as is" und auf einem zweiten vorverstärkt. Es gibt auch etliche µc, bei denen diese Technik möglich wäre. Warum also nicht einfach einen davon nehmen?
Und da du ja den PIC12 noch überhaupt nicht hast, sollte egentlich ja auch nichts dagegen sprechen, gleich was anderes zu kaufen...
wie debugge/teste/verifiziere ich im
Programm dann was ich da messe
Einen PIC mit mehr Beinchen nehmen. An die kann man dann einen
DAC anklemmen, und sich (Zwischen-)resultate auf einem Oszi ansehen.
Oft reichen zur Beurteilung bereits 6 bit...
wie debugge/teste/verifiziere ich im
Programm dann was ich da messe
Einen PIC mit mehr Beinchen nehmen. An die kann man dann einen
DAC anklemmen, und sich (Zwischen-)resultate auf einem Oszi ansehen.
Oft reichen zur Beurteilung bereits 6 bit...
Ich bin Neuling, kannst du das bitte ein wenig mehr ausführen ?
Die Anzahl der Beinchen ist mir egal, der genannte PIC war einer, dessen
Spezifikation ich mir angeschaut habe, um ins Thema hineinzukommen ..
an einem analogen Eingang eine Spannung im Tonfrequenzbereich "messen"
Du misst damit EINE Spannung zum Messzeitpunkt und keine Freq.. Wenn du zusätzlich auch noch den zeitlichen Verlauf(Freq./Signalverlauf) einer Spannung haben willst musst du entsprechend viele Messwerte erfassen und diese dann je nach Wunsch auswerten.
Was sollen deine 1mV sein?
Der niedrigste Wert der im zeitlichen Verlauf auftritt? Bei z.B. einem Sinus von 0 bis Umax wäre das jedesmal wenn sich der Wert innerhalb einer Periode dem Minimum annähert. Das Gesamtsignal wäre aber immer noch Umax/2 im Durchschnitt. 1mV im Durchschnitt? Dann musst du erstmal genügend Messwerte erfassen und daraus den Durchschnitt errechnen. Usw.
Mach dir besser erstmal ein genaueres Bild darüber wie ein ADC überhaupt arbeitet. Dann wie dein Signal überhaupt aussieht und was du davon genau auswerten willst.
der genannte PIC war einer, dessen
Spezifikation ich mir angeschaut habe
Mit dieser Methode der Auswahl wirst du nicht weit kommen.
Dann schau dir halt noch den (z.B.) 16F887 an.
Oft reichen zur Beurteilung bereits 6 bit...
Ich bin Neuling, kannst du das bitte ein wenig mehr ausführen ?
6 bit enspricht 64 unterscheidbaren Signalpegeln.
Das reicht, um eine Uebersteuerung oder grundsaetzliche Fehler
in Algorithmen zu erkennen. Mehr kann man auf den ueblichen
Oszis ohnehin kaum erkennen.
Hallo
ich würde auch einen anderen, größeren/neueren PIC empfehlen. Wenn du so wenig Speicher hast, kannst du oft nicht mal Befehle aus der Bibliothek wie sprintf (auch zu debug-Zwecken geeignet) verwenden, da dann der Speicher voll ist.
Du misst damit EINE Spannung zum Messzeitpunkt und keine Freq.. Wenn du
zusätzlich auch noch den zeitlichen Verlauf(Freq./Signalverlauf) einer
Spannung haben willst musst du entsprechend viele Messwerte erfassen und
diese dann je nach Wunsch auswerten.
Was sollen deine 1mV sein?
Der niedrigste Wert der im zeitlichen Verlauf auftritt? Bei z.B. einem
Sinus von 0 bis Umax wäre das jedesmal wenn sich der Wert innerhalb
einer Periode dem Minimum annähert. Das Gesamtsignal wäre aber immer
noch Umax/2 im Durchschnitt. 1mV im Durchschnitt? Dann musst du erstmal
genügend Messwerte erfassen und daraus den Durchschnitt errechnen. Usw.
Mach dir besser erstmal ein genaueres Bild darüber wie ein ADC überhaupt
arbeitet. Dann wie dein Signal überhaupt aussieht und was du davon genau
auswerten willst.
Okay, ich präzessiere.
Das Analogsignal wird vorher gleichgerichtet und mit einem Kondensator geglättet, ich messe also sowas wie den Durchschnitt.
Das Analogsignal wird vorher gleichgerichtet und mit einem Kondensator
geglättet, ich messe also sowas wie den Durchschnitt.
Das hat dann mit "Spannung im Tonfrequenzbereich messen" nicht mehr sehr viel zu tun. Und mit "Das Signal kommt aus einer E-Gitarre und fällt schnell ab" auch nicht.
Welches Problem willst Du jetzt /eigentlich/ lösen? Lass' den ADC, den µC und all' das Geraffel beseite, tritt noch einen Schritt weiter weg und beschreib' ganz grob, was das /eigentliche/ Ziel Deiner Übung sein soll.
Oder ist ein aktiver Spitzenwertgleichrichter sinnvoll anwendbar?
Wenn du da nur ein Noisegate mit MC machen willst, dann geht das damit am besten. Dann muss der PIC nur ab und zu mal eine gleichgerichtete Spannung messen.
In einer Endlosschleife wird fortwährend in zeitlich konstantem Intervall (z. B. 1 msec) das Signal von b) gemessen.
Der Algorithmus zählt die Zeitpunkte, wo das Signal kontinuierlich unter einer Minimalspannung liegt. Nach X Zeitpunkten wird das ursprüngliche Analogsignal gemutet (also quasi ein digitaler Attack).
Damit das Attack variable einstellbar wird, wird ein Poti an einen analog-Eingang angeschlossen und Minimal- und Vollausschlag auf (zb) 1 - 100 msec gemappt. Bei einer Auflösung von 10Bit gibt das eine gute Granularität von
100 µSec
Der gleiche Algorithmus (aber: > Minimalspannung) wird für das Release (Decay) verwendet, auch da mit Poti an analogem Eingang.
Das ist der bis hierhin verfeinerte Plan.
Ihr fragt euch, warum ich den Plan nicht gleich aufgedeckt habe ?
Hier im "digitalTeil" des Forums wollte ich mich eigentlich
nur bzgl. des PICS schlaumachen, daher die Reduzierung auf den AD.
Wie ich das ganze debugge ist mir immer noch nicht klar, aber ihr habt ja schon ein paar Hinweise gegeben.
Ein anderer Grund ist, dass dieses Forum dazu neigt endlos über Nebensächlichkeiten zu diskutieren - das finde ich nicht immer hilfreich (für mich). Nix für ungut, das ist eine Eigenschaft des Forums und ich akzeptiere das dann auch klaglos.
So, da der Plan jetzt bekannt ist, kann ich ja nochmal zum PIC zurück,
was wäre denn eine Empfehlung für einen PIC, braucht der einen AD mit 10 oder mit 12Bit ? Auf jeden Fall benötigt er bisher folgende PINs:
3x analog (analog-Signal vom P-Gleichrichter + 2 x Poti)
Wie ich das ganze debugge ist mir immer noch nicht klar
Wenn man zum debuggen Signale aus dem Pic haben möchte kann man die programmieren und an einem Pin ausgeben - überwachen mit Oszi od. Led od. Terminal....
Weil kein Pin beim 12F1840 mehr frei ist kann man eben vorerst auf eine Ausgabe verzichten (z.B. ein/aus -Led?) die man erst dann hinzufügt wenn sonst alles funktioniert.
10bit od. 12bit? - ist eine Frage der angestrebten Auflösung - in Zusammenhang mit dem vorherigen Signal-Verstärkungsfaktor.
Wie ich das ganze debugge ist mir immer noch nicht klar
Wenn man zum debuggen Signale aus dem Pic haben möchte kann man die
programmieren und an einem Pin ausgeben - überwachen mit Oszi od. Led
od. Terminal....
Weil kein Pin beim 12F1840 mehr frei ist kann man eben vorerst auf eine
Ausgabe verzichten (z.B. ein/aus -Led?) die man erst dann hinzufügt wenn
sonst alles funktioniert.
10bit od. 12bit? - ist eine Frage der angestrebten Auflösung - in
Zusammenhang mit dem vorherigen Signal-Verstärkungsfaktor.
...ein (oder mehrere) Bytes als serielles Signal (RS232) z.B. an einen PC senden. Dort läuft ein Programm (z.B. Realterm) das empfängt und anzeigt.
Ein USB-RS232 (od. USB-UART) -Wandler (Stick) ist erforderlich wenn der PC keine serielle Schnittstelle hat.
Meine Wandlersticks funktionieren auch mit 0V / 3...5V ohne dass die Umwandlung auf ca. +-10V nach rs232-Norm erforderlich ist.
(Aber aufpassen, dass die Polarität dann noch stimmt, weil die entsprechenden Wandler-ICs das Signal invertieren. ..also software anpassen oder mit einem Transistor invertieren.)
...ein (oder mehrere) Bytes als serielles Signal (RS232) z.B. an einen
PC senden. Dort läuft ein Programm (z.B. Realterm) das empfängt und
anzeigt.
Ein USB-RS232 (od. USB-UART) -Wandler (Stick) ist erforderlich wenn der
PC keine serielle Schnittstelle hat.
Meine Wandlersticks funktionieren auch mit 0V / 3...5V ohne dass die
Umwandlung auf ca. +-10V nach rs232-Norm erforderlich ist.
(Aber aufpassen, dass die Polarität dann noch stimmt, weil die
entsprechenden Wandler-ICs das Signal invertieren. ..also software
anpassen oder mit einem Transistor invertieren.)
Okay, da hatte ich die Frage wohl falsch gestellt. Man kann also einen Pin/Output als RS232-Port konfigurieren ?
Man kann also einen Pin/Output als RS232-Port konfigurieren ?
RS232 schon gar nicht - der arbeitet nicht mit passenden Pegeln.
Und was meinst du mit "konfigurieren"?
Jeder freie IO-Pin ist geeignet, um per Software serielle Daten auszugeben. Du musst nur in geeigneter Weise mit dem Pin wackeln, d.h. zur rechten Zeit den rechten Pegel ausgeben.
Man kann also einen
Pin/Output als RS232-Port konfigurieren ?
Wenn eine entsprechende Hardware im µC vorhanden ist dann kann man das verwenden. Aber oft ist diese an bestimmte Pins gebunden.
Mit einem kleinen (Unter-)Programm kann man auch ohne spezielle Hardware ein serielles Signal ausgeben - und auch an jedes beliebige (freies) Ausgangspin.
Beschreibung und asm-softwarebeispiel gibts bei "sprut.de"
(Der Ausgangspegel entspricht aber noch nicht der RS232-Norm. Siehe meine Antwort weiter oben.)
Der PIC12F1840 hat ein EUSART-Modul, also eine universelle serielle Schnittstelle. Das TX-Signal kann man direkt an RX der COM-Schnittstelle eines PC oder eines entsprechenden Adapters anschließen. Beim RX-Signal sollte man noch einen 1kOhm Widerstand in Reihe schalten. Das ist zwar nicht spezifikationsgemäß, aber es funktioniert zuverlässig. Für die Polarität gibt es normalerweise ein Konfigurationsbit, auf die Schnelle habe ich jetzt nur SCKP für das Senden gefunden.
Ein AD-Wandler im PIC12(L)F1840 hat 10Bit-Auflösung
Warum willst Du Dir das Leben maximal schwer machen, die PIC12 sind doch grauslich zu programmieren. Nimm wenigstens einen PIC18 oder höher.
Ich kenne mich besser mit den AVRs aus. Z.B. der ATtiny84 hat am ADC einen zuschaltbaren Verstärker x20. Mit der internen Referenz 1,1V löst man so bis 50µV auf. Und vorzugsweise überläßt man die ganze Rechnerei einem C-Compiler, der AVR-GCC ist ganz brauchbar.
Zur Hardware. Das Signal muß man über einen Kondensator und einen Spannungsteiler nach VREF einkoppeln, so daß es immer im Bereich 0..VREF liegt.
Zur Software. Eine Gitarre erzeugt ja keine hohen Frequenzen. Man läßt einfach den ADC durchlaufen und merkt sich die lokalen Maxima und Minima. Damit hat man dann die momentane Spitzenamplitude. Das Gleichrichten macht also die Software.
Damit entfällt auch die Verzögerung durch den Glättungskondensator eines extra Gleichrichters. Das Ergebnis ist direkt nach einer Halbwelle verfügbar.
Ein AD-Wandler im PIC12(L)F1840 hat 10Bit-Auflösung
Warum willst Du Dir das Leben maximal schwer machen, die PIC12 sind doch
grauslich zu programmieren. Nimm wenigstens einen PIC18 oder höher.
Ich kenne mich besser mit den AVRs aus. Z.B. der ATtiny84 hat am ADC
einen zuschaltbaren Verstärker x20. Mit der internen Referenz 1,1V löst
man so bis 50µV auf. Und vorzugsweise überläßt man die ganze Rechnerei
einem C-Compiler, der AVR-GCC ist ganz brauchbar.
Zur Hardware. Das Signal muß man über einen Kondensator und einen
Spannungsteiler nach VREF einkoppeln, so daß es immer im Bereich 0..VREF
liegt.
Zur Software. Eine Gitarre erzeugt ja keine hohen Frequenzen. Man läßt
einfach den ADC durchlaufen und merkt sich die lokalen Maxima und
Minima. Damit hat man dann die momentane Spitzenamplitude. Das
Gleichrichten macht also die Software.
Damit entfällt auch die Verzögerung durch den Glättungskondensator eines
extra Gleichrichters. Das Ergebnis ist direkt nach einer Halbwelle
verfügbar.
Volltreffer, natürlich, dein Vorschlag ist goldrichtig :-)
Hätte ich selbst drauf kommen sollen, aber manchmal sieht man den Wald ... usw :-(