Forum: Mikrocontroller und Digitale Elektronik Taster & AD-Wandler entprellen


von Stefan B. (blaze1985)


Lesenswert?

Hallo!

Brauche Eure Hilfe.. Komme einfach nicht weiter....

Zuerst habe ich eine entprellung mit einem Taster ausprobiert und danach 
mit einem AD-Wandler, doch irgendwie funktioniert es nicht richtig...

Beim AD-Wandler habe ich einen Neigungssensor angeschlossen und mit dem 
entprellen möchte ich die picks ausfiltern...

Besten Dank für Eure Hilfe

Grüssli
Blaze
1
/************************************************************************/
2
/*Teste entprellen*/
3
4
unsigned char Taste_S2()
5
{
6
  unsigned char i;
7
  unsigned char taste = 0;
8
9
  for (i=0; i<200; i++)
10
  {
11
    ClrWdt();                // Watchdog Reset
12
    taste = PORTAbits.RA4;          // Taste einlesen
13
    
14
    if(taste != taste_entprellt)      // Stimmt neuer Wert mit dem letzten überein?
15
    {  
16
      taste_entprellt = taste;      // Kopieren
17
      i= 0;                // Mit der Entprellung neu beginnen
18
    }
19
  }
20
  return taste_entprellt;            // Zurück mit der entprellten Taste
21
}
22
23
/************************************************************************/
24
/*AD Wandler entprellen*/
25
26
void ReadAD()
27
{
28
  unsigned char i;  
29
  ConvertADC();                     // Start conversion
30
  while( BusyADC() );               // Wait for completion
31
32
  for (i=0; i<100; i++)
33
  {
34
    ClrWdt();                // Watchdog Reset    
35
    AD_Wert = ReadADC();             // Read result
36
37
    if(AD_Wert != AD_Wert_entprellt)    // Stimmt neuer Wert mit dem letzten überein?
38
    {  
39
      AD_Wert_entprellt = AD_Wert;    // Kopieren
40
      i= 0;                // Mit der Entprellung neu beginnen
41
    }
42
  }
43
}

von Walter (Gast)


Lesenswert?

und was funktioniert nicht???????????
und wo ist dein Programm???

200 mal den gleichen AD Wert lesen ohne den Wandler neu zu starten ist 
sowieso Käse,
zum anderen wen du 200 Mal misst wird mit Sicherheit nicht 200x der 
gleche Wert rauskommen

von Stefan B. (blaze1985)


Lesenswert?

Mein Ziel ist ja den AD_Wert träger zu machen, dass er nicht jenden Wert 
auswertet (pick filtern)..

Wie würdest Du das Problem lösen??

Momentan wird garnichts gefiltert.. Egal was ich einstelle gibt er jeden 
wert heraus...

Merci...

von Walter (Gast)


Lesenswert?

>Momentan wird garnichts gefiltert.. Egal was ich einstelle gibt er jeden
>wert heraus...

sag ich doch, du liest 100x den gleichen Wert, der ist natürlich gleich!

von Stefan B. (blaze1985)


Lesenswert?

aha....

Und wie könnte ich das Problem lösen???

Auch wenn ich den "ConvertADC();" in die Schlaufe nehme, wirds nicht 
besser.. nur einbisschen verzögerter...


Danke für deine Hilfe...

von Stefan B. (blaze1985)


Lesenswert?

Meine Idee:

Ich möchte Neigungen anzeigen, bin aber immer noch fleissig am Lernen..
1
void Grad()
2
{
3
  if (AD_Wert < 7000)
4
    Momentan_Grad = -6;
5
  
6
  if (AD_Wert > 7001 && AD_Wert < 8000)
7
    Momentan_Grad = -5;
8
9
  if (AD_Wert > 8001 && AD_Wert < 9000)
10
    Momentan_Grad = -4;
11
12
  if (AD_Wert > 9001 && AD_Wert < 10000)
13
    Momentan_Grad = -3;
14
15
  if (AD_Wert > 10001 && AD_Wert < 11000)
16
    Momentan_Grad = -2;
17
18
  if (AD_Wert > 11001 && AD_Wert < 12000)
19
    Momentan_Grad = -1;
20
21
  if (AD_Wert > 12001 && AD_Wert < 13000)
22
    Momentan_Grad = 0;
23
24
  if (AD_Wert > 13001 && AD_Wert < 14000)
25
    Momentan_Grad = 1;
26
27
  if (AD_Wert > 14001 && AD_Wert < 15000)
28
    Momentan_Grad = 2;
29
30
  if (AD_Wert > 15001 && AD_Wert < 16000)
31
    Momentan_Grad = 3;
32
33
  if (AD_Wert > 16001 && AD_Wert < 17000)
34
    Momentan_Grad = 4;
35
36
  if (AD_Wert > 17001 && AD_Wert < 18000)
37
    Momentan_Grad = 5;
38
39
  if (AD_Wert > 18001)
40
    Momentan_Grad = 6;
41
  
42
}

von Micha H. (mlh) Benutzerseite


Lesenswert?

Stefan Birrer schrieb:
> möchte ich die picks ausfiltern

Wer oder was ist ein "pick"?

von holger (Gast)


Lesenswert?

>Und wie könnte ich das Problem lösen???

Die Messungen aufaddieren und dann durch die Anzahl
Messungen teilen.

von Stefan B. (blaze1985)


Lesenswert?

"pick" = Mein Neigungssensor zeigt von - 90° / + 90° (0.4 - 4.5V), ich 
brauche aber nur +/+ 20°.
Wenn ich Z.B. den Sensor fallen lasse, schlägt der Zeiger aus und 
verfälscht mein Ergebniss..

Sorry kenne den Fachausdruck nicht :-)

von Magnetus (Gast)


Lesenswert?

Stefan Birrer schrieb:
> Wenn ich Z.B. den Sensor fallen lasse, schlägt der Zeiger aus und
> verfälscht mein Ergebniss..
>
> Sorry kenne den Fachausdruck nicht :-)

Stress Test  ;o)

von Magnetus (Gast)


Lesenswert?

By the way:  Es schreibt sich Peak und wird als "Piek" ausgesprochen.

von Stefan B. (blaze1985)


Lesenswert?

:-) gg

Bin immer noch fleissig am Probieren aber, bekomme keine lösung....

Vielen Dank für den Tipp um den Wert zu Addieren... doch ich überblicke 
nicht genau wie ich das Programmieren müsste... Help??

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Du könntest der ReadAD einen Rückgabewert mitgeben, der zeigt, ob die 
Messung im Spannungsbereich für -20° bis +20° Neigung war:
1
// Willkürliche Werte, weil Datenblatt nicht vorhanden
2
#define ULIMIT  1234
3
#define OLIMIT 23456
4
#define ANZAHL_VERSUCHE 42
5
6
unsigned char ReadAD(void)
7
{
8
  unsigned int summe = 0;
9
  unsigned int mittel = 0;
10
  unsigned char versuche = ANZAHL_VERSUCHE;
11
12
  do
13
  {
14
    versuche -= 1;
15
    ConvertADC();            // Start conversion
16
    while( BusyADC() );      // Wait for completion
17
    ClrWdt();                // Watchdog Reset    
18
    summe += ReadADC();      // Read result
19
    mittel = summe / (ANZAHL_VERSUCHE - versuche);
20
  } while ( versuche && ((mittel < ULIMIT) || (mittel > OLIMIT)) );
21
22
  if ( versuche )
23
    AD_Wert = mittel;  
24
 
25
  return versuche;
26
}

Testanwendung:
1
#include ...
2
3
unsigned int AD_Wert;
4
char Momentan_Grad;
5
6
int main(void)
7
{
8
  while(1)
9
  {
10
    if( ReadAD() )      // Nur wenn AD_Wert innerhalb +-20°
11
    {
12
       Grad();          // AD_Wert in Momentan_Grad umrechnen
13
       Grad_anzeigen(); // und Momentan_Grad anzeigen
14
    }
15
  }
16
}

Mir gefällt das mit dem Aufaddieren nicht besonders. Man will doch eher 
den Momentanwert haben und keinen gemittelten Wert oder?

Statt

  unsigned int summe = 0;
  ...
  summe += ReadADC();      // Read result
  mittel = summe / (ANZAHL_VERSUCHE - versuche);

würde man dann

  mittel = ReadADC();      // Read result

schreiben. summe könnte man ganz weglassen.

von Karl H. (kbuchegg)


Lesenswert?

Und über diese Geschichte
1
 if (AD_Wert > 7001 && AD_Wert < 8000)
2
    Momentan_Grad = -5;
3
4
  if (AD_Wert > 8001 && AD_Wert < 9000)
5
    Momentan_Grad = -4;
6
7
  if (AD_Wert > 9001 && AD_Wert < 10000)
8
    Momentan_Grad = -3;
9
10
  if (AD_Wert > 10001 && AD_Wert < 11000)
11
 ...

sollte man auch noch einmal reden

* welches ist eigentlich die Neigung bei einem Messwert von genau 9000?
* für den hier angegebenen Zusammenhang wird dir ja wohl noch eine 
Formel einfallen.

von Stefan B. (blaze1985)


Lesenswert?

Wau vielen Dank für Eure Tipps, hat mir wirklich sehr geholfen...
Jetzt funktioniert es so wie ich es mir vorgestellt habe...

Danke Namensvetter :-)

Betreff diesem Code...
1
 if (AD_Wert > 7001 && AD_Wert < 8000)
2
    Momentan_Grad = -5;

Hättest Du eine Bessere Variante??

hätte es mit der Funktion Case lösen wollen, aber funktionierte nicht 
wirklich....

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.