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 | }
|