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.
Tags:
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) );
Veja os modos SPI = irei pesquisar qual é o modo usado com o CS5463.
https://abieneman.files.wordpress.com/2010/04/atmega-spi-modes.gif
http://www.atmel.com/Images/Atmel-2585-Setup-and-Use-of-the-SPI_App...
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
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.
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.
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.
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por