Boa tarde,

Estou trabalhando em um TCC usando o CI CS5463 para medir o fator de potência e outras grandezas também, minha ideia é desenvolver um controlador de FP que acione bancos de capacitores, mas que seja um projeto aberto que possa ser montado facilmente, tendo em vista que os controladores comerciais são caríssimos.

Já montei o circuito com o CS e agora estou partindo para a comunicação SPI com o Arduino, preciso escrever em alguns registradores do CS e também ler alguns. Já li bastante coisa na internet sobre SPI e estou estudando o exemplo de código que vem na IDE do arduino mas ainda está um pouco difícil de entender a sintaxe do código.

Se alguém puder me dar uma ajuda ou sugerir algum material para eu estudar agradeceria bastante.

Exibições: 11392

Anexos

Responder esta

Respostas a este tópico

José Gustavo, eu pensei em deixar o CS sempre ativo pois como só tem um escravo achei que não daria problema, o reset liguei direto por enquanto só para simplificar. Vou ligar o mode como sugeriu. Eu comecei hj a escrever meu código ainda não testei, estou estudando e usando como base o código do fórum que estou anexando.

A grande dúvida que estão é nesta linha  SPI.transfer( Write | (CONFIG1) );

Anexos

Pessoal, a ideia de vocês é muito boa. Trabalho em uma indústria de painéis de comando. Utilizamos bastante os controladores de fator de potência, em especial, os da Schneider. Temos muita aplicação prática caso seja desenvolvido um equipamento confiável e barato.

Caso seja criado um grupo específico para essa discussão, me avisem.

Boa sorte e compartilhem as conquistas !!!

Boa tarde pessoal,

Escrevi um código simplificado baseado no código que encontrei no fórum arduinocc, mas as leituras não estão muito boas:

#include<SPI.h> //declaração da biblioteca de comunicação SPI

enum Registradores_CS5463{ //criando variáreis para os registradores do CS5463 e atribuindo valores fixos para elas

  // Registradores da Página 0
  CONFIGURACAO = 0,
  CORRENTE_DC_OFFSET = 1,
  GANHO_CORRENTE = 2,
  TENSAO_DC_OFFSET = 3,
  GANHO_TENSAO = 4,
  CONTADOR_CICLOS = 5, //número de conversões usado no conversor A/D
  TAXA_PULSOS_E = 6, //define a taxa de pulsos das saídas de energia E1, E2 e E3
  CORRENTE = 7,
  TENSAO = 8,
  POTENCIA_INSTANTANEA = 9,
  POTENCIA_REAL = 10,
  CORRENTE_RMS = 11,
  TENSAO_RMS = 12,
  EPSILON = 13,
  POTENCIA_OFFSET = 14,
  ESTATUS = 15,
  CORRENTE_AC_OFFSET = 16,//RMS
  TENSAO_AC_OFFSET = 17, //RMS
  MODO = 18,
  TEMPERATURA = 19,
  POTENCIA_REATIVA_MEDIA = 20,
  POTENCIA_REATIVA_INSTANTANEA = 21,
  PICO_CORRENTE = 22,
  PICO_TENSAO = 23,
  POTENCIA_REATIVA_TRIANGULO = 24,
  FATOR_POTENCIA = 25,
  MASCARA_INTERRUPCAO = 26,
  POTENCIA_APARENTE = 27,
  CONTROLE = 28,
  POTENCIA_ATIVA_HARMONICA = 29,
  POTENCIA_ATIVA_FUNDAMENTAL = 30,
  POTENCIA_REATIVA_FUNDAMENTAL = 31,


  // Registradores da Página 1
  LARG_PULSO_ENERGIA = 0,
  LIMITE_SEM_CARGA = 1,
  GANHO_TEMPERATURA = 2,
  TEMPERATURA_OFFSET = 3,


  // Registradores da Página 3
  INTERVALO_TENSAO_SAG = 6, //tempo em que a tensão deve se manter baixa para ativar a detecção de falha de tensão
  NIVEL_TENSAO_SAG = 7, //valor mínimo de tensão para ativar a detecção de falha de tensão
  INTERVALO_CORRENTE_SAG = 10, //tempo de falta de corrente para ativar a detecção de falha de corrente
  NIVEL_CORRENTE_SAG = 11, //valor mínimo de corrente para ativar a detecção de falha de corrente


  //COMANDOS
  LEITURA = 0,
  ESCRITA = 64,
  SYNC0 = 254,
  SYNC1 = 255,
};

const int PINO_CS = 10; //pino de controle do slave

byte H_VALOR_TENSAO_RMS;
byte M_VALOR_TENSAO_RMS;
byte L_VALOR_TENSAO_RMS;

byte H_VALOR_CORRENTE_RMS;
byte M_VALOR_CORRENTE_RMS;
byte L_VALOR_CORRENTE_RMS;

byte H_VALOR_POTENCIA_REAL;
byte M_VALOR_POTENCIA_REAL;
byte L_VALOR_POTENCIA_REAL;

byte H_VALOR_POTENCIA_APARENTE;
byte M_VALOR_POTENCIA_APARENTE;
byte L_VALOR_POTENCIA_APARENTE;

byte H_VALOR_POTENCIA_REATIVA;
byte M_VALOR_POTENCIA_REATIVA;
byte L_VALOR_POTENCIA_REATIVA;

void setup (){

pinMode(PINO_CS, OUTPUT); //define pino slave como saída
digitalWrite(PINO_CS, HIGH);

Serial.begin(9600);

SPI.begin();

SPI.setBitOrder(MSBFIRST);
SPI.setClockDivider(16);
SPI.setDataMode(SPI_MODE0);

delay(100);

//Configura o registrador CONFIGURACAO
digitalWrite(PINO_CS, LOW); //Seleciona o slave CS5463
SPI.transfer(0x40); //1º byte (comando de escrita e endereço do registrador CONFIGURACAO) 0100 0000
SPI.transfer(0x00); //2º byte (configuração) 0000 0000 - ultimo bit define PGA (ganho do amplificador de corrente) como 10x
SPI.transfer(0x00); //3º byte (configuração) 0000 0000
SPI.transfer(0x01); //4º byte (configuração) 0000 0001 - ultimo bit define o divisor de clock como 1
digitalWrite(PINO_CS, HIGH); //Desativa o slave CS5463

//Configura o registrador MODO
digitalWrite(PINO_CS, LOW); //Seleciona o slave CS5463
SPI.transfer(0x64); //1º byte (comando de escrita e endereço do registrador MODO) 0110 0100
SPI.transfer(0x00); //2º byte (configuração) 0000 0000
SPI.transfer(0x00); //3º byte (configuração) 0000 0000
SPI.transfer(0x01); //4º byte (configuração) 0000 0001 - ultimo bit ativa AFC
digitalWrite(PINO_CS, HIGH); //Desativa o slave CS5463

//Configura o registrador CONTROLE
digitalWrite(PINO_CS, LOW); //Seleciona o slave CS5463
SPI.transfer(0x78); //1º byte (comando de escrita e endereço do registrador CONTROLE) 0111 1000
SPI.transfer(0x00); //2º byte (configuração) 0000 0000
SPI.transfer(0x00); //3º byte (configuração) 0000 0000
SPI.transfer(0x04); //4º byte (configuração) 0000 0100 - bit 1 desativa o pino CPUCLK para economizar energia
digitalWrite(PINO_CS, HIGH); //Desativa o slave CS5463
}

void loop()
{
  digitalWrite(PINO_CS, LOW);
  SPI.transfer(0x18);
  H_VALOR_TENSAO_RMS = SPI.transfer(SYNC1);
  M_VALOR_TENSAO_RMS = SPI.transfer(SYNC1);
  L_VALOR_TENSAO_RMS = SPI.transfer(SYNC1);
  digitalWrite(PINO_CS, HIGH);

Serial.println(H_VALOR_TENSAO_RMS);
Serial.println(M_VALOR_TENSAO_RMS);
Serial.println(L_VALOR_TENSAO_RMS);

}

leituras que estou obtendo:

5
250
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
255
255
255
255
255
255
255
255
255
255
255
255
0
63
0
0
0
0
255
255
255
255
255
255
255
255
255
0
255
0
0
0
0
255
255
255
255
255
255
255
255
255
255
255
255
96
0
0
0
0
0
255
255
255
255
255
255
255
255
255
0
15
0
0
0
0
255
255
255
255
255
255
192
255
0
0
0
0
255
255
255
255
255
255
255
255
255
255
255
255
255
255
255
255
255
255
255
63
224
0
0
0
255
255
255
255
255
255
255
255
255
255
255
255
255
255
255
255
255
255
255
255
255
255
255
255
0
124
0
0
0
0
255
255
255
255
255
255
255
255
255
128
7
0
0
0
0
255
255
255
255
255
255
255
255
255
255
255
255
255
255
255
0
0
0
3
0
96
255
255
255
255
255
255
112
0
0
0
0
0
255
255
255
255
255
255
255
255
255
255
255
255
240
7
0
0
0
0
255
255
255
255
255
255
255
255
255
255
255
255
248
0
128
0
0
0
255
255
255
255
255
255
255
255
255
255
255
255
255
255
255
128
255
0
0
0
0
255
255
255
255
255
255
255
255
255
255
255
255
255
255
255
255
255
255
240
255
128
255
255
255
0
0
0
0
0
7
255
255
255
0
255
0
0
0
0
255
255
255
255
255
255
255
255
255
255
127
248
255
0

Se alguém tiver alguma ideia do que posso melhorar agradeço.

Não envie listagens grandes, fica dificil para analisar. 

Envie o seu programa via Pastebin, ou anexe o arquivo, no tópico. 

Informe detalhadamente qual é o título de cada leitura. 

Por exemplo :

Tensão = 255

Outra dúvida que estou, entendi pelo datasheet que os pinos E1, E2 e E3 deveriam ter uma forma de onda quadrada, mas não é isso que está ocorrendo, liguei o CI com o pino CS aterrado e o RESET no VCC mas a forma de onda nos pinos E é o da imagem abaixo:

Me parece que esta medindo no pino incorreto. 

Conectou o terra do osciloscopio no terra do circuito?

Se o seu circuito estiver conectado diretamente na rede eletrica, não faça isso ! Pode dar um grande curto circuito! Cuidado com choque elétrico. 

Mas como informou que esta usando transformadores, não tem risco. 

Veja esse exemplo de conexão com Leds. Eu faria esse teste :

https://www.cirrus.com/en/pubs/rdDatasheet/CDB5463U_DB2.pdf

Resistores de 1K, leds comuns, Vdd = 5V ( é isso mesmo ?) 

Estou usando basicamente o circuito que mostrei no começo, só mudei o CS que está agora controlado pelo pino 10 do arduino e o pino mode do CS5463 que liguei ao GND. Vou testar com os leds e depois posto aqui o resultado.

Eu também colocaria um botão de reset - pode ser util na fase de testes.

Resistor de 10K para o Vcc  e um botão ligado para o terra (pode colocar o capacitor também) 

O reset do chip é feito com um pulso para o terra.

 

 

Liguei os leds e o botão reset, os leds somente ficaram acesos, não piscam. Tentei carregar o código completo do autor do tópico no fórum arduinocc (em anexo) mudando apenas os pinos do arduino, porém também não obtive nada de útil nas leituras.

Esses foram os resultados:

Config: 0
0
0
Status: 0
0
0
VOLTAGE_RMS: 0
0
0
0
CURRENT_RMS: 0
0
0
0
POWER: 0
0
0
0
TEMPERATURE: 0
0
0
0

Também pensei que a fonte de alimentação do CS5463 estivesse ruim, mas comparei com o 5V do arduino e não ficou muito ruim, na imagem abaixo o sinal amarelo é a fonte e o verde o 5V do arduino.

Estou usando o CS soldado em uma placa com pinos e esta placa espetada em protobord fazendo todas as conexões na protobord, vou montar uma placa e soldar os componentes para ver se melhora alguma coisa. Por enquanto é só, se alguém tiver mais alguma sugestão fico grato.

Anexos

Você mediu com o osciloscópio ps Pinos E1, E2 e E3 ? 

Se estiverem pulsando, os leds aparecerão acesos...

Acho que esse pinos devem ser configurados. 

Já leu todo o datatsheet ?

Medi sim, no osciloscópio aparece uma onda senoidal um pouco distorcida (vou montar o circuito de teste novamente e posto as imagens), acho que deveria ser uma onda quadrada. Já li todo, o problema é que meu inglês ainda é bem ruim então o google tradutor está me ajudando nisso.

Pelo datasheet na seção 4.1 explica o seguinte:

Pino E1 - Saída em pulso proporcional a potência instantânea

Pino E2 - Saída em pulso proporcional a potência aparente, pode ser configurado para fornecer sinal de energia

Pino E3 - Saída em pulso proporcional a potência reativa, pode ser configurado para apresentar o sinal de tensão aplicado nas entradas VIn ou tensão do comparador PFMON.

Ou seja, ao menos o pino E1 funciona sem nenhuma configuração.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço