www.mikrocontroller.net

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


Autor: Stefan Birrer (blaze1985)
Datum:

Bewertung
0 lesenswert
nicht 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
/************************************************************************/
/*Teste entprellen*/

unsigned char Taste_S2()
{
  unsigned char i;
  unsigned char taste = 0;

  for (i=0; i<200; i++)
  {
    ClrWdt();                // Watchdog Reset
    taste = PORTAbits.RA4;          // Taste einlesen
    
    if(taste != taste_entprellt)      // Stimmt neuer Wert mit dem letzten überein?
    {  
      taste_entprellt = taste;      // Kopieren
      i= 0;                // Mit der Entprellung neu beginnen
    }
  }
  return taste_entprellt;            // Zurück mit der entprellten Taste
}

/************************************************************************/
/*AD Wandler entprellen*/

void ReadAD()
{
  unsigned char i;  
  ConvertADC();                     // Start conversion
  while( BusyADC() );               // Wait for completion

  for (i=0; i<100; i++)
  {
    ClrWdt();                // Watchdog Reset    
    AD_Wert = ReadADC();             // Read result

    if(AD_Wert != AD_Wert_entprellt)    // Stimmt neuer Wert mit dem letzten überein?
    {  
      AD_Wert_entprellt = AD_Wert;    // Kopieren
      i= 0;                // Mit der Entprellung neu beginnen
    }
  }
}


Autor: Walter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan Birrer (blaze1985)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Walter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Stefan Birrer (blaze1985)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Stefan Birrer (blaze1985)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Meine Idee:

Ich möchte Neigungen anzeigen, bin aber immer noch fleissig am Lernen..
void Grad()
{
  if (AD_Wert < 7000)
    Momentan_Grad = -6;
  
  if (AD_Wert > 7001 && AD_Wert < 8000)
    Momentan_Grad = -5;

  if (AD_Wert > 8001 && AD_Wert < 9000)
    Momentan_Grad = -4;

  if (AD_Wert > 9001 && AD_Wert < 10000)
    Momentan_Grad = -3;

  if (AD_Wert > 10001 && AD_Wert < 11000)
    Momentan_Grad = -2;

  if (AD_Wert > 11001 && AD_Wert < 12000)
    Momentan_Grad = -1;

  if (AD_Wert > 12001 && AD_Wert < 13000)
    Momentan_Grad = 0;

  if (AD_Wert > 13001 && AD_Wert < 14000)
    Momentan_Grad = 1;

  if (AD_Wert > 14001 && AD_Wert < 15000)
    Momentan_Grad = 2;

  if (AD_Wert > 15001 && AD_Wert < 16000)
    Momentan_Grad = 3;

  if (AD_Wert > 16001 && AD_Wert < 17000)
    Momentan_Grad = 4;

  if (AD_Wert > 17001 && AD_Wert < 18000)
    Momentan_Grad = 5;

  if (AD_Wert > 18001)
    Momentan_Grad = 6;
  
}

Autor: Micha H. (mlh) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefan Birrer schrieb:
> möchte ich die picks ausfiltern

Wer oder was ist ein "pick"?

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Und wie könnte ich das Problem lösen???

Die Messungen aufaddieren und dann durch die Anzahl
Messungen teilen.

Autor: Stefan Birrer (blaze1985)
Datum:

Bewertung
0 lesenswert
nicht 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 :-)

Autor: Magnetus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Magnetus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
By the way:  Es schreibt sich Peak und wird als "Piek" ausgesprochen.

Autor: Stefan Birrer (blaze1985)
Datum:

Bewertung
0 lesenswert
nicht 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??

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du könntest der ReadAD einen Rückgabewert mitgeben, der zeigt, ob die 
Messung im Spannungsbereich für -20° bis +20° Neigung war:

// Willkürliche Werte, weil Datenblatt nicht vorhanden
#define ULIMIT  1234
#define OLIMIT 23456
#define ANZAHL_VERSUCHE 42

unsigned char ReadAD(void)
{
  unsigned int summe = 0;
  unsigned int mittel = 0;
  unsigned char versuche = ANZAHL_VERSUCHE;

  do
  {
    versuche -= 1;
    ConvertADC();            // Start conversion
    while( BusyADC() );      // Wait for completion
    ClrWdt();                // Watchdog Reset    
    summe += ReadADC();      // Read result
    mittel = summe / (ANZAHL_VERSUCHE - versuche);
  } while ( versuche && ((mittel < ULIMIT) || (mittel > OLIMIT)) );

  if ( versuche )
    AD_Wert = mittel;  
 
  return versuche;
}

Testanwendung:
#include ...

unsigned int AD_Wert;
char Momentan_Grad;

int main(void)
{
  while(1)
  {
    if( ReadAD() )      // Nur wenn AD_Wert innerhalb +-20°
    {
       Grad();          // AD_Wert in Momentan_Grad umrechnen
       Grad_anzeigen(); // und Momentan_Grad anzeigen
    }
  }
}

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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und über diese Geschichte
 if (AD_Wert > 7001 && AD_Wert < 8000)
    Momentan_Grad = -5;

  if (AD_Wert > 8001 && AD_Wert < 9000)
    Momentan_Grad = -4;

  if (AD_Wert > 9001 && AD_Wert < 10000)
    Momentan_Grad = -3;

  if (AD_Wert > 10001 && AD_Wert < 11000)
 ...

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.

Autor: Stefan Birrer (blaze1985)
Datum:

Bewertung
0 lesenswert
nicht 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...
 if (AD_Wert > 7001 && AD_Wert < 8000)
    Momentan_Grad = -5;

Hättest Du eine Bessere Variante??

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.