Commit 19165115 authored by Clement Remi's avatar Clement Remi
Browse files

improve measurement stability

Showing with 3714 additions and 3179 deletions
+3714 -3179
...@@ -16,18 +16,12 @@ print('Vers: 1.50') ...@@ -16,18 +16,12 @@ print('Vers: 1.50')
print('Import library') print('Import library')
import RPi.GPIO as GPIO import RPi.GPIO as GPIO
import time import time , board, busio, numpy, os, sys, json, glob, statistics
from datetime import datetime from datetime import datetime
import board
import busio
import numpy
import os
import sys
import adafruit_ads1x15.ads1115 as ADS import adafruit_ads1x15.ads1115 as ADS
from adafruit_ads1x15.analog_in import AnalogIn from adafruit_ads1x15.analog_in import AnalogIn
import pandas as pd import pandas as pd
import os.path import os.path
import json
from gpiozero import CPUTemperature from gpiozero import CPUTemperature
""" """
display start time display start time
...@@ -38,12 +32,24 @@ print(current_time.strftime("%Y-%m-%d %H:%M:%S")) ...@@ -38,12 +32,24 @@ print(current_time.strftime("%Y-%m-%d %H:%M:%S"))
""" """
hardware parameters hardware parameters
""" """
R_ref = 50.0# reference resistance value in ohm R_ref = 47.2# reference resistance value in ohm
coef_p0 = 2.5009 # slope for current conversion for ADS.P0, measurement in V/V coef_p0 = 2.5009 # slope for current conversion for ADS.P0, measurement in V/V
coef_p1 = 2.4947 # slope for current conversion for ADS.P1, measurement in V/V coef_p1 = 2.4947 # slope for current conversion for ADS.P1, measurement in V/V
coef_p2 = 2.4985 # slope for current conversion for ADS.P2, measurement in V/V coef_p2 = 2.4985 # slope for current conversion for ADS.P2, measurement in V/V
coef_p3 = 2.4994 # slope for current conversion for ADS.P3, measurement in V/V coef_p3 = 2.4994 # slope for current conversion for ADS.P3, measurement in V/V
export_path = "/home/pi/Desktop/measurement.csv" export_path = "/home/pi/Desktop/measurement.csv"
base_dir = '/sys/bus/w1/devices/'
device_folder = glob.glob(base_dir + '28*')[0]
device_file = device_folder + '/w1_slave'
# GPIO initialization
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO.setup(7, GPIO.OUT)
GPIO.setup(8, GPIO.OUT)
integer=5
meas=numpy.zeros((4,integer))
""" """
import parameters import parameters
...@@ -51,6 +57,11 @@ import parameters ...@@ -51,6 +57,11 @@ import parameters
with open('ohmpi_param.json') as json_file: with open('ohmpi_param.json') as json_file:
pardict = json.load(json_file) pardict = json.load(json_file)
i2c = busio.I2C(board.SCL, board.SDA) # I2C protocol setup
ads = ADS.ADS1115(i2c, gain=16,data_rate=860) # I2C communication setup
""" """
functions functions
""" """
...@@ -80,6 +91,20 @@ def find_identical_in_line(array_object): ...@@ -80,6 +91,20 @@ def find_identical_in_line(array_object):
output.append(i) output.append(i)
return output return output
def gain_auto(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
# read quadripole file and apply tests # read quadripole file and apply tests
def read_quad(filename, nb_elec): def read_quad(filename, nb_elec):
output = numpy.loadtxt(filename, delimiter=" ",dtype=int) # load quadripole file output = numpy.loadtxt(filename, delimiter=" ",dtype=int) # load quadripole file
...@@ -99,46 +124,65 @@ def read_quad(filename, nb_elec): ...@@ -99,46 +124,65 @@ def read_quad(filename, nb_elec):
else: else:
return output return output
def read_temp():
f = open(device_file, 'r')
lines = f.readlines()
f.close()
while lines[0].strip()[-3:] != 'YES':
time.sleep(0.2)
lines = read_temp_raw()
equals_pos = lines[1].find('t=')
if equals_pos != -1:
temp_string = lines[1][equals_pos+2:]
temp_c = float(temp_string) / 1000.0
return temp_c
# perform a measurement # perform a measurement
def run_measurement(nb_stack, injection_deltat, Rref, coefp0, coefp1, coefp2, coefp3, elec_array): def run_measurement(nb_stack, injection_deltat, Rref, coefp0, coefp1, coefp2, coefp3, elec_array):
i2c = busio.I2C(board.SCL, board.SDA) # I2C protocol setup start_time = time.time()
ads = ADS.ADS1115(i2c, gain=2/3,data_rate=64) # I2C communication setup
# inner variable initialization # inner variable initialization
sum_I=0 sum_I=0
sum_Vmn=0 sum_Vmn=0
sum_Ps=0 sum_Ps=0
# GPIO initialization # injection courant and measure
GPIO.setmode(GPIO.BCM) t_gain=[0,0]
GPIO.setwarnings(False)
GPIO.setup(7, GPIO.OUT)
GPIO.setup(8, GPIO.OUT)
# resistance measurement
for n in range(0,3+2*nb_stack-1) : for n in range(0,3+2*nb_stack-1) :
# current injection
if (n % 2) == 0: if (n % 2) == 0:
GPIO.output(7, GPIO.HIGH) # polarity n°1 GPIO.output(7, GPIO.HIGH) # polarity n°1
else: else:
GPIO.output(7, GPIO.LOW) # polarity n°2 GPIO.output(7, GPIO.LOW) # polarity n°2
GPIO.output(8, GPIO.HIGH) # current injection GPIO.output(8, GPIO.HIGH) # current injection
time.sleep(injection_deltat) # delay depending on current injection duration time.sleep(injection_deltat) # delay depending on current injection duration
if n==0:
Ia1 = AnalogIn(ads,ADS.P0).voltage * coefp0 # reading current value on ADS channel A0 ads = ADS.ADS1115(i2c, gain=2/3,data_rate=860)
Ib1 = AnalogIn(ads,ADS.P1).voltage * coefp1 # reading current value on ADS channel A1 Tx=AnalogIn(ads,ADS.P0).voltage
Vm1 = AnalogIn(ads,ADS.P2).voltage * coefp2# reading voltage value on ADS channel A2 Tab=AnalogIn(ads,ADS.P1).voltage
Vn1 = AnalogIn(ads,ADS.P3).voltage * coefp3# reading voltage value on ADS channel A3 t_gain=[gain_auto(AnalogIn(ads,ADS.P0,ADS.P1)),gain_auto(AnalogIn(ads,ADS.P2,ADS.P3))]
t_gain=numpy.sort(t_gain)
ads = ADS.ADS1115(i2c, gain=t_gain[1],data_rate=860)
for k in range(0,integer):
meas[0,k] = AnalogIn(ads,ADS.P0,ADS.P1).voltage# reading current value on ADS channel A0
meas[2,k] = AnalogIn(ads,ADS.P2,ADS.P3).voltage # reading voltage value on ADS channel A2
GPIO.output(8, GPIO.LOW)# stop current injection GPIO.output(8, GPIO.LOW)# stop current injection
time.sleep(injection_deltat) # Dead time equivalent to the duration of the current injection pulse startdelay=time.time()
I1= (Ia1 - Ib1)/Rref
sum_I=sum_I+I1
Vmn1= (Vm1 - Vn1)
sum_I=sum_I+numpy.mean(meas[0,:]) * ((coefp0+coefp1)/2)/Rref
Vmn1= numpy.mean(meas[2,:]) * ((coefp2+coefp3)/2)
if (n % 2) == 0: if (n % 2) == 0:
sum_Vmn=sum_Vmn-Vmn1 sum_Vmn=sum_Vmn-Vmn1
sum_Ps=sum_Ps+Vmn1 sum_Ps=sum_Ps+Vmn1
else: else:
sum_Vmn=sum_Vmn+Vmn1 sum_Vmn=sum_Vmn+Vmn1
sum_Ps=sum_Ps+Vmn1 sum_Ps=sum_Ps+Vmn1
time.sleep(injection_deltat - ((time.time() - startdelay) % injection_deltat))
# return averaged values # return averaged values
cpu= CPUTemperature() cpu= CPUTemperature()
output = pd.DataFrame({ output = pd.DataFrame({
...@@ -147,14 +191,19 @@ def run_measurement(nb_stack, injection_deltat, Rref, coefp0, coefp1, coefp2, co ...@@ -147,14 +191,19 @@ def run_measurement(nb_stack, injection_deltat, Rref, coefp0, coefp1, coefp2, co
"B":elec_array[1], "B":elec_array[1],
"M":elec_array[2], "M":elec_array[2],
"N":elec_array[3], "N":elec_array[3],
"Vmn[mV]":[(sum_Vmn/(3+2*nb_stack-1))*1000], "Vmn [mV]":[(sum_Vmn/(3+2*nb_stack-1))*1000],
"Rab":[Ib1/(sum_I/(3+2*nb_stack-1))], "I [mA]":[(sum_I/(3+2*nb_stack-1))*1000],
"Tx":[Ia1], "R [ohm]":[( (sum_Vmn/(3+2*nb_stack-1)/(sum_I/(3+2*nb_stack-1))))],
"I[mA]":[(sum_I/(3+2*nb_stack-1))*1000], "Rab [Ohm]":[(Tab*coefp1)/(sum_I/(3+2*nb_stack-1))],
"R":[( (sum_Vmn/(3+2*nb_stack-1)/(sum_I/(3+2*nb_stack-1))))], "Tx [V]":[Tx*coefp0],
"Ps[mV]":[(sum_Ps/(3+2*nb_stack-1))*1000], "Ps [mV]":[(sum_Ps/(3+2*nb_stack-1))*1000],
"nbStack":[nb_stack], "nbStack":[nb_stack],
"CPU temp [°C]":[cpu.temperature] "CPU temp [°C]":[cpu.temperature],
"Hardware temp [°C]":[read_temp()],
"Time [S]":[(-start_time+time.time())]
# Dead time equivalent to the duration of the current injection pulse
}) })
output=output.round(2) output=output.round(2)
print(output.to_string()) print(output.to_string())
......
from gpiozero import CPUTemperature import psutil
cpu= CPUTemperature() print(psutil.virtual_memory())
print(cpu.temperature) \ No newline at end of file
\ No newline at end of file
This diff is collapsed.
{ {
"nb_electrodes": 32, "nb_electrodes": 32,
"injection_duration": 0.250, "injection_duration": 0.500,
"nbr_meas": 10000, "nbr_meas": 10000,
"sequence_delay": 10, "sequence_delay": 1,
"stack": 30, "stack": 1,
"export_path": "/home/pi/myohmpi/ohmpi1_5/measurement.csv" "export_path": "/home/pi/myohmpi/ohmpi1_5/measurement.csv"
} }
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment