[Resolvido] Ajuda - ESP32 com ethernet LAN8720 - Problemas com leitura do sensor de corrente SCT-013-020

Olá meus caros! Tudo bem?

Meu primeiro post aqui no fórum do LDG! Sempre estive olhando os tópicos, porém nunca postei nenhum. Vamos lá!

Estou desenvolvendo um projeto com o ESP32 onde meço a corrente elétrica de um equipamento e comando o mesmo. Posso trabalhar com o ESP32 em dois modos de conexão: WiFi e ethernet.

No modo WiFi tudo funciona perfeitamente, porém quando altero o modo de conexão para ethernet, a medição da corrente fica incorreta. 

Por exemplo: Normalmente o equipamento consome 1A medindo no multímetro e com o SCT-013-020 no ESP32 em modo WiFi. Quando troco a conexão para ethernet, o ESP32 mede 5A, 6A. E isso se repete quando meço o consumo de outros equipamentos também.

O esquema de ligação da placa de rede é exatamente esse: https://sautter.com/blog/ethernet-on-esp32-using-lan8720/

Testei alimentar o LAN8720 com uma fonte externa e não usar a 3v3 do ESP32, porém não resolveu. Testei trocar o pino de leitura do sensor SCT-013 por outros ADCs do ESP32 também.

Não sei mais o que tentar. Me ajudem por favor
Obrigado!

[Atualização] Estou usando mongoose-os para o desenvolvimento.

Exibições: 1960

Responder esta

Respostas a este tópico

olá Rubens.

      Para analisar melhor o seu caso, é necessário que vc post mais informações sobre seu Hardware. Não precisa ser o circuito completo, mas ao mesmo a parte relacionada à polarização e conexão do sensor de corrente.

      Para dar uma luz, dê uma olhada neste tópico aqui no LDG, onde eu analisei um Sistema que também usa o mesmo Sensor.

      Neste tópico:   "uso do SCT-013"

      O link anterior, é para o tópico inicial.  Uma implementação mais objetiva neste mesmo tópico, está neste link:  "exemplo do SCT-013 com UNO"

      Abrçs,

      Elcids

Olá Elcids! Obrigado pela resposta

Esse é o circuito que estou usando para o sct-013, porém o resistor de carga é um de 97ohm. A tensão que estou alimentando o circuito é de 5V.

Estou fazendo alguns testes aqui e percebi que após inicializar a LAN8720, o vref do adc aparenta estar maior, pois deixei o pino do sensor desconectado e vi que no wifi o valor da corrente fica 0, porém com a ethernet o valor da corrente não fica menor que 2,5...

O código para calcular a corrente é esse:

double calculaIRms(unsigned int amostras) {

    for(unsigned int n = 0; n < amostras; n++)
    {
        sampleI = mgos_adc_read(34);
        offsetI = (2048 + (sampleI-2048)/1024);
        filteredI = sampleI - offsetI;
        sqI = filteredI * filteredI;
        sumI += sqI;
      }
    double I_RATIO = ICAL * (5.0 / 4095.0);
    LOG(LL_INFO, ("ICAL - %f", ICAL));
    LOG(LL_INFO, ("I_RATIO - %f", I_RATIO));
    LOG(LL_INFO, ("ADC READ - %f", sumI));
    Irms = I_RATIO * sqrt(sumI / amostras);
    LOG(LL_INFO, ("Irms - %f", Irms));
    sumI = 0;

    return Irms;
}
Basicamente, esse código foi copiado da biblioteca emonlib e adaptado para a minha situação.
Na linha onde printo a variável sumI, quando o wifi está conectado o valor é um e quando a ethernet está conectada o valor é bem maior, então o que está alterando mesmo é o valor lido no adc_read.

olá Rubens.

      Antes de tudo,  preciso fazer uma observação sobre o Sensor de Corrente.  Não atentei que o modelo específico do seu Sensor é o SCT-013-020.  Veja a Tabela a seguir, onde a faixa de sinal é mostrada para os diversos modelos SCT-013, e onde evidenciei (na cor rosa) o modelo SCT-013-020:

(clique na figura para "zoom")

      Veja que o modelo SCT-013-020  é do tipo "saída de tensão".  Isso apenas significa que este Sensor já possui um Resistor  entre os pinos de saída do transformador de corrente,  o que implica que vc  não precisa acrescentar  um outro Resistor na saída.  Este Resistor interno já existente,  propicia que a saída tenha um "span" de 1V  para uma faixa de medição de 20A.  Em outras palavras:  para uma corrente de 0A (zero Amper) a tensão entre os pinos de saída do SCT-013-020 será de 0V (zero Volts),  e para uma corrente de 20A  a tensão de saída será de 1V.

      Isto é importante, pois se vc conectar outro Resistor em paralelo com os pinos de saída,  resultará em um achatamento não linear  da faixa da tensão de saída (a qual neste caso sempre resultará ser menor que 1V). Então para o SCT-013-020, é melhor deixar a saída aberta, sem Resistor adicional conectado em paralelo com a mesma. Atente a isto, uma vez que vc disse estar colocando um Resistor de 97 Ohms.

      Mas isto não muda a questão da adequação do sinal para que o mesmo seja melhor convertido através do ADC (seja Arduino UNO, seja ESP32, seja qualquer outra CPU). Me refiro à polarização com dois Resistores formando um divisor de tensão, a fim de gerar um "GND Virtual".  Este circuito de adequação pode e deve continuar a ser usado.  Mas a qualidade da aquisição de sinal pode ser aprimorada, uma vez que conhecemos a faixa de sinal (1V)  e principalmente a faixa de frequência desse sinal, neste caso 60 Hz (frequência da Rede Elétrica AC). Ou seja pode-se acrescentar um Filtro "anti-Alising",  a fim de evitar problemas "insolúveis"  em termos de ruídos indesejados. Mas isto é bem simples de fazer e posso te mostrar posteriormente como implementá-lo (e isto depende totalmente da Taxa de Amostragem, da qual falo mais adiante).

      Agora voltando à questão do seu problema de medição em si.

      Eu analisei o Hardware de conexão do módulo LAN8720, descrito pelo Frank Sautter (no link que vc forneceu).  Observe que o LAN8720  não é  um módulo Ethernet como vc descreveu. Ele é apenas um "PHY" (como eu já desconfiava), e capaz de operar no modo "RMII", o que implica que ele é a camada física mais baixa da Interface Ethernet.  Mas isto é apenas um esclarecimento.  E como eu disse, analisei a conexão de Hardware do módulo LAN8720  que o tal Frank implementou. Ela está correta, e inclusive aquela "gambi" que ele fez para contornar a questão do CLK do RMII e do GPIO0  do Boot do ESP32 também está ok (há uma ressalva, mas falo sobre isso logo adiante).

      No entanto, acho que seria mais robusto alimentar o módulo LAN8720 com um Regulador de 3.3V  separado (pode ser um regulador idêntico ao já existente na placa do ESP32). Para tal, aconselho aquelas plaquinhas que possuem algo como o AMS1117-3.3,  pois elas já possuem os Capacitores necessários. E o uso de um Regulador separado,  evitará problemas posteriores caso vc precise "expandir" seu Sistema.

      Sobre aquela "gambi" que o tal Frank fez no Hardware, fique atento. Nem todos os Módulos Osciladores  "prontos" possuem o "Enable" do sinal de saída. Veja que no próprio circuito original do Módulo LAN8720,  isto não está previsto, conforme evidencio na figura mostrada a seguir:

(clique na figura para "zoom")

      Assim se este "Enable" não existir,  a "gambi" não terá efeito.  E eventualmente um lote ou outro do Módulo poderá ter sido montado com um Oscilador sem o Enable (já que esta característica não é utilizada no circuito original do Módulo).

      Também analisei também o trecho de código que vc postou da parte do cáculo do valor RMS da Corrente, e me parece que está Ok.  Mas há um outro problema:  da forma como vc está fazendo, não caracteriza uma Aquisição temporizada,  a qual é absolutamente  necessária, visto que a Corrente aquisitada tem uma frequência de 60Hz.  Logo, se vc não temporizar a Aquisição dos Samples, de forma que a Taxa de Amostragem  seja coerente com o sinal de 60Hz,  vai implicar que vc pode ter valores errôneos. E esses erros serão totalmente dependentes dos códigos executados no background do ESP32 (ou seja: difícil ou praticamente impossível de prever).  Então, vc precisa mudar isto,  o que é bastante simples também. Claro, essa adequação deve estar conforme o funcionamento do ambiente do Mongoose-OS (que vc disse estar usando).  Mas precisa ser feito, do contrário seu Sistema de Aquisição estará "ao vento".  E note: não é porque já funcionou em uma situação, que irá funcionar em outras.

      Mas também há grande possibilidade de haver alguma coisa inadequada no seu Hardware, especificamente no circuito de conexão do SCT-013-020  até o ESP32.  Coloque aqui como está esta conexão, e assim poderei dizer se ela está ok ou não.  Além disso me permitirá calcular e te mostrar como acrescentar um Filtro anti-Alising para o sinal a ser aquisitado (não se preocupe, é simples e de muito baixo custo).  Mas por favor:  coloque um desenho, ou um diagrama, ou uma foto que seja claro e não deixe dúvidas sobre um ou outro ponto (porque é muito ruim analisar coisas que não estão realmente claras em termos de circuito).

      Segue o esquemático do Módulo LAN8720:   "LAN8720-Schematic.pdf"

      Abrçs

      Elcids

Olá Elcids!

Perdão pela demora para atualizar. O prazo do projeto está apertado e não tive tempo de atualizar este tópico.

Muito obrigado pela sua resposta e pelo tempo que dedicou tentando me ajudar!

Fiz diversos testes com o ESP32, porém tudo indicou ser uma falha interna do ADC. Alimentei todo o circuito com o 3v3 de um arduino e o sinal do sensor de corrente compartilhei entre o arduino e o ESP32.

Quando o ESP32 no wifi, ambos realizam a leitura correta do sensor, porém quando alterno para ethernet no ESP32, o arduino continua lendo corretamente e o ESP32 faz a leitura errada.

Para poder dar andamento no projeto e não ficar mais batendo a cabeça nesse ponto, adicionei um módulo ADC externo, o ADS1115. Com ele, leu corretamente tanto no wifi como na ethernet.

Obrigado pela dica dos filtros, apliquei e melhorou muito o sinal.

Abraço!

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço