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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.