Forum: Mikrocontroller und Digitale Elektronik ADE7753 SPI-Problem


von Peter (Gast)


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
}

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.