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:
Bom dia Alan. Na atual conjuntura, recomendo que use um analisador lógico para descobrir o problema. Tem um ? Se não tiver pode tentar montar esse do meu tutorial
http://labdegaragem.com/profiles/blogs/tutorial-analisador-l-gico-c...
Pesquisei um pouco em sites internacionais e descobri que esse módulo tem histórico de incompatibilidade quando trabalha em conjunto com outros dispositivos SPI. Vou comprar outro módulo para cartão SD mesmo e fazer as ligações com resistores.
Alan, me parece que esta tendo problema ainda no pino MISO, não é ?
Revendo um link, que eu já tinha lhe enviado, descobri que dependendo dos chips usados no SPI BUS, pode ser necessário o uso de um buffer no pino MISO. Talvez seja essa a sua solução :
http://www.dorkbotpdx.org/blog/paul/better_spi_bus_design_in_3_steps
Verify tri-state behavior on MISO: use a tri-state buffer chip if necessary. Veja o Device 2.
Consegui resolver o problema do log trocando o shield do gravador SD, o módulo da catalex simplesmente não funciona junto com outro dispositivo SPI, ele tem um erro de projeto, isso foi o que achei em um fórum internacional, várias pessoas relataram isso.
Fiz a troca por um modelo SD mesmo:
Consegui gravar o logo perfeitamente com esse modelo, a única questão que ainda não entendi é que se eu conectar o cartão já com o sistema ligado ele não cria o arquivo preciso dar um reset pra começar a gravar.
Exemplo de um log que gravei:
122.00V 2.50A 310.43W 0.98 01.10.16 12:19:46 B2 B3
122.76V 1.54A 181.08W 0.93 01.10.16 12:19:56 B1 B2 B3
123.29V 1.55A 181.08W 0.94 01.10.16 12:20:06 B1 B2 B3
122.79V 1.54A 181.08W 0.93 01.10.16 12:20:16 B1 B2 B3
122.63V 1.54A 181.08W 0.93 01.10.16 12:20:26 B1 B2 B3
122.58V 1.54A 181.08W 0.93 01.10.16 12:20:36 B1 B2 B3
122.99V 2.41A 267.31W 0.89 01.10.16 12:20:47 B1 B2 B3
122.96V 1.84A 137.97W 0.60 01.10.16 12:20:57 B1 B2 B3
121.61V 2.48A 301.81W 0.97 01.10.16 12:21:07 B2 B3
121.61V 2.48A 301.81W 0.98 01.10.16 12:21:17 B2 B3
121.20V 2.45A 301.81W 0.98 01.10.16 12:21:27 B3
121.35V 2.46A 301.81W 0.98 01.10.16 12:21:37 B3
121.30V 2.82A 293.18W 0.84 01.10.16 12:21:47 B3
121.15V 3.10A 344.92W 0.89 01.10.16 12:21:57 B2 B3
121.66V 2.74A 344.92W 1.00 01.10.16 12:22:08 B2 B3
121.48V 4.48A 293.18W 0.53 01.10.16 12:22:18 B1 B2
121.64V 2.76A 344.92W 0.98 01.10.16 12:22:28 B3
120.98V 3.97A 293.18W 0.59 01.10.16 12:22:38 B3
121.44V 3.73A 258.69W 0.55 01.10.16 12:22:48 B1 B2
121.62V 2.20A 301.81W 1.00 01.10.16 12:22:58 B3
121.27V 3.69A 250.07W 0.55 01.10.16 12:23:08 B3
121.80V 2.36A 189.71W 0.65 01.10.16 12:23:18 B1 B2
121.29V 1.60A 215.58W 1.00 01.10.16 12:23:28 B3
121.17V 2.21A 189.71W 0.71 01.10.16 12:23:39 B3
121.25V 2.59A 172.46W 0.55 01.10.16 12:23:49 B1 B2
121.19V 1.64A 224.20W 1.00 01.10.16 12:23:59 B3
121.00V 3.06A 181.08W 0.49 01.10.16 12:24:09 B3
120.94V 3.03A 189.71W 0.50 01.10.16 12:24:19 B1 B2
120.97V 1.73A 232.82W 1.00 01.10.16 12:24:29 B3
120.50V 3.62A 206.95W 0.47 01.10.16 12:24:39 B3
120.84V 3.85A 224.20W 0.47 01.10.16 12:24:49 B1 B2
121.03V 2.12A 267.31W 1.00 01.10.16 12:25:00 B3
121.00V 3.43A 232.82W 0.55 01.10.16 12:25:10 B3
120.25V 2.94A 344.92W 0.94 01.10.16 12:25:20 B1 B3
120.11V 2.93A 344.92W 0.94 01.10.16 12:25:30 B1 B3
120.16V 2.93A 344.92W 0.94 01.10.16 12:25:40 B1 B3
120.79V 2.96A 344.92W 0.94 01.10.16 12:25:50 B1 B3
120.63V 2.95A 344.92W 0.94 01.10.16 12:26:00 B1 B3
120.60V 2.95A 344.92W 0.94 01.10.16 12:26:11 B1 B3
Ainda estou com 2 problemas para resolver, 1º o botão de reset da placa não está funcionando, coloquei um botão para resetar junto o CS5463 e o ATMEGA, mas quando reseto as leituras ficam todas zeradas, estou usando um esquema básico
Liguei o pino Reset do CS5463 no mesmo ponto onde está ligado o pino 1 do microcontrolador, coloquei também um capacitor 0,1uF ligado entre os pinos reset do microcontrolador e do CS e o GND. Fiz um teste para conferir se a tensão caia a zero quando pressiono o botão, com o microcontrolador conectado não está caindo apenas no CS vai a zero, sem o microcontrolador a tensão no pino cai a zero.
Outro problema é quando ao acionamento dos capacitores, estabeleci no código dois limites se o FP cai abaixo de 0,93 começa a acionar os capacitores e se subir acima de 0,98 começa retirar os capacitores. Estou usando 3 capacitores 70uF, 40uF e 15uF e o sistema combina os valores deles para elevar o FP.
Exemplo FP <0,93
15
40
40 + 15
70
70 + 15
70 + 40
70 + 40 + 15
O problema é que as vezes o FP está abaixo de 0,93 e ao colocar um capacitor apenas o FP fica maior que 0,98, aí o sistema retira o capacitor em seguida, porém aí o FP cai novamente abaixo de 0,93 e novamente coloca o capacitor, entra em um loop infinito realizando acionamentos desnecessários. Preciso criar alguma coisa que ele ao colocar um capacitor se o FP passar de 0,98 retire esse capacitor e mesmo que o FP caia abaixo de 0,93 não acione novamente.
Resolvi o reset, liguei o pino de reset do CS em um pino do controlador e coloquei uma rotina que joga o pino para nível 0 dentro da função setup, agora quando aperta o botão reset da placa ele reseta fisicamente apenas o microcontrolador e este por sua vez reseta o CS por código.
Ah bom, eu já tinha feito isso no meu diagrama ! Eu tinha comentado isso com você.
Você não tinha se preocupado com o reset.
No meu diagrama, o pino de RESET do CS5463 esta ligado no pino D09 do Arduino.
http://labdegaragem.com/forum/topics/controlador-de-fp-com-arduino-...
Boa tarde, pessoal, voltei a ter problemas com o cartão SD, não consigo entender, funcionou várias vezes gravei o log perfeitamente, agora estou montando o projeto em uma bancada para a apresentação e parou de funcionar.
O módulo está ligado a placa e funciona normalmente, porém quando conecto o cartão SD na primeira gravação (está configurado para gravar a cada 10s) as leituras ficam desconfiguradas oscilando muito mesmo, o log até é gravado mas com os valores errados.
Acho que deve ser o pino MISO do módulo SD que está bagunçando, vou tentar colocar um buffer triestate, mas agora só segunda pra comprar um 74LS125.
Qual o modulo SD Card esta usando? Envie o link.
Como fez as conexões ?
Estou usando este módulo http://blog.filipeflop.com/modulos/cartao-sd-com-arduino.html
As conexões fiz desta forma:
Também experimentei ligar usando os divisores de tensão, como indicado no link acima, mas o resultado foi o mesmo.
Quase tudo pronto, consegui fazer funcionar quase tudo que eu queria, a última coisa que estou tentando resolver é um problema com a lógica de acionamento dos bancos.
No meu protótipo estou trabalhando com 3 capacitores de valores diferentes (45, 25 e 10uF) e o sistema deve combinar os valores para achar a melhor configuração para que o FP sempre fique em 0,93 e 0,98.
A lógica de acionamento e desacionamento seria a seguinte:
FP<0,93
B1
B2
B1 + B2
B3
B1 + B3
B2 + B3
B1 + B2 + B3
FP>0,98
B2 + B3
B1 + B3
B3
B1 + B2
B2
B1
O problema é que em algumas condições entra em um loop infinito, quando o FP. Por exemplo FP em 0,92 com B3 e B2 ativos, aciona B3. Nesta situação o FP passa para 0,99 com B1, B2 e B3 ativos nestas condições a função desativa B3 e volta para a condição inicial.
int aciona_bancos(){
if((Corrente*M_Corrente<1)){ //sistema em vazio
digitalWrite(b1, LOW);
digitalWrite(b2, LOW);
digitalWrite(b3, LOW);
}
else if((Corrente*M_Corrente>1)&&((FP)<0.20)&&(digitalRead(b1)==HIGH)&&(digitalRead(b2)==HIGH)&&(digitalRead(b3)==HIGH)){ //cargas removidas e bancos ativos, desativa os bancos
digitalWrite(b1, LOW);
digitalWrite(b2, LOW);
digitalWrite(b3, LOW);
}if((FP)<0.92){
liga_bancos();
}if((FP)>0.98){
desliga_bancos();
}temposalvo = millis();
}--------------------------
int liga_bancos(){
if (digitalRead(b1)==LOW&&digitalRead(b2)==LOW&&digitalRead(b3)==LOW){
digitalWrite(b1, HIGH);
digitalWrite(b2, LOW);
digitalWrite(b3, LOW);
}else if (digitalRead(b1)==HIGH&&digitalRead(b2)==LOW&&digitalRead(b3)==LOW){
digitalWrite(b1, LOW);
digitalWrite(b2, HIGH);
digitalWrite(b3, LOW);
}else if (digitalRead(b1)==LOW&&digitalRead(b2)==HIGH&&digitalRead(b3)==LOW){
digitalWrite(b1, HIGH);
digitalWrite(b2, HIGH);
digitalWrite(b3, LOW);
}else if (digitalRead(b1)==HIGH&&digitalRead(b2)==HIGH&&digitalRead(b3)==LOW){
digitalWrite(b1, LOW);
digitalWrite(b2, LOW);
digitalWrite(b3, HIGH);
}else if (digitalRead(b1)==LOW&&digitalRead(b2)==LOW&&digitalRead(b3)==HIGH){
digitalWrite(b1, HIGH);
digitalWrite(b2, LOW);
digitalWrite(b3, HIGH);
}else if (digitalRead(b1)==HIGH&&digitalRead(b2)==LOW&&digitalRead(b3)==HIGH){
digitalWrite(b1, LOW);
digitalWrite(b2, HIGH);
digitalWrite(b3, HIGH);
}else if (digitalRead(b1)==LOW&&digitalRead(b2)==HIGH&&digitalRead(b3)==HIGH){
digitalWrite(b1, HIGH);
digitalWrite(b2, HIGH);
digitalWrite(b3, HIGH);
}
}int desliga_bancos(){
if (digitalRead(b1)==HIGH&&digitalRead(b2)==HIGH&&digitalRead(b3)==HIGH){
digitalWrite(b1, LOW);
digitalWrite(b2, HIGH);
digitalWrite(b3, HIGH);
}else if (digitalRead(b1)==LOW&&digitalRead(b2)==HIGH&&digitalRead(b3)==HIGH){
digitalWrite(b1, HIGH);
digitalWrite(b2, LOW);
digitalWrite(b3, HIGH);
}else if (digitalRead(b1)==HIGH&&digitalRead(b2)==LOW&&digitalRead(b3)==HIGH){
digitalWrite(b1, LOW);
digitalWrite(b2, LOW);
digitalWrite(b3, HIGH);
}else if (digitalRead(b1)==LOW&&digitalRead(b2)==LOW&&digitalRead(b3)==HIGH){
digitalWrite(b1, HIGH);
digitalWrite(b2, HIGH);
digitalWrite(b3, LOW);
}else if (digitalRead(b1)==HIGH&&digitalRead(b2)==HIGH&&digitalRead(b3)==LOW){
digitalWrite(b1, LOW);
digitalWrite(b2, HIGH);
digitalWrite(b3, LOW);
}else if (digitalRead(b1)==LOW&&digitalRead(b2)==HIGH&&digitalRead(b3)==LOW){
digitalWrite(b1, HIGH);
digitalWrite(b2, LOW);
digitalWrite(b3, LOW);
}else if (digitalRead(b1)==HIGH&&digitalRead(b2)==LOW&&digitalRead(b3)==LOW){
digitalWrite(b1, LOW);
digitalWrite(b2, LOW);
digitalWrite(b3, LOW);
}
}
Boa tarde Alan ,
O acionamento dos bancos não precisa de tempo para estabilizar ?
Eu sugiro que insira um delay em cada acionamento ou desativação de bancos.
" O problema é que em algumas condições entra em um loop infinito, quando o FP. Por exemplo FP em 0,92 com B3 e B2 ativos, aciona B3. Nesta situação o FP passa para 0,99 com B1, B2 e B3 ativos nestas condições a função desativa B3 e volta para a condição inicial."
O seu sistema não seria um corretor de fator de potência ?
O sistema monitora o fator de potência e vai corrigindo através da realimentação.
No exemplo citado acima, qual seria a condição ideal ? Você acha que ele deveria manter no 0,98 ?
https://pt.wikipedia.org/wiki/Controlador_proporcional_integral_der...
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por