Forum: Mikrocontroller und Digitale Elektronik ADC Wert abfragen


von perceiver (Gast)


Lesenswert?

Tach,

ich habe die Möglichkeit einen ADC Wert kontinuierlich abzufragen. 
Dieser schwankt um einige Bits. Ich würde gerne wenn dieser sich um eine 
bestimmte Prozentzahl ändert (beispielsweise 10%) etwas bestimmtes 
ausführen und ansonsten nicht. Meine C++ Kenntnisse halten sich noch in 
Grenzen und ich kann das Problem nicht richtig greifen, weiß aber, dass 
es vermutlich einfach umzusetzten ist.
1
int readADC()
2
{...}
3
int alterwert_adc;
4
5
int main()
6
...
7
while(1)
8
{
9
alterwert_adc = readADC();
10
if(readADC() > alterwert_adc)
11
arbeite_fkt_ab();
12
13
14
15
}

So in etwa stelle ich mir das vor. Wie fragt man einen sich ändernden 
ADC Wert in der Regel ab?

von Ingo (Gast)


Lesenswert?

Indem man sich selber fragt, in welchem Bereich sich das Signal zwischen 
zwei Messungen ändern darf. Alles was darüber hinaus geht, positiv oder 
negativ löst dann eine Reaktion aus.

Was willst du denn messen?

von Thomas E. (thomase)


Lesenswert?

perceiver schrieb:
> alterwert_adc = readADC();
> if(readADC() > alterwert_adc)
> arbeite_fkt_ab();

Damit fragst du nur ab, ob der Wert grösser geworden ist. Und das auch 
noch falsch. Wenn der Wert kleiner wird, passiert solange nichts, bis er 
wieder ansteigt. Kann ja so gewollt sein. Aber...

perceiver schrieb:
> So in etwa stelle ich mir das vor. Wie fragt man einen sich ändernden
> ADC Wert in der Regel ab?

Durch Mittelwertbildung über ausreichend viele Werte.

mfg.

von PittyJ (Gast)


Lesenswert?

10 Prozent Änderung ist selten. Dazu muss man auch die Zeit betrachten. 
Wenn es um 10 Prozent in einer Sekunde ansteigt, dann hat man doch 100 
Messungen dazwischen, in denen der Wert nur um 1 Promille steigt.
Da muss man also etwas mehr Gehirnschmalz in den Algorithmus stecken. 
Ein bißchen Programmieren ist also nötig.

von Thomas E. (thomase)


Lesenswert?

perceiver schrieb:
> So in etwa stelle ich mir das vor. Wie fragt man einen sich ändernden
> ADC Wert in der Regel ab?

Grundsätzlich ändert sich der Wert immer. Sonst bräuchte man ihn gar 
nicht abfragen. Das Flattern auf den unteren beiden Bits, bekommt man 
per Software durch Mittelwertbildung weg.

Aber auch die Hardware tut ihr übriges dazu. Häufig ist auch die 
ADC-Taktrate zu hoch.

Zeig deinen Schaltplan und dein Programm. Sonst ist das alles nur 
Raterei.

mfg.

von Thomas H. (Firma: CIA) (apostel13)


Lesenswert?

Delta zwischen Altwert und aktuellem Wert bilden und dann dieses Delta 
auf die Größe prüfen. Dabei berücksichtigen in welcher Zeitspanne dt 
sich dein zu messendes System um dein gesuchtes dADC ändern kann. Sind 
extrem schnelle Änderungen nicht zu erwarten musst Du dein Messintervall 
anpassen, ansonsten wirst Du nie eine Änderung feststellen. Sinnvoller 
wWeise einen counter oder Timer für die Intervalle der Abfragen  nutzen.

von perceiver (Gast)


Lesenswert?

Thomas Holmes schrieb:
> Delta zwischen Altwert und aktuellem Wert bilden und dann dieses Delta
> auf die Größe prüfen. Dabei berücksichtigen in welcher Zeitspanne dt
> sich dein zu messendes System um dein gesuchtes dADC ändern kann. Sind
> extrem schnelle Änderungen nicht zu erwarten musst Du dein Messintervall
> anpassen, ansonsten wirst Du nie eine Änderung feststellen. Sinnvoller
> wWeise einen counter oder Timer für die Intervalle der Abfragen  nutzen.

Danke dies hilft mir schon einmal enorm:
1
int readADC()
2
{...}
3
int alterwert_adc;
4
int neuerwert_adc;
5
int Delta;
6
7
int main()
8
...
9
while(1)
10
{
11
alterwert_adc = readADC();
12
13
warte_2s(); // Mit Counter oder Timer realisieren
14
15
neuerwert_adc = readADC();
16
Delta = neuerwert_adc - alterwert_adc;
17
18
if(Delta > 0.1* alterwert_adc)
19
fuehre_wasaus();
20
else
21
{Nop();}
22
23
24
}

von Wolfgang A. (Gast)


Lesenswert?

Thomas Holmes schrieb:
> Sind extrem schnelle Änderungen nicht zu erwarten musst Du dein
> Messintervall anpassen, ansonsten wirst Du nie eine Änderung feststellen.

Das wünscht sich mancher - ein ADC, der nicht rauscht. Gewöhnlich wird 
jede Messung von der vorherigen abweichen, egal wie kurz der zeitliche 
Abstand ist. Dazu kommt das Quantisierungsrauschen. Selbst bei einem 
rauschfreien ADC würde sich bei einem langsam ansteigenden 
Eingangssignal über viele Messungen am Ausgangswert nichts ändern, bis 
es dann plötzlich ein Bit höher springt ;-)

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.