ADE7753 SPI-Problem

Gast #3260768
Lesenswert?

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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren