Forum: Mikrocontroller und Digitale Elektronik Atmega8: Array mit AD-Wandler befüllen


von Tom (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Kai G. (runtimeterror)


Lesenswert?

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

von Tom (Gast)


Lesenswert?

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ß

von Karl H. (kbuchegg)


Lesenswert?

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.

von Tom (Gast)


Lesenswert?

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ß

von Karl H. (kbuchegg)


Lesenswert?

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.

von Tom (Gast)


Lesenswert?

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

von Jonny O. (-geo-)


Lesenswert?

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

von Wasweissich (Gast)


Lesenswert?

>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.

von Michael F. (jiro)


Lesenswert?

den Gleichspannungs Offset läst dich mit einem kondensator rausfiltern 
dann haste nur noch die Spannungsschwankungen

von Michael F. (jiro)


Lesenswert?

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.

von Wasweissich (Gast)


Lesenswert?

@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.

von Michael F. (jiro)


Lesenswert?

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

von Wasweissich (Gast)


Lesenswert?

@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.

von Fly (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Wasweissich (Gast)


Lesenswert?

@Fly
>absolut Offsetunabhängig
Das wäre ja absolut sinnlos. Er will ja gerade den Offset herausfinden.

von Michael F. (jiro)


Lesenswert?

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

von Wasweissich (Gast)


Lesenswert?

@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

von Fly (Gast)


Lesenswert?

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 :)

von Wasweissich (Gast)


Lesenswert?

@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.

von Waswiessich (Gast)


Lesenswert?

@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....

von Fly (Gast)


Lesenswert?

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...

von Wasweissich (Gast)


Lesenswert?

@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?

von Michael F. (jiro)


Lesenswert?

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

von Wasweissich (Gast)


Lesenswert?

@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.

von Wasweissich (Gast)


Lesenswert?

@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.

von Tom (Gast)


Lesenswert?

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.

von Wasweissich (Gast)


Lesenswert?

>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;

von Karl H. (kbuchegg)


Lesenswert?

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
}

von Wasweissich (Gast)


Lesenswert?

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