Signal voltage drops when connecting ADC

Hello peeps, I've run into an issue which I can't seem to resolve on my own.

I'm using a Controllino Maxi power, documentation of which can be found Here.
I've connected an DFRobot Gravity analog pH sensor, documentation Here.
The way it's hooked up can't get any easier, The controllino GND to the sensor "-". Vcc to "+". And A9 (although I've tried other Analog pins on the X1 and X2 pin headers) to the sensors "A" output. Like so:

The problem:
When powering the sensor board all seems to read out just fine. 1.5V when put into a 7pH buffer solution, which is expected. However when connecting the sensor "A" pin to the Controllinos "A9" pin, the voltage drops to 1.1 - 1.2 Volts. After trying to search for the awnser online, and scouring through other forums, all I could find was empty hope. The issue seems to be lying at the ADC (or at least the analog pin).
Since the voltage drop seems to be consistent at different voltages, I've given the ADC value an offset (of +70). This as resolved the issue temporarily, but It's not a clean fix.

Anybody any ideas what might cause this behaviour and perhaps how to fix it?
I've also tried contacting the Controllino support, but they're taking their time. So I thought to try my luck here.

Cheers!

Here's my code:
(It's practically the same code given by DFRobot to read out the sensor.)

#include <EEPROM.h>

#define PH_PIN A9
float voltage,phValue,temperature = 25;
DFRobot_PH ph;

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

void loop()
{
    static unsigned long timepoint = millis();
    if(millis()-timepoint>1000U){                  //time interval: 1s
        timepoint = millis();
        //temperature = readTemperature();         // read your temperature sensor to execute temperature compensation
        voltage = analogRead(PH_PIN)+70;  // read the voltage (+70 is to compensate the voltage drop from the ADC)
        Serial.println(voltage);
        voltage = voltage/1024.0*5000;
        phValue = ph.readPH(voltage,temperature);  // convert voltage to pH with temperature compensation
      Serial.print("temperature:");
      Serial.print(temperature,1);
      Serial.print("^C  pH:");
      Serial.println(phValue,2);
      //Serial.print("Voltage: ");
      //Serial.print(voltage);
      //Serial.print("V   | ");
      //Serial.print("Raw Pin data: ");
      //Serial.println(analogRead(PH_PIN));
      //Serial.println(" ");
    }
    ph.calibration(voltage,temperature);           // calibration process by Serail CMD
}

float readTemperature()
{
  //add your code here to get the temperature from your temperature sensor
}```

The sensor is to be used with a Arduino board, which has a very high input impedance.
The PLC has a input voltage divider with resistor to measure higher voltages. Because of those resistors, it has a certain input impedance. That will drop the signal.

They are parts from two different worlds, that do not combine very well.

Can you find a schematic or a number for the input impedance of the Controllino ? No ? Then why use it ?

1 Like

Hey!

Although you're right about the Analog screw terminals having a Voltage devider. The pin headers X1 and X2 do not. The documentation also states that they're meant to be used with 0-5 Volts.
They do however have a "pretection resistor", which is likely what is stealing some of my Voltage away. So thank you for confirming my suspicions!

Would you happen to know of any way to get around this? Hardware or Software wise?

Cheers,
Tristan

A simple op-amp buffer using an LM358 with a 12V supply should work.

1 Like

I should have one laying around, will try it sometime this week. Thanks for the response!

Do they give config info? Is it in series with the input terminal, or from input terminal to ground, or ???

That is the problem, they don't give information.
I have read their forum: https://community.controllino.com/
People ask for information, but never get any.

A protection resistor can not lower the voltage. There is something going on. I don't want to guess without a schematic.

Well, if it's in parallel with an external voltage divider, or loading a high-impedance voltage source, certainly it can. More likely, it's a series resistance (aka 'dumb-ass protection'), but you're right, they're "black-boxing" it, and should be ignored.

@troy457 good luck. It would seem they're not 'into' being forthright with users; it's legal to do so, though it limits the customer base. Guess they're good with that.

Turn off controllino, and measure resistance between A1 and GND to see what you'll get.

1 Like

Have a look at this:

2 Likes

Yes, when searching for "pdf" in the site, the input circuit can be found.
https://www.google.com/search?q=site%3Acontrollino.com+pdf

So there is a 33k resistor to GND and maybe a 22k1 resistor as well. And a 1k protection resistor. I assume that the "X" headers connect between the input circuit and the protection resistor.

The FSA4157 (analog switch) is there to adjust the input divider for a 24V or 12V system ?

Seems like a low value series resitor dropping the voltage from the input signal.

Using a Opamp buffer like Jim suggested worked for me!
I don't really understand why they'd have such a poor protection circuit on the analog header pins. But atleast one can "bypass" it. For those curious I used an MCP6002 with 5Vdd and 0Vss, which work fine since the expected signal voltage will always be around 1,5 - 2,5V.

Thanks to everyone who helped to answer my question.

Cheers!
Tristan

Glad it worked but don’t give all the blame to the Controllino. The MCP6002 isn’t a high output current opamp, so maybe the Grove board is the main problem.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.