ADE7753 SPI-Problem

Gast #3260768
Hallo,
ich messe mit einem ADE7753 die Spannung und den Strom an einem 
Verbraucher. Wenn ich beim Nulldurchgang die Spannung auslese passt 
alles perfekt. Die Werte sind sehr konstant und gleichen sich mit dem 
Multimeter.
Sobald ich aber einen zweiten SPI_read einfüge und beim nächsten 
Nulldurchgang den Strom mit auslese, passt gar nichts mehr. Die 
Spannungswerte die vorher nach dem Rechnen bei 29 Volt lagen, liegen 
dann aufeinmal bei 0,5 Volt und die Stromwerte passen auch gar nicht.
Wenn ich dann nur die Stromwerte auslese, sind die Stromwerte zwar 
besser aber ab und an mogeln sich "Stromspitzen" dazwischen. So bekomme 
ich z.b. immer den Wert 9 ausgegeben und auf einmal dazwischen den Wert 
17 - 13 bis dann wieder die 9 da ist. Man könnte also glauben, dass das 
zweite Spi_Read irgendwelche Probleme mit sich bringt.
Aber wo liegt der Fehler?

1
#include "SPI.h"
2
 
3
int ss=10;
4
int Null;
5
int x;
6
int v = 0;
7
float Spannung;
8
float Strom;
9

10
void setup(){
11
  pinMode(ss, OUTPUT);
12
  
13
  SPI.setDataMode(SPI_MODE2);
14
  SPI.setClockDivider(SPI_CLOCK_DIV32);
15
  SPI.setBitOrder(MSBFIRST);
16
  SPI.begin();
17
  Serial.begin(9600);
18
}
19

20
void Nulldurchgang()
21
{
22
  Null = 1;
23
}
24
  
25
void loop()
26
{
27
      
28
      attachInterrupt (0, Nulldurchgang, CHANGE);
29
      if (Null == 1 && x == 0)
30
      {
31
        Spannung += spi_read(0x17);
32
        Null = 0;
33
        v++;
34
        x = 1;
35
      }
36
      if (Null == 1 && x == 1)
37
      {
38
        Strom += spi_read(0x16);
39
        Null = 0;
40
        v++;
41
        x = 0;
42
      }
43
      if (v == 10)
44
      {
45
        Strom /= 5;
46
        Strom /= 5000;
47
        Spannung /= 5;
48
        Spannung /= 51672;
49
        v=0;
50
        Serial.print("Strom: ");
51
        Serial.println(Strom);
52
        Serial.print("Spannung: ");
53
        Serial.println(Spannung);
54
        Spannung = 0;
55
        Strom = 0;
56
      }
57
}
58

59
unsigned long spi_read ( char read_command ) {
60
digitalWrite (ss,LOW);
61
unsigned char b2,b1,b0;
62
delayMicroseconds(25);
63
SPI.transfer (read_command);
64
delayMicroseconds(5);
65
b2 = SPI.transfer(0x00);
66
delayMicroseconds(5);
67
b1 = SPI.transfer(0x00);
68
delayMicroseconds(5);
69
b0 = SPI.transfer(0x00);
70
delayMicroseconds(5);
71
digitalWrite (ss,HIGH);
72
return (unsigned long) b2<<16 | (unsigned long) b1<<8 | (unsigned long) b0;
73
}

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 13 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.