Forum: Compiler & IDEs ADC messen/vergleichen - Anfängerfrage


von SoN (Gast)


Lesenswert?

Hallo,
ich spiele momentan mit einem CNY-70 zur optischen Erkennung eines 
Zählwerks. Die Messung läuft auf den ADC und wird in einer ISR ständig 
auf eine Variable gelegt.
Nun zur eigentlichen Frage... ich habe folgenden Auswertecode und möchte 
mal jemand mit c-Erfahrung draufschauen lassen, um hier einen 
grundsätzlichen Fehler auszuschließen. Grund ist, dass ich immer mehr 
Impulse messe, wie eigentlich da sind. (ja ich weiss, CNY ist nicht der 
Beste für sowas). Bei meinen Beobachtunen hat der Sensor aber immer die 
richtige Anzahl Impulse geliefert.
hier der code :
1
 uint8_t pu = 0;               // Zähler für Stromimpulse
2
uint8_t signal = 0;             // Signalsteuerung Strom 0= messen AN 1= messen aus
3
uint8_t signalg = 0;            // Signalsteuerung Gas 0= messen AN 1= messen aus
4
5
//Hauptschlfeife
6
// *************
7
    
8
  while(1)
9
  {
10
11
  #if USE_ADC
12
    ANALOG_ON;
13
    
14
    #if CNY70
15
      // Strom
16
      if (var_array[4] < var_array[24])     // var4 enthält ADC-Wert CNY-70 Stromzähler, var 24 Schaltschwelle
17
        {
18
        if (signal ==0)      // nur Flanke zählen
19
          {
20
        pu++;
21
        //lcd_print(1,8,"P:%3i",pu);
22
        signal = 1;
23
          }
24
        }
25
      else signal = 0  ;
26
    
27
      if (pu == 75) {        // 75 Umdr. sind 1kWh
28
        var_array[28]++;      // var 28 Strom in kWh 
29
        pu = 0;
30
          }
31
    
32
      // Gas
33
      if (var_array[5] > var_array[25])     // var5 enthält ADC-Wert CNY-70 Gaszähler, var 25 Schaltschwelle
34
        {
35
        if (signalg ==0)      // nur Flanke zählen
36
          {
37
          var_array[27] = var_array[27] + 10; // Gaszähler Liter
38
          signalg = 1;
39
          }
40
        }
41
        else signalg = 0  ;    
42
      
43
      if (var_array[27] >= 999) {
44
        var_array[26]++;      // Gaszähler m3
45
        var_array[27] = 0;  }
46
47
    #endif  //CNY70
48
  
49
  #endif //USE_ADC

Danke

von Karl H. (kbuchegg)


Lesenswert?

SoN wrote:
> Hallo,

> Nun zur eigentlichen Frage... ich habe folgenden Auswertecode und möchte
> mal jemand mit c-Erfahrung draufschauen lassen, um hier einen
> grundsätzlichen Fehler auszuschließen. Grund ist, dass ich immer mehr
> Impulse messe, wie eigentlich da sind.

Dein Problem wird sein, dass der ADC durch rauschen bzw. sonstige 
Einflüsse keinen konstanten Wert liefert, selbst wenn der CNY nicht 
angeschlossen ist. Wenn nun das ADC Signal ständig ein klein wenig rund 
um die Schaltschwelle pendelt, dann zählst du jedesmal eine Flanke.
Was du brauchst ist eine Hysterese.
Beim Anstieg des ADC zählst du die Flankenerkennung erst dann, wenn eine 
Schaltschwelle überschritten wird. Aber beim Absinken des ADC Werts, 
sollte der Mechanismus erst dann wieder scharf geschaltet werden, wenn 
die Schaltschwelle deutlich unterschritten wurde.

von SoN (Gast)


Lesenswert?

Vielen Dank für den Hinweis.
Ein erster Test verspricht Erfolg!
gruss
SoN

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.