From ec8386b84b971f193de075d1ddc26902924eb35f Mon Sep 17 00:00:00 2001
From: Clement Remi <remi.clement@irstea.fr>
Date: Sat, 2 Apr 2022 19:12:17 +0200
Subject: [PATCH] Update Ohmpi.py, adding the auto gain fonction for  a better
 measurement of R

---
 ohmpi.py | 36 ++++++++++++++++++++++++++++++++++--
 1 file changed, 34 insertions(+), 2 deletions(-)

diff --git a/ohmpi.py b/ohmpi.py
index 0d3ce969..ce464b50 100644
--- a/ohmpi.py
+++ b/ohmpi.py
@@ -359,6 +359,19 @@ class OhmPi(object):
                 self.switch_mux(j, 'off', roles[i])
         self.log_exec('All MUX switched off.', level='debug')
 
+    def gain_auto(self,channel):
+        gain=2/3
+        if ((abs(channel.voltage)<2.040) and (abs(channel.voltage)>=1.023)):
+            gain=2
+        elif ((abs(channel.voltage)<1.023) and (abs(channel.voltage)>=0.508)):
+            gain=4
+        elif ((abs(channel.voltage)<0.508) and (abs(channel.voltage)>=0.250)):
+            gain=8
+        elif abs(channel.voltage)<0.256:
+            gain=16
+        #print(gain)
+        return gain       
+
     def run_measurement(self, quad, nb_stack=None, injection_duration=None):  # NOTE: quad not used?!
         """ Do a 4 electrode measurement and measure transfer resistance obtained.
 
@@ -392,6 +405,25 @@ class OhmPi(object):
         pin1.direction = Direction.OUTPUT
         pin0.value = False
         pin1.value = False
+
+        # FUNCTION AUTOGAIN
+        # ADS1115 for current measurement (AB)
+        self.ads_current = ads.ADS1115(self.i2c, gain=2/3, data_rate=860, address=0x48)
+        # ADS1115 for voltage measurement (MN)
+        self.ads_voltage = ads.ADS1115(self.i2c, gain=2/3, data_rate=860, address=0x49)
+        # try auto gain
+        pin1.value = True
+        pin0.value = False
+        time.sleep(injection_duration)
+        gain_current=self.gain_auto(AnalogIn(self.ads_current,ads.P0))
+        gain_voltage=self.gain_auto(AnalogIn(self.ads_voltage,ads.P0,ads.P1))      
+        pin0.value = False
+        pin1.value = False
+        print(gain_current)
+        print(gain_voltage)
+        self.ads_current = ads.ADS1115(self.i2c, gain=gain_current, data_rate=860, address=0x48)
+        self.ads_voltage = ads.ADS1115(self.i2c, gain=gain_voltage, data_rate=860, address=0x49)
+
         
         # TODO I don't get why 3 + 2*nb_stack - 1? why not just rnage(nb_stack)?
         # or do we consider 1 stack = one full polarity? do we discard the first 3 readings?
@@ -412,9 +444,9 @@ class OhmPi(object):
             for k in range(0, self.nb_samples):
                 # reading current value on ADS channel A0
                 meas[k, 0] = (AnalogIn(self.ads_current, ads.P0).voltage*1000) / (50 * self.r_shunt)
-                meas[k, 1] = AnalogIn(self.ads_voltage, ads.P0).voltage * self.coef_p2 * 1000
+                meas[k, 1] = AnalogIn(self.ads_voltage, ads.P0, ADS.P1).voltage * self.coef_p2 * 1000
                 # reading voltage value on ADS channel A2
-                meas[k, 2] = AnalogIn(self.ads_voltage, ads.P1).voltage * self.coef_p3 * 1000
+                #meas[k, 2] = AnalogIn(self.ads_voltage, ads.P1).voltage * self.coef_p3 * 1000
 
             # stop current injection
             pin1.value = False
-- 
GitLab