Создание блока ade7758 (монитор напряжения 3-фазной сети)

Создаем свой блок. Вопросы, помощь знатоков.
Ответить
dstrufanov
Рядовой
Сообщения: 2
Зарегистрирован: 07.01.2024{, 12:43}
Репутация: 0
Имя: Дмитрий

Создание блока ade7758 (монитор напряжения 3-фазной сети)

#1

Сообщение dstrufanov » 07.01.2024{, 13:06}

Здравствуйте!
Скачал библиотеку с гитхаба https://github.com/engkan2kit/ADE7758 и поместил ее в раздел библиотек, создал блок с тремя выходами (фазные напряжения UA, UB, UC).
Заполнил раздел DeclareSection:

Код: Выделить всё

#include "Arduino.h"
#include <SPI.h>
#include "ADE7758Lib.h"

volatile char inputChar; // a string to hold incoming data
volatile boolean rx= false; // whether the string is complete
ADE7758 myADE(&SPI,10);
раздел SetupSection:

Код: Выделить всё

Serial.begin(9600);
   
  myADE.begin();
  Serial.println("ADE7758 begins operating");
  delay(1000);
раздел LoopSection:

Код: Выделить всё

if (rx) {
    switch(inputChar){
      case 'a': 
              Serial.println("ENERGY readings for each phase:");
              Serial.println(myADE.getWattHR(PHASE_A), HEX);
              Serial.println(myADE.getWattHR(PHASE_B), HEX);
              Serial.println(myADE.getWattHR(PHASE_C), HEX);
              break;
      case 'b':
              Serial.println("CURRENT RMS readings for each phase:");
              Serial.println(myADE.IRMS(PHASE_A), HEX);
              Serial.println(myADE.IRMS(PHASE_B), HEX);
              Serial.println(myADE.IRMS(PHASE_C), HEX);
              break;
      case 'c':
              Serial.println("VOLTAGE RMS readings for each phase:");
              Serial.println(myADE.VRMS(PHASE_A), HEX);
              Serial.println(myADE.VRMS(PHASE_B), HEX);
              Serial.println(myADE.VRMS(PHASE_C), HEX);
              break;
      case 'd':
              Serial.println("Complex Energy readings for each phase:");
              Serial.println(myADE.getVAHR(PHASE_A), HEX);
              Serial.println(myADE.getVAHR(PHASE_B), HEX);
              Serial.println(myADE.getVAHR(PHASE_C), HEX);
              break;
      default:
          Serial.println("unknown command");
    }
    rx = false;
  }

void serialEvent() {
  while (Serial.available()) {
    // get the new byte:
    inputChar = (char)Serial.read(); 
    rx = true;
  }
}

UA = myADE.VRMS(PHASE_A), HEX;
UB = myADE.VRMS(PHASE_B), HEX;
UC = myADE.VRMS(PHASE_C), HEX;
На шине SPI хаотично дергается SS и проскакивают синхроимпульсы SCLK, данных нет. Что я делаю не так?

dstrufanov
Рядовой
Сообщения: 2
Зарегистрирован: 07.01.2024{, 12:43}
Репутация: 0
Имя: Дмитрий

Создание блока ade7758 (монитор напряжения 3-фазной сети)

#2

Сообщение dstrufanov » 08.01.2024{, 18:19}

Так и не понял я, как работает эта библиотека, поэтому снес ее и заполнил секции пользовательского блока сам как мог. Микросхема читается. Т.к. опыта в С у меня никакого (писал раньше только на ассемблере), прошу покритиковать проблемные места:
Раздел DeclareSection:

Код: Выделить всё

#include <SPI.h>
Раздел SetupSection:

Код: Выделить всё

pinMode(PIN_SPI_SS, OUTPUT); // set the SS pin as an output
pinMode(PIN_SPI_MOSI, OUTPUT);
pinMode(PIN_SPI_SCK, OUTPUT);
pinMode(PIN_SPI_MISO, INPUT);

SPI.beginTransaction(SPISettings(1000000, MSBFIRST, SPI_MODE0)); 
SPI.transfer(0); // очищаем содержимое регистра
digitalWrite(PIN_SPI_SS,HIGH); // инициализация SS

delay(1000);
Раздел LoopSection:

Код: Выделить всё

digitalWrite(PIN_SPI_SS, LOW);    // set the SS pin to LOW

UA = 0;                                        // сбрасываем переменную UA
SPI.transfer(0x0D);                       // задаем адрес 24-битного регистра напряжения фазы A
SPI.transfer(0);                             // читаем старший байт
UA = SPDR;                                // пишем его в переменную UA
SPI.transfer(0);                             // читаем средний байт
UA << 8;                                      // сдвигаем переменную влево на 8 бит
UA = UA+SPDR;                          // и складываем ее с новыми данными
SPI.transfer(0);                             // читаем старший байт
UA << 8;                                      // сдвигаем переменную влево на 8 бит
UA = UA+SPDR;                          // и складываем ее с новыми данными

UB = 0;                                        // сбрасываем переменную UB
SPI.transfer(0x0E);                        // задаем адрес 24-битного регистра напряжения фазы B
SPI.transfer(0);                              // и т.д. аналогично
UB = SPDR;
SPI.transfer(0);
UB << 8;
UB = UB+SPDR;
SPI.transfer(0);
UB << 8;
UB = UB+SPDR;

UC = 0;
SPI.transfer(0x0F);                       
SPI.transfer(0);
UC = SPDR;
SPI.transfer(0);
UC << 8;
UC = UC+SPDR;
SPI.transfer(0);
UC << 8;
UC = UC+SPDR;

digitalWrite(PIN_SPI_SS, HIGH);    // set the SS pin HIGH

Ответить

Вернуться в «Разработка пользовательских блоков»