Hallo zusammen, ich habe eine Fragen an Euch Spezialisten: Ich muss den Mittelwert einer gedämpften Schwingung ermitteln. Die Werte der Kurve reichen von 0V bis +4V und werden vom AD-Wandler eingelesen. Die Periodendauer wird sich im Bereich von 0,5s bis 1s bewegen, also sehr träge. Ich dachte mir folgenden Lösungsansatz aus: Ich möchte das erste Maximum detektieren, dann die "Aufnahme" starten und eine Array mit Werten vom AD-Wandler (in geeigneten Abständen) befüllen. Das Befüllen soll sich erstrecken, bis das nächste Maximum detektiert wurde und somit eine ganze Schwingung im Array liegt. Aus der Anzahl der Werte ließe sich dann eine Halbwelle abgrenzen und daraus wiederum könnte der Mittelwert ermittelt werden. Fragen: - Wie befülle ich sinnvoll das Array? - Wüsste jemand eine unkompliziertere Lösung? Vielen Dank im Voraus. Beste Grüße
Tom wrote: > - Wie befülle ich sinnvoll das Array? Indem du es einfach beschreibst. Du merkst dir in einer Variablen, wo der nächste Messwert hin muss. Liegt ein neuer Wert vor, dann schreibst du ihn an genau diese Stelle, die dir diese Variable vorgibt. Anschliessend die Variable um 1 erhöhen und fertig. > - Wüsste jemand eine unkompliziertere Lösung? Dein Ansatz klingt doch gut. Was ist daran kompliziert? Formuliere das mal etwas besser (in Pseudocode) aus und spiel einfach mal Computer und spiel das ganze mal mit ein paar ausgedachten Werten durch.
Der Ansatz ist auf jeden Fall ok. Was man versuchen könnte ist mittels der ersten Ableitung der Messwerte und der Messwerte selbst die aktuelle Amplitude auszurechnen zu jedem Zeitpunkt auszurechnen. Dann entfällt u.U. das Mitteln. Hängt aber von der Qualität der Messwerte ab. Schöne Grüße Kai
Hallo Kai, danke für Deine schnelle Antwort. Ich befürchte aber, dass ich mit der Ableitung auf Granit beißen würde. Ich benötige ja im Endeffekt den artihmetischen Mittelwert (welcher ja durch ein Integral errechnet würde), diesen aber möglichst schnell, d. h. am besten nach einer Halbwelle. Wenn ich Dich falsch verstanden habe, wäre es nett, wenn Du mich berichtigst. Gruß
Ein völlig anderer Ansatz Du misst nicht von einem Maximum zu nächsten, sondern von einer Nullstelle zur Nächsten. Dadurch kriegst du automatisch nur 1 Halbwelle. Auch brauchst du dir die einzelnen Messwerte auch nicht merken. Für das arithmetische Mittel brauchst du ja nur die Summe der Messwerte und diese Summe kannst du auch gleich nach dem Messen auf den neuesten Stand bringen. Wenn also dein Signal das Vorzeichen wechselt, von Minus nach Plus (dann beginnt die positive Halbwelle), setzt du die Summe auf 0 und addierst anschliessend alle Messwerte solange auf bis die Messwerte wieder von Plus nach Minus wechseln. Dabei die Anzahl der Messungen mitzählen. Ist der Übergang von Plus nach Minus erkannt, dividierst du die Summe durch die Anzahl der Messungen und hast dein arithmetisches Mittel.
Das wäre natürlich super. Es gibt aber leider keinen Nulldurchgang. Der verwendete Sensor liefert nur Werte zwischen 0V und +4V. Zu dem ist jede Messung mit einem anderen Offset behaftet, was den Ansatz schon mal sterben lässt. Außerdem ist es ja gar nicht so ohne weiteres möglich, negative Werte zu wandeln, oder? Gruß
Die negativen Werte waren ja auch mehr bildlich. Wenn du -5V auf einen ADC Wert von 0 abbildest und +5V auf einem ADC Wert von 1023, dann ist deine virtuelle 0-Linie bei 512. Aber wenn du auf dem Signal einen unbekannten Offset hast, dann geht das natürlich nicht.
Den unbekannten Offset gilt es ja zu finden. Ich danke Euch auf alle Fälle. Wenn Probleme auftreten melde ich mich wieder. Danke und beste Grüße aus Bayern
Hallo, einfach für Startvorgang und für Stoppvorgang eine Spannung definieren (4V oder etwas kleiner). Dann ab der Startspannung in regelmäßigen Abständen Wandeln --> in Array schreiben --> Wandeln --> Arrayzeiger++ -->in Array schreiben -->Wandeln--> usw. Das Ganze stoppt wenn die "Stoppspannung" erreicht ist. Anschließend alle Inhalte der Elemente des Arrays aufaddieren und durch die Anzahl der Elemente teilen. Edit: ich sehe grade... OK das mit dem Offset müsste man noch klären. Gruß geo
>Es gibt aber leider keinen Nulldurchgang.
Ich gehe mal davon aus das es aber mindestens einen Wendepunkt geben
wird.
Immer die Steigung zwischen zwei aufeinanderfolgenden Messwerten
vergleichen. Wird die Steigung erst grösser dann kleiner (bzw. erst
kleiner, dann grösser, dann ist in der Mitte der Wendepunkt und der
Offset.
Kommt natürlich auch darauf an wie verrauscht das Ganze ist,
aber im Idealfall geht es damit.
den Gleichspannungs Offset läst dich mit einem kondensator rausfiltern dann haste nur noch die Spannungsschwankungen
Wenn die Frequenz der Wechselspannung nicht allzu groß ist kann man das mit OP´s so machen, das du nur den avr brauchst um den offsetspannungswert einzulesen und auf einem display anzuzeigen.
@Michael >den Gleichspannungs Offset lässt sich mit einem kondensator rausfiltern >dann haste nur noch die Spannungsschwankungen >Wenn die Frequenz der Wechselspannung nicht allzu groß ist kann man das >mit OP´s so machen, das du nur den avr brauchst um den offsetspannungswert >einzulesen und auf einem display anzuzeigen. Klingt in meinen Ohren nicht so gut. Verdoppelt ja das Rauschen mindestens und dann kommt noch das Rauschen von mindestens zwei OPs dazu.
rauschen hat man immer dazu vieleicht noch störungen vom avr oder dem handy vom nachbarn blablabla, ob das entscheidend ist kommt drauf an wie groß die offset spannungen sind die es gilt ausfindig zu machen
@Michael >rauschen hat man immer dazu Das ist zwar richtig, hat aber mit dem vorliegenden Falls nichts zu tun. Denn, wie Du schon richtig sagst, es: >kommt drauf an wie groß die offset spannungen sind die es gilt ausfindig >zu machen Es geht ja darum eine Lösung die nur den ADC vom Atmel verwendet mit einer zu vergleichen, die zusätzlich einen Hochpass und OPs verwendet. Das die zweite also mehr Rauschen erzeugt als die erste liegt doch auf der Hand.
Also ich würde den Offset durch ein C auskoppeln und dann so rechnen wie "der Andere Ansatz" von Karl Heinz. Einfach und zuverlässig, absolut Offsetunabhängig.
Fly wrote: > Also ich würde den Offset durch ein C auskoppeln und dann so rechnen wie > "der Andere Ansatz" von Karl Heinz. Einfach und zuverlässig, absolut > Offsetunabhängig. Nochmal den Thread lesen: Es geht ihm letztend endes um die Bestimmung genau dieser Offsetspannung.
@Fly
>absolut Offsetunabhängig
Das wäre ja absolut sinnlos. Er will ja gerade den Offset herausfinden.
naja mag sein aber ob das kriegsentscheidend ist ! man müßte trotzdem wissen in welchen bereich sich der offset bewegt in dem bereich wo das rauschen entscheident sein dürfte funkt eh alein schon der taktgenerator des avr´s dazwischen
@Michael
>man müßte trotzdem wissen in welchen bereich sich der offset bewegt
Da muss ich Dir, ungern aber trotzdem, zumindest teilweise recht geben.
;-)
Wenn der Offset bei 1kV liegt und das Rauschen von 1mV-Spitze-Spitze auf
100mV verstärkt wird, wäre das wohl weniger wichtig.
Also Tom:
1. Wie gross ist das Rauschen
2. Welche Frequenz?
3. Du sagst abklingende Schwingung. Verändert sich die Frequenz?
Gruss
Oh... Entschuldigung, hab ich überlesen. Ja dann würde ich so vorgehen: Immer zwei ADC Werte "ableiten". Wenn Ableitung "0" --> Up erwischt und merken. Wenn zwei Up erwischt, ist der Offset die halbe Differenz zwischen den beiden Up :)
@Fly >Immer zwei ADC Werte "ableiten". Wenn Ableitung "0" --> Up erwischt und merken. >Wenn zwei Up erwischt, ist der Offset die halbe Differenz zwischen den >beiden Up :) Leider nicht so gut. Du hast "gedämpfte Schwingung" überlesen. D.h. die Hoch- und Tiefpunkte liegen zeitlich nicht symetrisch zum Offset.
@Fly Ich muss zwar einräumen, das meine Methode (Post von 17:49) mit der Bestimmung der Wendepunkte auch diesen Mangel hat, aber durch den geringeren Zeitlichen Abstand der bestimmenden Messpunkte fällt dies weniger ins Gewicht. Andererseits setzt meine Lösung voraus, das es überhaupt einen lokalisierten Wendepunkt gibt, was etwa bei einer Trapezförmigen Schwingung nicht der Fall wäre. Deswegen die Frage nach der Frequenz. Im übrigen spricht, wie mir gerade einfällt, mein Einwand wegen der abklingenden Schwingung zusätzlich gegen die Lösung von Michael. Der Tiefpass müsste ja ein Tau haben, das deutlich über dem Kehrwert der Frequenz liegt, so das der Fehler durch das abklingen hinzukommt. Bei einer stationären Schwingung wäre das was Anderes, da der Mittelwert (Offset) sich ja dann in Ruhe einstellen könnte. Aber so....
Noch ein Versuch :) Um die Dämpfung der Schwingung zu berücksichtigen, könnte man zum Beispiel 10 positive Up feststellen. Nun hat man eine Messreihe des "Amplitudenganges". In dieser Reihe (welche exponentiell Abklingt), A(t) = Ao * e^(-c*t) gilt es nund die Abklingkonstante c zu berechnen. Wenn man die hat, kann man das "unsymmetrische" korrigieren...
@Fly Scheint Sinn zu machen. Finde meine Lösung aber einfacher. Weniger Rechenaufwand. Weniger Ungenau. Man müsste mehr über das Signal und seine Entstehung wissen. Tooommm. Liest Du noch mit?
also nen offset ist für mich eine gleichspannung, verändert sich der offset ständig ist es kein offset sondern ne 2te wechselspannung, der offset läst sich rausfiltern so das nach dem c nur noch die wechselspannung ist, danach ist es nur noch plus und minus rechnen u vor dem c + oder - nach dem c = offset und plus und minus das kann nen op :P
@Michael
Bitte verzeih', aber ich habe garnicht behauptet das.
>verändert sich der offset ständig
Der Offset ändert sich ja nicht, sondern die überlagerte
Wechselspannung.
Genauer deren Minimal und Maximalwert. Das ist es ja was "abklingende
Schwingung" aussagt.
Mit dem Tau des Tiefpasses, den Dein C bildet, hat das nichts zu tun.
Der Tiefpass muss zusätzlich als Verzögerungselement gesehen werden. Er
bewirkt eine Phasenverschiebung, so das Du von dem Signal nicht den
momentanen Wert sondern einen älteren abziehst.
Ausserdem, wenn man mal die Phasenverschiebung ausser acht liesse,
muesste die Dämpfung der Schwingung durch den Tiefpass durch einen
Multiplizierer berücksichtigt werden. Ist also ein zweiter OP.
@Michael Da muss ich mich leider selbst korrigieren. Der C bildet ja einen Hochpass und nicht einen Tiefpasse. Das Tau spielt auch nicht die Rolle. Frequenzmäßig muessen ja eher hohe als tiefe Frequenzen durch. Das Tau kann also beliebig klein sein. Die Effekte wegen der Verschiebung sind damit kleiner als ich ursprünglich meinte. Ich meine dennoch, das wegen der zusätzlichen Bauteile und dem Rauschen die rechnerische Lösung mit den Wendepunkten effektiver ist. Aber wir sind da wahrscheinlich an einem Punkt wo man mehr über die Signale wissen müsste. Leider hat sich Tom ja nicht mehr gemeldet.
Hallo Kollegen, nochmals zur Erklärung: Es geht um eine gedämpfte Sinusschwingung im Bereich von 0,2Hz bis max 1Hz. Also Hardwaremäßig sehr schwer zu realisieren. Könntet Ihr mir noch kurz weiterhelfen: Mir ist es zwar furchtbar peinlich, aber schreibt mir mal bitte den C-Code um ein Array mit unbekannt vielen Werten zu befüllen. Mit Deklaration des Arrays und kurzem Code, "Einlesen" - "Ablegen" - "Inkrementieren" - "Einlesen"... Ich bin ein wenig eingerostet. Danke.
>Also Hardwaremäßig sehr schwer zu realisieren.
Wieso? Wir haben hier schon mehrere Lösungen skizziert. Was gefällt Dir
daran nicht?
Du brauchst auch die ganze Array-Lösung nicht.
Bitte beantworte auch noch folgende Fragen:
1. Wie gross ist das Rauschen. Frequenzbereich
2. Welche Frequenz?
3. Du sagst abklingende Schwingung. Verändert sich die Frequenz?
4. Wie wird die Schwingung erzeugt?
Gruss
P.S Ein Array zu fuellen ist nun wirklich trivial.
array[i] = wert;
Wasweissich wrote: > P.S Ein Array zu fuellen ist nun wirklich trivial. > > array[i] = wert; Haaerig ist nur diese Aussage: > um ein Array mit unbekannt vielen Werten zu befüllen. ********* Da gibt es jetzt 2 Möglichkeiten * du stellst dich der Herausforderung und schreibst dir ein Modul, welches ein Array zur Laufzeit nach Bedarf vergrößert * du schraubst deine Anforderung zurück und ersetzt das 'unbekannt' durch: 'beliebig viele, aber weniger als zb. 200' ziehst also eine Obergrenze für die maximal mögliche Anzahl an Werten ein. Anzumerken bleibt nur, dass Variante 1 (dynamisch vergrößern) einiges an nichttrivialem Aufwand bedeutet. Im Hinblick auf deine Array- schwierigkeiten solltest du fürs Erste davon Abstand nehmen. > Ich bin ein wenig eingerostet. Wenns an der Arraysyntax scheitert, dann ist 'eingerostet' das falsche Wort. In dem Fall ist nämlich das Studium eines Grundlagenbuches angebracht.
1 | #define MAX_SIZE 200
|
2 | |
3 | int NrEntries; |
4 | int Entries[MAX_SIZE]; |
5 | |
6 | void add( int Value ) |
7 | {
|
8 | if( NrEntries < MAX_SIZE ) { |
9 | Entries[NrEntries] = Value; |
10 | NrEntries++; |
11 | }
|
12 | }
|
>Wenns an der Arraysyntax scheitert, dann ist 'eingerostet' das falsche >Wort. In dem Fall ist nämlich das Studium eines Grundlagenbuches >angebracht. Das ist mir dann nachher auch noch durch den Kopf gegangen. 'Ne AD-Wandlung programmieren können, aber keine Arrays füllen ist auch schon fast wieder ne Kunst. ;-) Und jetzt mal anders gedacht. Die eine Lösung (zufällig von mir) braucht nichtmal ein Array (wenn man zwei Werte nicht im Array speichern will). Du brauchst eigentlich nur den AD-Wandler vom Atmel. Warum nicht das nehmen. Dann kannst Du den Rost auch noch anbehalten. Du müsstest halt mal was über die Schwingung erzählen. Dann könnte man beurteilen ob das geht. Aber was red ich. Mach's halt mit 'nem Array! Wat dem eenen sin Ul,....
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.