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

Celso, testei o seu programa com o meu sensor ACS712-30A,

As medições ficaram muito instáveis. Inseri uma linha entre as medições para ficar mais claro.

Como a corrente é alternada, dependendo do ponto de medição, a leitura vai variar. 

Acho que o sketch terá que fazer  varias medições durante alguns milisegundos, 

e pesquisar a média dos picos de tensão.

Depois pode-se calcular a corrente RMS e potencia RMS. 

O programa deverá  ser mais complexo....


Soma dos quadrados: 41.003013
Média quadratica : 0.003130
Current Value : 0.047420 A


Soma dos quadrados: 1807100.000000
Média quadratica : 0.657030
Current Value : 9.955007 A


Soma dos quadrados: 1476632.625000
Média quadratica : 0.593924
Current Value : 8.998845 A


Soma dos quadrados: 1213964.625000
Média quadratica : 0.538514
Current Value : 8.159311 A


Soma dos quadrados: 1376732.500000
Média quadratica : 0.573481
Current Value : 8.689109 A


Soma dos quadrados: 1730603.500000
Média quadratica : 0.642974
Current Value : 9.742026 A


Soma dos quadrados: 1788748.625000
Média quadratica : 0.653686
Current Value : 9.904332 A


Soma dos quadrados: 1468372.625000
Média quadratica : 0.592260
Current Value : 8.973641 A


Soma dos quadrados: 1203002.625000
Média quadratica : 0.536078
Current Value : 8.122389 A


Soma dos quadrados: 1363866.500000
Média quadratica : 0.570795
Current Value : 8.648413 A


Soma dos quadrados: 1721223.500000
Média quadratica : 0.641229
Current Value : 9.715588 A


Soma dos quadrados: 1779233.625000
Média quadratica : 0.651945
Current Value : 9.877953 A


Soma dos quadrados: 1453117.625000
Média quadratica : 0.589176
Current Value : 8.926904 A


Soma dos quadrados: 1200901.625000
Média quadratica : 0.535609
Current Value : 8.115293 A

Eu usei o meu ferro de passar nos testes>

http://labdegaragem.com/forum/topics/sensor-de-corrente-acs712-com-...

Potência e corrente do Ferro de passar Arno :

    P = V x I      I = P / V = 1100 W / 127 V = 8,66 A 

Celso, fiz algumas alterações no seu programa. 

E me parece que o resultado ficou melhor. 

A corrente que circula no ferro de passar é um pouco instável.

Vou testar com outro aparelho. 

http://pastebin.com/xf9cVmzg

Alterações >

- Dividi o 5V em 1024 e não em 1023. (acho mais correto), 

- Quando eu meço 2,5 (offset) o valor é 512.

- Fiz 1000 medições e não somente 100,

- Acrescentei uma linha em branco, após as medições 

- Atraso de 1 segundo entre cada medição 

Soma dos quadrados: 15156988.000000
Media quadratica : 0.601141
Current Value : 9.108201 A

Soma dos quadrados: 14939722.000000
Media quadratica : 0.596817
Current Value : 9.042685 A

Soma dos quadrados: 14539057.000000
Media quadratica : 0.588760
Current Value : 8.920604 A

Soma dos quadrados: 14425248.000000
Media quadratica : 0.586451
Current Value : 8.885621 A

Soma dos quadrados: 14712503.000000
Media quadratica : 0.592261
Current Value : 8.973656 A

Soma dos quadrados: 14958680.000000
Media quadratica : 0.597196
Current Value : 9.048420 A

Boa José,

Na verdade, mantive esses valores do código que a autora do post forneceu.

Quanto as alterações, faz sentido sim dividir os 5V por 1024. No caso do offset, talvez faça sentido manter 511 pois seria a metade entre 0 e 1023. Porém, na prática, eu faria a calibragem ajustando o 0.

As 1000 amostragens realmente irá melhorar o cálculo da média e a linha em branco irá facilitar a comparação.

Muito obrigado por compartilhar.

Grande abraço,

  'Eiju

Tem toda razão José,

Eu fui na onda do sketch fornecido e até tive esperança de que teria alguma estabilidade.

Na verdade, achei até que ficou mais estável do que eu esperava, levando em conta apenas 10 amostragens.

Nem sei ao certo se ela está tentando medir CA ou CC.

Um ponto que comentou no outro post que eu acho que seria muito interessante é a de retificar e filtrar o sinal fornecido pelo sensor, eliminando assim, a necessidade de converter CA para valor RMS.

Muito obrigado por explicar a teoria e agradeço ainda mais por testar o meu código.

Grande abraço,

  'Eiju

Celso, a Taila esta tentando medir corrente CA.

E tenho pesquisado na web, e percebi que todo mundo esta com o mesmo problema.

Ninguém consegue uma medida precisa e estável. 

Mas chegaremos lá !

Não testei ainda o sketch do Wagner Kuramoto :

http://labdegaragem.com/forum/topics/ajuda-com-o-codigo-do-sensor-a..

ou 

https://forum.sparkfun.com/viewtopic.php?f=6&t=33605&sid=af...

Passei por uma situação parecida (a uns 20 e poucos anos... Usando 8031 a 12Mhz e eprom)  (medir corrente) e digo que retificar é possível, mas exige cuidado. O que acontece é que a corrente, diferente da tensão, não é senoidal. Por ex se vc estiver alimentando uma carga com diodos na entrada a corrente vai ter um pico no momento que os diodos passarem para a condução pra carregar os capacitores. Esse pico pode ser rápido ou não, podem ser maiores ou menores (dependendo do valor dos capacitores e da carga). Se retificar vc mede a mesma coisa (o pico) se ele for rápido ou não... E mede muito mais se os capacitores forem maiores. Essa teoria só funciona se for medir com certas cargas (R,L,C um pouco de cada, etc).

O RMS é a unica saída mesmo.

Ou mais amostras ou melhor algoritmo (quem sabe sincronizado com a rede) ou um integrado que faça a conversão, que seria uma tremenda covardia, mas é o que alguns fabricantes de produtos que não são sensíveis a custo usam.

Vide:

http://cds.linear.com/docs/en/datasheet/1966fb.pdf

http://www.analog.com/media/en/technical-documentation/data-sheets/...

Na época, como não tinhamos sequer como calcular um x^2 em tempo e esses integrados inviabilizariam o produto o esquema usado ficou assim: Trafo de corrente -> Ponte de diodos -> Resistor do trafo de corrente, por onde passava o modulo da corrente. Esse sinal entrava em um filtrinho (AmpOp integrando) e aih ia pro AD. Por ser a corrente media já servia para apresentar a corrente (ou % de carga), que era a forma apresentada no visor, na época. Mas se vc fizer algumas contas é possivel chegar ao valor RMS. 

Na calibração utilizando amperimetros do tipo alicate não trueRMS ficou aceitável. Sequer tinhamos um amperímetro digital trueRMS, na medicão com o amperímetro de ferro móvel que tinhamos ficou aceitável. Fechado o projeto.

Eduardo o panorama dos meus testes é bem diferente do seu  anos atrás.

O equipamento em teste foi um ferro de passar ( corrente resistiva) e ela é senoidal como comprovei na medição com osciloscópio. Vide figura abaixo.

http://labdegaragem.com/forum/topics/sensor-de-corrente-acs712-com-...

Gostei dos links que enviou sobre Conversores de RMS para CC. 

Irei estuda-los.

No Datasheet do ACS712-30A tem um circuito de conversão para CC, que eu ainda não testei. 

Não tenho um multimetro TRUE RMS, mas entendo que sendo o sinal senoidal, a leitura do meu multimetro Fluke 17B+ é confiável. 

Vamos conseguir achar uma solução definitiva !

Obrigado pelo seu feedback. Experiência real é muito importante na solução de problemas difíceis. .

Eduardo, estava estudando o data sheet do AD736 - conversor True RMS para CC que você tinha enviado o  link. Estudei sobre RMS  a mais de 35 anos atrás...

E agora entendi o algoritmo dos Sketchs enviados pela Taila. 

" RMS é uma medida direta do valor de energia ou de aquecimento de uma tensão alternada comparada com a de uma tensão de corrente continua; um sinal de corrente alternada de 1 V RMS produz a mesma quantidade de calor em um resistor como um sinal CC de 1 V.

Matematicamente, o valor eficaz da tensão (RMS)  é definida (usando uma equação simplificada) como:

Isso envolve a quadratura do sinal, considerando a média, e, em seguida, obter a raiz quadrada.

O valor absoluto médio de uma tensão de onda senoidal é 0,636 vezes Vpico; e o valor correspondente rms é 0,707 × Vpico." 

Agora entendo porque os programas não estão funcionando adequadamente. 

Pelo que eu entendi, os programas estão somando todos os valores e não somente as tensões de pico. 

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

Para mim esta tudo errado ! Vou pensar em um novo algoritmo.

Considerações importantes :

http://ave.dee.isep.ipp.pt/~mjf/PubDid/ABC_CECA.PDF

· O valor eficaz não é o mesmo que o valor médio aritmético.

· A relação de raiz quadrada  entre o valor máximo e o valor eficaz só se verifica para CA. Para outras formas de onda, a relação é diferente.

· O valor indicado pelos voltímetros e amperímetros, quando se efetuam medidas em CA, é o valor eficaz.

· Quando é referido um dado valor de uma tensão ou corrente alternada, este será sempre um valor eficaz, salvo se outro for explicitamente mencionado.

Estudo das rotinas do  medidor de tensão/corrente do

             http://openenergymonitor.org

Essa é a Library para Arduino de medição do sensor (no caso é o sensor de bobina),

mas o sinal é similar ao Sensor ACS712.

https://github.com/openenergymonitor/EmonLib

Acho que daqui a gente pode aproveitar muita coisa :

https://github.com/openenergymonitor/EmonLib/blob/master/EmonLib.cpp

Separei o que me interessou: (vou estudar com calma) 


Mais uma falha eu encontrei nesse programas citados para uso com ACS712-30A !

Se a tensão de alimentação do Arduino, não for exatamente 5,00 V cc, as leituras estarão incorretas. 

Vejam isso:

http://provideyourown.com/2012/secret-arduino-voltmeter-measure-bat...

http://hacking.majenko.co.uk/making-accurate-adc-readings-on-arduino

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço