- 3D-Druck Einstieg und Tipps         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 17 von 17

Thema: Projekt: Stromzähler optisch auslesen mit Leistungsmessung

  1. #11
    Neuer Benutzer Öfters hier
    Registriert seit
    12.02.2004
    Beiträge
    14
    Anzeige

    Praxistest und DIY Projekte
    So, ich habe die Hardware soweit am laufen...

    Zwei CNY70 auf den ADC gelegt. Bei silberner Scheibe habe ich einen Wert zwischen 0 - 7, bei der roten markierung habe ich einen wert >15 .

    Code:
    'Emon.bas
    'Energiemonitor für Strom, Gas und Wasser
    'Sensor für Strom: 2 CNY70 am AD-Wandler
    'Sensor für Gas und Wasser  Kontakte an Portpins
    
    'v0.1 16.01.2010 - Test der Analogen Eingänge, Debug über RS232
    
    
    $regfile = "m8def.dat"
    $crystal = 8000000
    $baud = 9600
    
    
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , E = Portb.5 , Rs = Portb.4
    Config Lcdbus = 4
    
    Config Timer1 = Timer , Prescale = 256    'Konfiguriere Timer1
    Enable Timer1                             'schalte den Timer1 ein
    On Timer1 Isr_von_timer1                  'verzweige bei Timer1 überlauf zu   Isr_von_Timer1
    Enable Interrupts
    Timer1 = 34285                            'Timer1 soll schon von 34285 wegzählen
    
    
    Config Adc = Single , Prescaler = Auto
    Start Adc
    
    
    Dim W1 As Word , W2 As Word , Diff As Word , Channel As Byte , Mark As Bit , Time As Word , Count As Word , Count2 As Word,
    Dim Flanke1 As Bit , Flanke2 As Bit , Flanke3 As Bit
    Dim Sek As Word , Sek_alt As Word , Sek_delta As Word
    
    
    
    Channel = 0                                                 'Startkanal für ADC
    
    Do
      W1 = Getadc(0)
      W2 = Getadc(1)
      Diff = W2 - W1
      Print "Kanal1: " ; W1 ; "Kanal2: " ; W2 ; "Differenz: " ; Diff
      Cls
      Locate 1 , 1
      Lcd "Diff.:" ; Diff
    
      If Diff > 15 Then
          Mark = 1
          Locate 2 , 1
          Lcd "---OOO---"
          Else
          Mark = 0
      End If
    
      If Mark = 0 Then
    
       Sek = Count
       Elseif Mark = 1 Then
          Sek_alt = Count
          Sek_delta = Sek - Sek_alt
          End If
    
      Locate 2 , 10
      Lcd "sek: " ; Sek_delta
    
    
      Waitms 100
    Loop
    End
    
    
    Isr_von_timer1:                            'ISR von Timer1
    Timer1 = 34285                             'Timer1 soll wieder von 34285 wegzählen
    Incr Count
    Toggle Flanke1
    Return
    Hier mal der Code bis jetzt. Was ich nicht ganz verstehe ist wie ich die Zeit messe zwischen dem Erscheinen der roten Markierung.

    Ich müsste wenn die Markierung kommt den Zählerstand speichern, und wenn die Markierung erneut erscheint die Differenz zum Aktuellen Zählerstand ermitteln und Wieder neu starten...

    Aber ich weiss nicht wie?

    Irgenwas mit flankenerkennung, hat jemand einen Tip?

  2. #12
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.01.2007
    Ort
    Göttingen
    Beiträge
    706
    Irgenwas mit flankenerkennung, hat jemand einen Tip?
    Geradezu prädestiniert hierfür wäre der Analog-Komparator anstelle des Analog-Digital-Konverters. Dieser Komparator hat zwei Eingänge: AIN0 und AIN1. Je nachdem an welchem Eingang die angelegte Spannung größer ist, ist sein Ausgang 1 oder 0. Im Laufe einer kompletten Umdrehung hättest Du also eine HL- und eine LH-Flanke. Und das beste daran ist, dass Du einen Interrupt von der steigenden, der fallenden oder von beiden Flanken auslösen lassen kannst. In Deinem Fall wäre natürlich nur eine von beiden sinnvoll, wobei es egal sein dürfte ob steigend oder fallend.

    Das drumherum würde ich ganz ähnlich machen wie in Deinem Ansatz:

    1. Alle 1 Sek. wird eine Variable in der Timer1-ISR hochgezählt.
    2. In der ISR vom AD-Komparator wird einfach nur ein Flag gesetzt.
    3. In der Hauptschleife wird das Flag abgefragt. Ist es 1, wird aus der Variablen (= vergangene Zeit) nach Deiner Formel die momentan entnommene Leistung errechnet, zur Gesamtenergie 0,0133 kWh addiert, und die Variable sowie das Flag auf 0 gesetzt.

    Alle Infos zum Analog-Komparator gibt´s ab Seite 193 im Datenblatt des Mega8!

  3. #13
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Mit dem Analogkomperator könnte man es ganz gut machen, wenn es um schnelle Signale geht. Bei so langsamen Sachen geht der AD wandler besser. Da kann man wenn nötig noch ein entprellen in Software machen.

    Statt 2 Lichtschranken, wäre ein mit einer schaltbaren LED besser gewesen. Die Differenz wäre dann ziwschen LED an und LED aus. So sollte es aber auch gehen.

    Die Flankenerkennung in Software geht etwa so:
    1) neuen Wert von der Lichtschranke einlesen
    2) Testen ob man als neuen Wert rot, und als alten Silber hat,
    dann hat man eine Flanke. Entsprenchend die Differenz bilden und Zeit für die nächste Flanke merken.
    3) den Wert als alten Wert speichern

    Wenn man im Programm noch was anderes zu tun hat, könnte man den AD wandler theoretisch in der timer ISR starten und dann in der AD-Wandler ISR auswerten. Allerdings muß man dann den AD-Wandler Direkt über die Register auslesen. Die Auswertung könnte so aber komplett in ISRs verschoben werden, ohne das man da warten muß. Das einzig schwere (weil etwas unübersichtlich) wird eventuell sein die verschiedenen AD Messungen auseinander zu halten.

    Beim Timer sollte man besser die Hardware zum Einstellen der Periode nutzen. Das wird etwas genauer, ist aber hier nicht unbedingt nötig.

  4. #14
    Neuer Benutzer Öfters hier
    Registriert seit
    12.02.2004
    Beiträge
    14
    So - nachdem ich das Brett vor meinem Kopf demontiert habe, klappt auch die Flankenauswertung.

    Jetzt muss ich noch die Zeitmessung machen, aber das sollte das kleinere problem sein.


    Danke euch für die Hilfe... Ich komme bestimmt nochmal darauf zurück wenn es an das Feintuning gehrt...



    Code:
    'Emon.bas
    'Energiemonitor für Strom, Gas und Wasser
    'Sensor für Strom: 2 CNY70 am AD-Wandler
    'Sensor für Gas und Wasser  Kontakte an Portpins
    
    'v0.1 16.01.2010 - Test der Analogen Eingänge, Debug über RS232
    
    
    $regfile = "m8def.dat"
    $crystal = 8000000
    $baud = 9600
    
    'LCD Display konfigurieren
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , E = Portb.5 , Rs = Portb.4
    Config Lcdbus = 4
    
    
    'Timer 1 konfigurieren
    'Wert für Timervorgabe
    'Timer läuft bei 34286  alle 1 sek über
    Const Timervorgabe = 34286
    Config Timer1 = Timer , Prescale = 64
    Enable Timer1
    On Timer1 Isr_von_timer1
    Enable Interrupts
    'Timer1 Startwert
    Timer1 = 34286
    
    'AD-Wandler konfigurieren
    Config Adc = Single , Prescaler = Auto
    Start Adc
    
    
    'Variablen deklarieren
    Dim W1 As Word , W2 As Word , Diff As Word , Mark As Bit , Count As Word , Count2 As Word , Schwelle As Word
    Dim Flanke As Bit , Flanke_old As Bit
    Dim Sekunden As Word , Sekunden_alt As Word , Sekunden_delta As Word
    
    
    'Schwellwert zur Erkennung der Markierung
    'Bei Silber ist die Differenz 0...8
    'Bei Rot (Markierung) ist die Differenz < 15
    Schwelle = 15
    
    
    
    'Init für Flankenerkennung und Zeitmessung
    Flanke_old = 0
    Sekunden_alt = 0
    
    'Hauptschleife
    Do
    'ADC-Messwerte holen
       W1 = Getadc(0)
       W2 = Getadc(1)
    'Differenzwert bilden
       Diff = W2 - W1
    
    'Durchlauf der roten Markierung erkennen
       If Diff > Schwelle Then
          Mark = 1
          Elseif Diff < Schwelle Then
          Mark = 0
          End If
    
    'Flankenauswertung
       Flanke = Mark
       If Flanke <> Flanke_old Then
          Flanke_old = Flanke
          If Flanke = 1 Then
             Incr Count2
    
             'Messung der Umdrehungszeit
             Sekunden = Count - Sekunden_alt
             Sekunden_alt = Count
    
             End If
       End If
    
    'DEBUG-Ausgabe über RS232
       Print ";Kanal1:" ; W1 ; ";Kanal2:" ; W2 ; ";Differenz:" ; Diff ; ";Flanke:" ; Count2 ; ; ";Count" ; Count ; ";Time:" ; Sekunden
    
    'DEBUG-Ausgabe über LCD
       Cls
       Locate 1 , 1
       Lcd "Diff.:" ; Diff
       Locate 2 , 1
       Lcd "Count.:" ; Count2
       Locate 2 , 12
       Lcd "s" ; Sekunden
       Waitms 250
    Loop
    End
    
    
    Isr_von_timer1:                                             'ISR von Timer1
       Timer1 = 34286                                           'Timer1 soll wieder von 34285 wegzählen
       Incr Count
       Return

  5. #15
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.01.2006
    Beiträge
    4.555
    Hmm, ich habe gerade mal meinen Stromzähler angeschaut.
    der hat na ner sich drehenden Scheibe sehr viele kleine Rillen
    welche auch noch Schwarz eingefärbt sind. Möglich das eine
    Lasermouse darauf reagiert? Dann hätte mann einige 100
    Pulse/Umdrehung.

    Gruß Richard

  6. #16
    Neuer Benutzer Öfters hier
    Registriert seit
    12.02.2004
    Beiträge
    14
    Ich habe das Programm jetzt mal einige Tage getestet.

    Läuft soweit sehr gut, nur den Überlauf der count variable muss ich noch abfangen - das gibt sonst komische messwerte.

    Die Auflösung werde ich noch auf 10'tel Sekunden erhöhen, und die Messwerterfassung evtl. in die ADC-ISR verlegen.

    Dann noch die Hardware in ein passendes Hutschienengehäuse reinfrickeln und an den Rechner anbinden.

    Dann noch ein Menü für die Einstellungen von Schwellwert und Zählerkonstante - dann kann ich es schon bald verkaufen


    Achja - Dokumentation muss auch noch gemacht werden...

  7. #17
    Benutzer Stammmitglied
    Registriert seit
    27.05.2007
    Beiträge
    67
    @thoweis
    Bei den Energieversorgern gibt es verschiedene Abrechnungsmodelle, welche bei den Privathaushalten aber keine Rolle spielen. Trotzdem hat sich auf dem Markt ein gewisser Standard, welches die Leistungsermittlung betrifft, festgesetzt.

    Dabei wird nicht die Zeit zwischen den Impulsen zur Leistungsermittlung hergezogen, also nicht mit jeder Umdrehung, sondern über einen Zeitraum von 15 Minuten. Hierdurch wird das ganze einfacher zu handhaben. Die Messperiode beginnt immer mit der vollen Stunde. Auf das kann man aber zuhause auch verzichten

    War nur eine Info als Anregung. Ich werde das Thema demnächst auch angehen. Bei mir wird dann der Zählerstand und die Leistung noch mit einem RFM12 an die Zentrale gefunkt.

    Gruß Eisbaeeer

Seite 2 von 2 ErsteErste 12

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Labornetzteil AliExpress