Problema para fechar loop feedback de corrente de 4-20mA e Arduino Due

Olá,

Tenho tentado "interfacear" um Arduino Due com equipamentos industriais e controladores que se comunicam principalmente com 4-20mA analógico.

A ideia principal é, por exemplo, desenvolver um controlador PID no simulink, gerar código C / C ++, carregá-lo no Arduino Due e conectá-lo a um processo industrial real que usa 4-20mA como entrada e como feedback de um transmissor. Este DUE deve ser capaz de enviar 4-20 mA proporcional à saída PID virtual e ler uma tensão analógica proporcional ao feedback de 4-20 mA do transmissor.

Ou eu poderia desenvolver um modelo matemático de um processo industrial no simulink, upar no DUE para controlá-lo em tempo real com um controlador físico, utilizando os mesmos métodos.

Ou ainda usar dois DUEs, um com controlador PID e outro com processo industrial, ambos simulados em tempo real e um controlando o outro.

Para isso, os DUEs devem ter pelo menos dois tipos de circuitos conversores de sinal:

1) Tensão para corrente: Como estou usando os DACs dos DUEs, devo converter 0,55-2,75 V para 4-20 mA.

2) Corrente para tensão: A faixa de tensão de entrada do DUE é 0-3,3V, então, eu preciso converter 4-20mA para 0-3,3V.

Estou trabalhando com duas soluções para esses circuitos. Para o circuito 1 estou usando o IC XTR105 para gerar a corrente e para o circuito 2 estou usando a placa HW-685. Ambos estão funcionando bem (isolados) até agora.

O problema é que, como não tenho nenhum equipamento industrial em casa e minha universidade está fechada por conta da COVID, fica difícil testar com tudo funcionando ao mesmo tempo. Estou tendo que testar usando o último exemplo que dei (dois DUEs, um atuando como um controlador e o outro como um processo). Estou tentando usar todos os circuitos e sei que, ao usar dois DUEs, usar tudo aquilo que envolve conversão de tensão para corrente e corrente para tensão definitivamente não é necessário, mas como precisarei de tudo isso para o equipamento industrial, estou tentando ter certeza de que tudo está funcionando corretamente.


Por favor, consulte o anexo "test_circuit.png" para entender melhor o que vem a seguir..

Como estou tentando testar a comunicação analógica, não estou carregando nenhum código de controlador C / C ++ para a placa. Em vez disso, estou usando um potenciômetro para gerar uma escala virtual 4-20 e pegando isso e escrevendo no DAC0 do Arduino # 1. Isso me dá 0,55-2,75 V como saída para o Arduino # 1.

Usando o XTR105, posso gerar 4-20 mA proporcional a essa escala de 0,55-2,75 V. Mas para isso, preciso alimentar o CI com uma fonte de alimentação externa DC >= 9V. A corrente de saída do XTR105 seria conectada a, digamos, uma válvula que estaria restringindo o fluxo de um líquido para encher um tanque. E um transmissor de nível produziria 4-20 mA proporcional ao nível do líquido. Eu pegaria essa escala de saída e conectaria à placa HW-685 que a converte para 0-3,3 V, tornando possível fechar a malha de controle com o DUE.


Mas, como não tenho nenhum desses equipamentos em casa, estou tentando enviar essa corrente de saída diretamente para a placa HW-685 e conectando a tensão de saída a outro DUE (Arduino # 2). Meu primeiro teste seria dar uma olhada no monitor serial do Arduino # 2 para ver se estou lendo 0-4095 se eu usar o AnalogReadResolution (12) (0-4095 seria proporcional à saída 0-3,3V do HW -685).

Mas aqui chega o primeiro problema: preciso ligar o segundo Arduino com uma fonte de alimentação externa para fornecer voltagem suficiente para a placa HW-685 (através da porta Vin). Parece que está funcionando, mas sempre que eu conecto o cabo USB ao PC (para verificar o monitor serial), o HW-685 para de funcionar corretamente (a tensão de saída da placa cai) como se houvesse algum problema com a tensão de alimentação. Eu não consigo entender porque isso está acontecendo já que a porta Vin deve fornecer a tensão mais alta que a placa está recebendo (fonte de alimentação externa neste caso). Estou suspeitando que a placa está com algum tipo de problema e precisa ser substituída, então comprei mais dois DUEs e estou esperando eles chegarem para testá-la.

Para continuar os testes, conectei um LED ao Arduino # 2 e estou variando o brilho com a tensão de saída do HW-685. Isso é para obter algum tipo de feedback visual de como o Arduino # 2 está interpretando a saída da placa conversora.

Como preciso entender se o loop de feedback funciona (ter um sinal do Arduino # 2, proporcional ao sinal do Arduino # 1, retornando ao Arduino # 1), estou conectando o DAC1 do Arduino # 2 ao Arduino # 1 para verificar seu monitor serial. No final, eu esperava girar o potenciômetro no Arduino # 1 e ver a voltagem vinda do Arduino # 2 variando proporcionalmente. Mas aí vem o segundo problema: sempre que conecto o GND do Arduino # 2 ao Arduino # 1, a saída de corrente de 4-20 mA do circuito do XTR105 cai. Parece que algo está consumindo essa corrente, mas não consigo ver o quê. Consigo até ver uma escala variável no monitor serial, mas não está correta, pois a corrente da escala xtr105 cai (consigo ver a corrente através do display do power supply).

Se alguém precisar verificar o circuito XTR105, consulte o anexo "xtr105.png".

Abaixo, estou colocando os códigos dos Arduinos # 1 e # 2. Eu entendo que há muitas coisas que não são necessárias nesses códigos, como a conversão de 0-4095 para 4-20 e depois a conversão reversa, mas eu esperava que funcionasse mesmo com esse tipo de coisa.

Código Arduino #1:


int pot = A0;
void setup() {
  Serial.begin(9600);
  pinMode(pot,INPUT);
  pinMode(A9,INPUT);
  pinMode(DAC0, OUTPUT);
}

void loop() {
analogReadResolution(12);
analogWriteResolution(12);
EnviaSinal(DAC0, LeSinal(pot, 0));
Serial.println(analogRead(A9));
}

float EnviaSinal(int pino_escrita, float entrada){
  //Função que escalona o sinal de 4-20 para 0-4095 (0-3.3V) e escreve no pino_escrita
  //que deve ser um dos DACS (0.55-2.75V)
  float sinal = (4095.0/16.0)*(entrada - 20.0) + 4095.0;
  analogWrite(pino_escrita, sinal);
}

float LeSinal (int pino_leitura, float offset){
  //Função que le o sinal de 0-4095 (0-3.3V) e escaolona para 4-20
  float sinal = (analogRead(pino_leitura) - 4095.0)*(16.0/4095.0) + 20.0;
  if (sinal < 3.95) {sinal = 4.0;}
  if (sinal > 19.95) {sinal = 20.0;}
  return sinal + offset;
}

Código Arduino #2:

void setup() {
  Serial.begin(9600);
  pinMode(A8,INPUT);
  pinMode(2, OUTPUT);
  pinMode(DAC1, OUTPUT);
}
void loop() {
  analogReadResolution(12);
  analogWriteResolution(12);
  analogWrite(2, analogRead(A8));
  analogWrite(DAC1, analogRead(A8));
}

Exibições: 247

Anexos

Responder esta

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço