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: 11356

Anexos

Responder esta

Respostas a este tópico

Cara, esse chip é fantástico ! Tem recursos pra caramba. 

Só que ainda não fiz ainda os testes de medição de energia ( o principal) . 

Gustavo? Não me venderia algumas unidades não?

Eu fiz a importação de algumas peças, mas deve demorar um bocado pra chegar ainda...

Se for possível, eu agradeceria... 

olá José Gustavo Abreu Murta Estou trabalhando em um projeto com o cs5463 e graças ao que li neste fórum pude ler os registros, mas não tenho muita ideia de programação e quero saber se você pode me ajudar como o código de calibração do circuito

obrigado antecipadamente

Bom dia Costa, 

Qual seria o código usado para calibração? Você já viu o código usado pelo Alan ?

Envie o arquivo do sketch.

Atenciosamente. 

Bom dia Jose Gustavo

Se eu fiz isso, o código usado por Alan tem sido ótimo, mas ele não inclui a rotina de calibração do circuito, ele apenas lê os registros como eles são e extrapola os valores,

mal consegui à noite consegui fazer a calibração de Vac_offset e Iac_offset, agora vou trabalhar no ganho para ambos os canais, mas para isso precisamos fazer uma fonte de 160mv que é o sinal máximo que vai receber o integrado aqui deixo o codigo de calibração que eu usei, como eu tenho o circuito montado não consigo monitorar pela porta serial, então eu uso o display,

PD: desculpe meu portugues é realmente uma tradução literal do espanhol

Calibracion.ino

Bom dia Costa, não sabia que você era mexicano.

Esta usando o Google Tradutor ? É muito bom.

Eu somente ajudei o Alan no projeto. O Alan que fez todo o projeto.

Sugiro que entre em contato com ele, para entender como ele fez a calibração do circuito.

Todo o projeto foi baseado no datasheet do chip CS5463. Recomendo que estude todo o material. Qualquer dúvida, pode me perguntar. Veja o capítulo 7 sobre System Calibration

https://d3uzseaevmutz1.cloudfront.net/pubs/proDatasheet/CS5463_F3.pdf

7. System Calibration . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . 37

https://www.cirrus.com/products/cs5463/

Veja também os documentos sobre aplicações do CS5463

No momento estou envolvido em vários outros projetos e estou sem disponibilidade para ajuda-lo.

Abraços e boa sorte. 

Gustavo 

Bom dia Jose Gustavo

o simples fato de que você teve tempo para responder já é uma grande ajuda, eu já escrevi para Alan mas aparentemente deixo o fórum, entendo que você está trabalhando duro,

mais uma vez, muito obrigado pelo seu tempo, eu já acho que meu projeto está saindo depois de uma leitura da folha de dados Eu entendi como usar os registros e calibrar o circuito, muito obrigado pela sua ajuda,

os melhores cumprimentos

Analisando o programa CS5463_SPI_V5.0.ino

A comunicação SPI parece ser bem simples. Mas antes de estabelecer o início da comunicação, você deve configurar alguns parâmetros . 

https://www.arduino.cc/en/Reference/SPI

- Qual é a máxima velocidade de comunicação ? Vai depender da velocidade dos dois dispositivos em questão. 

A velocidade máxima deverá ser menor das velocidades máximas dos dois.

No caso do Arduino UNO, a velocidade SPI máxima é 8 Mhz ( Fosc / 2 ) - vide data sheet do ATMega 328. 

Já no caso do CS5463, a velocidade SPI máxima é 2 MHz. vide data sheet 

No programa em análise, a velocidade máxima foi configurada para 1 MHz. 

SPI.begin();
SPI.beginTransaction(SPISettings(1000000,MSBFIRST,SPI_MODE0));

Qual é a sequência de transferência dos bits ? MSB ou LSB primeiro ? 

Existem dois métodos de envio do bits , enviando o bit mais significativo primeiro MSB, ou então enviando o bit menos significativo primeiro LSB . O data sheet do DS5463 especifica que o MSB deve ser enviado primeiramente. (MSBFIRST)

Qual é o modo de comunicação SPI é usado ( em relação á fase e polaridade do Clock) ?

Como já informei, existem quatro modos de comunicação SPI, que o ATmega328 pode usar. 

No caso do CS5463 o modo 0 (SPI_MODE0) é usado ( CPHA=0 e CPOL=0) . 

Analisando o programa CS5463_SPI_V5.0.ino ( continuação) 

Essa rotina pretende fazer uma soft reset no chip CS5463 

SYNC0 = 254, //SYNC 0 Command: Last byte of a serial port re-initialization sequence
SYNC1 = 255, //SYNC 1 Command: Used during reads and serial port initialization.

//Run a Soft Reset of the CS5463

//Sync commands
SPI.transfer(SYNC1);
SPI.transfer(SYNC1);
SPI.transfer(SYNC1);
SPI.transfer(SYNC0);

digitalWrite(CS, HIGH);

Verificando no Datasheet do CS5463 :

Um software reset é iniciado escrevendo o comando 0x80.

Após uma reinicialização de hardware ou software, os registradores internos (alguns dos quais sãor pinos de saída) são resetados para os valores padrões. O bit de estado DRDY no Status Register, indica o CS5463 está em seu estado ativo e pronto para receber comandos.

Na verdade a rotina especificada acima não é um soft reset e sim uma sequência de inicialização do Port Serial !

Issue the Serial Port Initialization Sequence, which is 3 (or more) SYNC1 command bytes
(0xFF) followed by one SYNC0 command byte (0xFE).

Analisando o programa CS5463_SPI_V5.0.ino ( continuação) 

"o melhor meio de aprender é ensinando " 

OBS - o dois simbolos de menor foram substituidos por shift left, pois o editor de texto do tópico não aceita esses simbolos) 

O envio de comandos (byte de comando) deve ser seguido de três bytes de dados.

//Set Config register

CONFIG = 0,   // Registrador 00000 = Configuração ( default = 0x 00 00 01) 

Write = 64,       // comando Write 0x40 


digitalWrite(CS, LOW); 
SPI.transfer( Write | (CONFIG shift left 1) );  
SPI.transfer(0x00); 
SPI.transfer(0x00);
SPI.transfer(0x01); // Set K value to 1 (clock devider for measuring cycles)
digitalWrite(CS, HIGH); 

//Set Mask register

MASK_INTERUPT = 26, //  Registrador de máscara de Interrupção (habilita interrupção)  = 0x1A 

                                     //  dados = 0x 00 00 00 : configurado para desabilitar interrupções (default) 
digitalWrite(CS, LOW);
SPI.transfer( Write | (MASK_INTERUPT shift left  1) );
SPI.transfer(0x00); 
SPI.transfer(0x00);
SPI.transfer(0x00);
digitalWrite(CS, HIGH);



//Set Mode register

MODE = 18,           // Registrador do modo de Operação  0x12 = 0x 00 00 61

// IHPF = 1  ativa filtro passa alto na medição de corrente 

// VHPF  = 1  ativa filtro passa alto na medição de tensão

// AFC = 1 ativa medição automática de frequência da rede 


digitalWrite(CS, LOW);
SPI.transfer( Write | (MODE shift left  1) );
SPI.transfer(0x00);  
SPI.transfer(0x00);
SPI.transfer(0x61);
digitalWrite(CS, HIGH);



//Set Control register

CONTROL = 28,     // Registrador de Controle  0X1C  = 0x 00 00 04

// NOCPU = 1   - desabilita CPU clocks para economizar energia

// me parece que esse bit desliga o pino de saída CPUCLK (não interfere em nada) 


digitalWrite(CS, LOW);
SPI.transfer( Write | (CONTROL shift left  1) );
SPI.transfer(0x00);  
SPI.transfer(0x00);
SPI.transfer(0x4);
digitalWrite(CS, HIGH);

Esse comando inicializa os conversores ADC do Chip CS5463 no modo contínuo. 

Isto é, o conversores ficam trabalhando (fazendo as leituras) o tempo todo, sem parar. 

digitalWrite(CS, LOW);
SPI.transfer(START_CONTINOUS);     // START_CONTINOUS = 0xE8,
digitalWrite(CS, HIGH);

Primeiros testes - CS5463 - parte digital :

Bom dia Alan. Comecei a montagem do Chip CS5463 com o Arduino. Usei um Arduino Nano pois ele pode ser inserido no Protoboard. Usei dois protoboards Hikari HK-P50 ( muito  bons) . Como o suporte do CS5463 era grande, não dava para fazer uma montagem comum no protoboard. E desse jeito que eu montei ficou muito fácil para eu  inserir os componentes. Prendi os dois Protoboards em um pedaço de MDF (sempre faço isso) . 

Como fonte de 5V , eu usei uma fonte antiga de um roteador DLink - 5V / 1,2A. Veja o conector adaptado para protoboard. 

Para iniciar os testes, fiz somente a montagem da parte digital . Depois que essa parte estiver toda ok, aí montarei a parte analógica. Por isso, aterrei as entradas de tensão (pinos 9 e 10)  e corrente (pinos 16 e 15) com resistores de 10K ohms . 

Fiz a montagem idêntica ao diagrama que eu fiz, baseando no Sketch CS5463_SPI_V5.0.ino.

http://labdegaragem.com/forum/topics/controlador-de-fp-com-arduino-...

Primeiras verificações : 

1) Medi as tensões e conferi se existia algum ripple ( ondulação) 

VA+(pino 14)  = 5,18 V cc            VD+ (pino 03)  = 4,74 V 

Veja que existe um resistor de 10 ohms entre VA+ e VD+ (fiz igual ao datasheet) 

2) Medi a tensão VREF out (pino 11) e com o capacitor de 0,1 uF conectado ao terra, a tensão não estava boa ! Testei com outros valores de capacitores e sempre abaixo dos 2,5 V. E essa tensão é importantíssima pois é a referência dos conversores ADC.  Retirei o capacitos de 0,1 uF e a tensão ficou nos 2,526 V  a 2,534 V . Assim esta bom !

3) Medi com o osciloscópio (scope) os sinais do Clock . Sem clock, o microcontrolador interno do CS5463 não funciona. E tudo ótimo ! A frequência medida no scope foi de 4,097 MHz, mas acho que não vai  influir. 

Pino 01 - Xout 

Pino 24 - Xin 

Agora testando o Sketch  CS5463_SPI_V5.0.ino. Nesse Sketch, não sei porque, mas o programador desligou o pino de Clock Out (pino 2). E esse pino é interessante ativa-lo, pois assim podemos medir a saída do clock. 

Por isso alterei o programa e consegui medir o pino de Clock ( perfeito! ) 

Oba, a comunicação SPI esta funcionando !!

//Set Control register - Default = 0x 00 00 00
digitalWrite(CS, LOW);
SPI.transfer( Write | (CONTROL1) );
SPI.transfer(0x00);
SPI.transfer(0x00);
SPI.transfer(0x00);
digitalWrite(CS, HIGH);

Clock Out ( pino 02) 

Alan boa tarde, 

Esse chip CS5463 é poderoso e complexo !! Muito legal !

Estou adaptando e corrigindo o programa  CS5463_SPI_V5.0.ino.

O colega Blizzart estava fazendo as medições  todas incorretas !!! 

Ele estava lendo somente o primeiro byte (High Byte) das medições de tensão e corrente, por exemplo. 

Esta erradíssimo. Tem que ler os três bytes e formatar o número. 

Veja que a Voltage Instantaneous (registrador 8) tem 24 bits ( 3 bytes) . 

Aguarde um tempo. Assim que estiver pronto eu enviarei o Sketch corrigido. 

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço