Ajuda - Capturar Valor - Sensor de Corrente ACS712 30a

Bom dia Pessoal,

Estou com uma grande dificuldade em conseguir capturar o valor do sensor.

Já tentei inúmeros algoritmos disponibilizados, porém o valor aparece sempre "fixo", ou seja, com algum aparelho ligado ou não, o valor permanece o mesmo.

Alguém sabe como pegar esse valor mais próximo do real possível??

Algoritmos testados que não deram certos:

int sensorPin =A0;

int sensorValue_aux = 0;
float sensorValue = 0;
float currentValue = 0;
float voltsporUnidade = 0.004887586;// 5%1023

void setup() {
Serial.begin(9600);
pinMode(sensorPin, INPUT);
}

void loop() {

for(int i=100; i>0; i--){
sensorValue_aux = (analogRead(sensorPin) -511); // le o sensor na pino analogico A0 e ajusta o valor lido ja que a saída do sensor é (1023)vcc/2 para corrente =0
sensorValue += pow(sensorValue_aux,2); // somam os quadrados das leituras.
}

sensorValue = (sqrt(sensorValue/ 100)) * voltsporUnidade; // finaliza o calculo da méida quadratica e ajusta o valor lido para volts
currentValue = (sensorValue/0.185); // calcula a corrente considerando a sensibilidade do sernsor (185 mV por amper)

// mostra o resultado no terminal
Serial.print(currentValue,3);
Serial.print(" A \n" );

sensorValue =0;

delay(100);

}
###########################################################################################################3

void setup() {
// inicializa a comunicação seral a 9600 bits por segundo:
Serial.begin(9600);
}

void loop() {
// leitura input no analog pin 0:

//aqui a leitura é mostrada entre 0 e 1023
int sensorValue = analogRead(A0);

//podemos fazer transformações para mostrar em Amperes

//O código a seguir diz para o Arduino que o valor lido pelo sensor deve ser transformado de 0 a 1023 para -30 a +30.

int outputValue = map(sensorValue, 0, 1023, -30, 30);
// mostrar valor lido pelo sensor:

Serial.print("Sensor: ");

Serial.print(sensorValue);

//mostrar valor transformado em amperes:

Serial.print(" - mA: ");

Serial.println(outputValue);

delay(3000); // Tempo entre leituras
}

#########################################################

#define Rele1 7 // Define pino de saida para rele 1
#define Rele2 8 // Define pino de saida para rele 2
const int sensorPin = A0;
float sensorValue_aux = 0;
float sensorValue = 0;
float currentValue = 0;
float voltsporUnidade = 0.0048828125;

int st_rl = 0;
String st_lamp = 0;

void setup(){
pinMode(Rele1,OUTPUT);
pinMode(Rele2,OUTPUT);
Serial.begin(9600);
}

void loop(){
char c = Serial.read();

for(int i=500; i>0; i--)
{
sensorValue_aux = (analogRead(sensorPin) -511); // le o sensor na pino analogico A0 e ajusta o valor lido ja que a saída do sensor é vcc/2 para corrente =0
sensorValue += pow(sensorValue_aux,2); // soam os quadardos das leituras no laco
}

sensorValue = (sqrt(sensorValue/ 500)) * voltsporUnidade; // finaliza o calculo da méida quadratica e ajusta o valor lido para volts
currentValue = (sensorValue/66)*1000; // calcula a corrente considerando a sensibilidade do sernsor (66 mV por amper)


if (currentValue < 0.10){
st_lamp = "Lampada apagada";
}
else{
st_lamp = "Lampada ligada";
}

if (c == 's'){
Serial.print ("Valor do st: ");
Serial.print (st_rl);
Serial.print (" Corrente: ");
Serial.print (currentValue);
Serial.print (" Status da lampada: ");
Serial.println (st_lamp);
}
if (c == 'a'){
if (st_rl == 0){
digitalWrite(Rele1, HIGH);
Serial.print ("Valor anterior do st: ");
Serial.print (st_rl);
Serial.print (" Status anterior da lampada: ");
Serial.print (st_lamp);
st_rl = 1;
Serial.print (" Valor do st mudado para: ");
Serial.print (st_rl);
Serial.print (" Status atual da lampada: ");
Serial.println (st_lamp);
}
else{
digitalWrite(Rele1, LOW);
Serial.print ("Valor do st: ");
Serial.print (st_rl);
st_rl = 0;
Serial.print (" Valor do st mudado para: ");
Serial.print (st_rl);
Serial.print (" Status da Lampada: ");
}
}


delay(5000);

}

#############################################

int VQ; //2.5 volts na saída quando corrente for 0A
int ACSPin = A2;
void setup() {
Serial.begin(9600);
VQ = determineVQ(ACSPin);
delay(1000);
}
void loop() {
Serial.print("ACS712@A2:");Serial.print(readCurrent(ACSPin),3);Serial.println(" mA");
delay(150);
}
int determineVQ(int PIN) {
Serial.print("estimating avg. quiscent voltage:");
long VQ = 0;
//read 5000 samples to stabilise value
for (int i=0; i<10000; i++)
{
VQ += abs(analogRead(PIN));
delay(1);
}

VQ /= 10000;
Serial.print(map(VQ, 0, 1023, 0, 5000));Serial.println(" mV");
return int(VQ);
}
float readCurrent(int PIN) {
int current = 0;
int sensitivity = 66;//sensibilidade para o sensor de 30 A
for (int i=0; i<50; i++)
{
current += abs(analogRead(PIN)) - VQ;
delay(1);
}
current = map(current/50, 0, 1023, 0, 5000);
return float(current)/sensitivity;
}

############################################################

const int sensorPin = A4;
float sensorValue_aux = 0;
float sensorValue = 0;
float currentValue = 0;
float voltsporUnidade = 0.0048828125;


void setup() {

Serial.begin(9600);
}


void loop() {


for(int i=500; i>0; i--)
{
sensorValue_aux = (analogRead(sensorPin) -511); // le o sensor na pino analogico A0 e ajusta o valor lido ja que a saída do sensor é vcc/2 para corrente =0
sensorValue += pow(sensorValue_aux,2); // soam os quadardos das leituras no laco
}

sensorValue = (sqrt(sensorValue/ 500)) * voltsporUnidade; // finaliza o calculo da méida quadratica e ajusta o valor lido para volts
currentValue = (sensorValue/185)*1000 ; // calcula a corrente considerando a sensibilidade do sernsor (185 mV por amper)

// mostra o resultado no terminal
Serial.print(currentValue);
Serial.print("\n" );

sensorValue =0;
delay(1000);
}

Exibições: 12339

Responder esta

Respostas a este tópico

Obrigado!

Sou um completo novato em Blog.. Entrei no www.blogger.com e fui... tomando coro da formatação de textos e figuras!!! 

Achei um pouco trabalhoso... não tenho mania de escrever, muitas vezes tentar passar uma informação escrevendo é difícil...

Achei interessante a experiencia recomendo!

Em um fórum as informações ficam dispersas em um blog vc pode compilar tudo de uma forma mais linear.

Eu decidi tentar fazer por causa do blog do Jason Sachs, principalmente por este post! (gostei da forma como ele escreveu e passou a experiência dele)

http://www.embeddedrelated.com/showarticle/91.php

Pensei em fazer algo mais light, falando sobre estas plaquinhas XINGLINGs na onda open hardware, ARDUINO, etc... Intercalando pequenos projetos a grandes projetos..

Agora blog deu uma empacada no tipo de filtro......

Alexandre, se quiser abra um tópico no Lab sobre o problema da balança com Arduino. 

Posso ajuda-lo.

Qual é o problema atual ?

Vi no Data Sheet do ACS712-30A que o ruido pode ser de até 7mV, isto explica essa variação nas minhas medições, com o AD580 e com o ACS712-30A.

Isso pode ser ruim , quando a corrente for baixa!

E o que eu não gostei , nos outros sensores os ruídos podem ser maiores ! Corresponde a aproximadamente uns 100mA de erro. 

ACS712-30A - ruido : até 7mV

ACS712-20A - ruido : até 11mV

ACS712-05A - ruido : até 21mV

Muito Importante !

E lembrando que a sensibilidade pode variar também, chego a conclusão que todos sensores deverão ser calibrados antes das medições ! 

ACS712-30A - ruido :

Alterei algumas coisas...

http://pastebin.com/qRCDidPf

No proteus esta aparecendo 10% de erro tanto alternado quanto continuo parece que e o modelo do ACS que joga erro na saída!

Tem vários pontos parecendo matematicamente inúteis depois eu retiro! A função escala vai ser bem empírico pelo jeito!

Carlos Machado, ainda não tive tempo de testar os seus códigos, mas assim que eu tiver um tempo , eu farei. 

Estava pensando nos métodos disponíveis para detectar a passagem por zero - definição  de início e fim do semiciclo da senóide. 

No sistema da OpenEnergy eles usam o programa para fazer essa definição. 

Mas lembrei-me que isso é facilmente detectável usando o opto-acoplador H11AA1. 

http://www.vishay.com/docs/83608/h11aa1.pdf

Tenho alguns em casa.

A precisão seria talvez melhor e a saída do opto-acoplador geraria interrupções no Arduino, para iniciar e terminar o calculo das medições de tensão dentro do semiciclo. O problema é que o circuito ficaria maior.

A gente poderia usar um circuito desses , o que acha ?? 

http://sensuino.net/doku.php?id=en:regulation

Encontrei esse russo, que já desenvolveu um dimmer usando os dois chips:

http://forum.homedistiller.ru/index.php?topic=47794.0

Veja o código dele , anexei-o. 

Anexos

Galera, boas notícias !

Baseando-me no código  simplificado desse exemplo usado com o sensor de corrente com bobina, montei um código 

que esta dando ótimos resultados de leitura de corrente :

http://www.seeedstudio.com/wiki/Grove_-_Electricity_Sensor

Esse é código montado por mim , anexei o arquivo com o nome ACS712_GrooveA

http://pastebin.com/8sAQXe6Y

Vejam os resultados aferidos com teste com lampadas incandescentes e um ferro de passar :

Percebam que apenas um bit de diferença na leitura da tensão, faz uma grande diferença na corrente.

Acho que será preciso blindar o cabo que liga o sensor ao Arduino !!

Medições com ACS712-30A


dia 15/ago/2015

Medições Multimetro Fluke 17B+

Tensão REDE = 129,7 Vca (medida)

VCC = 5000 mV / 1024 = 4,8828125

ACS712-30A - Coeficiente estimado = 65,8 mV / A

===========================================

Medição sem carga 

Medicao Maxima = 512
Tensao de Pico = 2500 mV
Vmax ACS712 = 0 mV
V RMS ACS712 = 0 mV
I RMS ACS712 = 0.000 A


===========================================

Lampada Phillips 127 V - 60 W - I Medido = 0,472 A

Medicao Maxima = 520
Tensao de Pico = 2539 mV
Vmax ACS712 = 39 mV
V RMS ACS712 = 28 mV
I RMS ACS712 = 0.420 A

Medicao Maxima = 521
Tensao de Pico = 2544 mV
Vmax ACS712 = 44 mV
V RMS ACS712 = 31 mV
I RMS ACS712 = 0.472 A  >>>  Que beleza !!!


======================================================

Lampada GE 127 V - 40 W - I Medido = 0,326 A


Medicao Maxima = 518
Tensao de Pico = 2529 mV
Vmax ACS712 = 29 mV
V RMS ACS712 = 21 mV
I RMS ACS712 = 0.315 A

Medicao Maxima = 517
Tensao de Pico = 2524 mV
Vmax ACS712 = 24 mV
V RMS ACS712 = 17 mV
I RMS ACS712 = 0.262 A

======================================================

Lampada GE 220 V - 50 W  -  I medido = 0,166 A


Medicao Maxima = 515
Tensao de Pico = 2515 mV
Vmax ACS712 = 15 mV
V RMS ACS712 = 10 mV
I RMS ACS712 = 0.157 A


=======================================================

Ferro de passar Arno 127 V - 1100 W

I = 1100 / 127 = 8,661 A

Medicao Maxima = 675
Tensao de Pico = 3296 mV
Vmax ACS712 = 796 mV
V RMS ACS712 = 563 mV
I RMS ACS712 = 8.553 A

Medicao Maxima = 674
Tensao de Pico = 3291 mV
Vmax ACS712 = 791 mV
V RMS ACS712 = 559 mV
I RMS ACS712 = 8.500 A

Anexos

Estou chegando as seguintes  conclusões :

- Arduino ATmeg328 não tem um conversor com resolução suficiente para medições precisas de pequenos valores de corrente. No meu caso o sensor ACS712-30A pode medir correntes entre +30A e -30A, isto é 60 A pico a pico. Como estou fazendo testes com corrente de menos de 1 A, a precisão é muito pouca. 

- Seria interessante fazer outros testes com o ACS712-05B para medições de menores valores de corrente. 

- Acho que o uso de um cabo blindado entre o sensor e o Arduino, poderá melhorar as medições. 

- Para o uso adequado do sensor ACS712, é necessário fazer antes, aferições na tensão de referência do conversor ADC do Arduino e no coeficiente de sensitividade  do sensor.

José, quando você comenta sobre o ajuste do coeficiente de sensibilidade do sensor, que terá que ser aferido através de medições com Multímetro, onde seria feita essas medições, para que eu possa ajustar com uma maior precisão ?

Como eu tenho o ACS712-30A e o ACS712-05A quero ajusta melhor para o de 5A para pode fazer as medições.

Desde já grato.

Abraço. 

Vitor, sugiro testar com o ACS712-05B pois a carga é menor .
Poderá testa-lo com uma lampada incandescente, por exemplo.

Você tem um multimetro com boa precisão ?

Minha sugestão para testes:

1) Meça com o amperímetro do Multimetro, a corrente na lampada. ( I RMS medido)
Cuidado com curtos e ou choque !
2) Meça a tensão VCC do Arduino ( usada como referência do consversor ADC interno)
3) Ajuste o programa com a sensibilidade padrão - nesse caso 185 mV/A.
4) Faça as medições e calculos para identificar erros.
5) Simule alteração no coeficiente de sensitividade, para a obtenção de um resultado mais preciso.
( pode variar entre 180 e 190 mV/A )

Qualquer dúvida, me avise.

José, antes de fazer o que você falou verifiquei um problema no meu sensor ACS712-05B pois sem carga ele está apresentando uma medição máxima acima de 512.

Medicao Maxima = 525

Medicao Maxima = 522

Medicao Maxima = 521

Medicao Maxima = 526

Medicao Maxima = 524

Medicao Maxima = 531

Cheguei a conclusão que o sensor está com defeito. Pois a medição máxima para o sensor sem carga deveria ser 512. Não é isso mesmo ou estou errado na conclusão ?

Vou fazer os mesmos teste para o ACS712-30A, e retorno com os resultados.

Abraço.

Você mediu a tensão VCC no sensor ACS712 ?  Presumo ser 5,00V 

Mediu com voltimetro a tensão na saida ( Vout) sem carga ? Deveria ser 2,50 V

Pode ser um problema nas ligações, principalmente do terra. 

José, fiz a medição com um Fluke 115 true rms, medir a tensão no sensor ACS712-30A e deu 4,730V. Medir a tensão de saída do sensor (Vout) sem carga e deu 2.374 mV. Medir a tensão do arduino e deu 4,733V (no seu caso estou utilizando um arduino nano atmega328).

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço