From a7b79916651fecdb9e4aad42a2db00dbdf9b2831 Mon Sep 17 00:00:00 2001 From: RobertGawron Date: Sun, 4 Aug 2019 13:09:51 +0100 Subject: [PATCH 1/6] continous meassurement --- software/Firmware/Src/VoltageSensorActualValue.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/software/Firmware/Src/VoltageSensorActualValue.c b/software/Firmware/Src/VoltageSensorActualValue.c index 79ec09c..a14c4f5 100644 --- a/software/Firmware/Src/VoltageSensorActualValue.c +++ b/software/Firmware/Src/VoltageSensorActualValue.c @@ -9,7 +9,7 @@ #include "PinoutConfiguration.h" #include "UserInterface.h" #include "stm8s_i2c.h" -#include "Logger.h" +//#include "Logger.h" #define I2C_MASTER_ADDRESS 0x10 @@ -30,12 +30,15 @@ void VoltageSensorActualValue_Init() I2C_setup(); // select adc configuration and start measurement - write(0x00); +// write(0x00); + write(0x4c); } bool VoltageSensorActualValue_MeasureValue(VoltageSensorActualValue_MeasurementData_t *measurementData) { + write(0x48); + write(0x10); *measurementData = read(0); @@ -105,6 +108,9 @@ static uint16_t read(uint8_t registerId) uint16_t registerLSB3 = I2C_ReceiveData(); while(!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_RECEIVED)); + uint16_t registerLSB4 = I2C_ReceiveData(); + while(!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_RECEIVED)); + I2C_AcknowledgeConfig(DISABLE); From efd3b0d9472143c7439b675254e667480b812bd2 Mon Sep 17 00:00:00 2001 From: RobertGawron Date: Sun, 4 Aug 2019 13:37:03 +0100 Subject: [PATCH 2/6] removed magic numbers --- .../Firmware/Src/VoltageSensorActualValue.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/software/Firmware/Src/VoltageSensorActualValue.c b/software/Firmware/Src/VoltageSensorActualValue.c index a14c4f5..1546486 100644 --- a/software/Firmware/Src/VoltageSensorActualValue.c +++ b/software/Firmware/Src/VoltageSensorActualValue.c @@ -9,7 +9,6 @@ #include "PinoutConfiguration.h" #include "UserInterface.h" #include "stm8s_i2c.h" -//#include "Logger.h" #define I2C_MASTER_ADDRESS 0x10 @@ -18,6 +17,15 @@ // is used to signalize communication direction (rx or tx) #define I2C_SLAVE_ADDRESS (0x68u << 1) +#define MCP3425_REG_BIT_READY (1 << 7) +#define MCP3425_REG_BIT_CONVERSION (1 << 4) +#define MCP3425_REG_BIT_SAMPLE_RATE_UPPER (1 << 3) +#define MCP3425_REG_BIT_SAMPLE_RATE_LOWER (1 << 2) +#define MCP3425_REG_BIT_GAIN_UPPER (1 << 1) +#define MCP3425_REG_BIT_GAIN_LOWER (1 << 0) + +#define MCP3425_CONFIGURATION (MCP3425_REG_BIT_READY | MCP3425_REG_BIT_SAMPLE_RATE_UPPER) + static void GPIO_setup(void); static void I2C_setup(void); static void write(uint8_t registerId); @@ -28,16 +36,13 @@ void VoltageSensorActualValue_Init() { GPIO_setup(); I2C_setup(); - - // select adc configuration and start measurement -// write(0x00); - write(0x4c); } bool VoltageSensorActualValue_MeasureValue(VoltageSensorActualValue_MeasurementData_t *measurementData) { - write(0x48); + // select adc configuration and start measurement + write(MCP3425_CONFIGURATION); write(0x10); *measurementData = read(0); @@ -125,7 +130,6 @@ static uint16_t read(uint8_t registerId) Logger_Print( registerLSB3); */ -// printf("data: %d %d %d %d %d\r\n", registerMSB, registerLSB, registerLSB1, registerLSB2, registerLSB3); uint16_t registerValue = (registerMSB << 8) + registerLSB; return registerValue; From fc175b8af7e33ba8288992794f28449d51bee4e1 Mon Sep 17 00:00:00 2001 From: RobertGawron Date: Sun, 4 Aug 2019 14:49:41 +0100 Subject: [PATCH 3/6] removed magic numbers --- software/Firmware/Src/VoltageSensorActualValue.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/software/Firmware/Src/VoltageSensorActualValue.c b/software/Firmware/Src/VoltageSensorActualValue.c index 1546486..a42843b 100644 --- a/software/Firmware/Src/VoltageSensorActualValue.c +++ b/software/Firmware/Src/VoltageSensorActualValue.c @@ -24,7 +24,10 @@ #define MCP3425_REG_BIT_GAIN_UPPER (1 << 1) #define MCP3425_REG_BIT_GAIN_LOWER (1 << 0) -#define MCP3425_CONFIGURATION (MCP3425_REG_BIT_READY | MCP3425_REG_BIT_SAMPLE_RATE_UPPER) +//#define MCP3425_CONFIGURATION (MCP3425_REG_BIT_READY | MCP3425_REG_BIT_SAMPLE_RATE_UPPER) +#define MCP3425_CONFIGURATION (MCP3425_REG_BIT_READY | MCP3425_REG_BIT_SAMPLE_RATE_LOWER) + +#define MCP3425_READ_MEASSUREMENT 0x10 static void GPIO_setup(void); static void I2C_setup(void); @@ -44,7 +47,7 @@ bool VoltageSensorActualValue_MeasureValue(VoltageSensorActualValue_MeasurementD // select adc configuration and start measurement write(MCP3425_CONFIGURATION); - write(0x10); + write(MCP3425_READ_MEASSUREMENT); *measurementData = read(0); // getRegisterValue should return false on timeout and this should be later propagated to GUI component @@ -61,6 +64,7 @@ void GPIO_setup(void) void I2C_setup(void) { + // TODO magic numbers I2C_DeInit(); I2C_Init(100000, I2C_MASTER_ADDRESS, From 6ca21c39e720133aba180b412187d28efed173e8 Mon Sep 17 00:00:00 2001 From: RobertGawron Date: Sun, 4 Aug 2019 14:50:19 +0100 Subject: [PATCH 4/6] adc logic moved to separate script --- .../DataAcquisitionFromDevice/datalogger.py | 10 ++++---- software/DataAcquisitionFromDevice/mcp3425.py | 23 +++++++++++++++++++ 2 files changed, 27 insertions(+), 6 deletions(-) create mode 100644 software/DataAcquisitionFromDevice/mcp3425.py diff --git a/software/DataAcquisitionFromDevice/datalogger.py b/software/DataAcquisitionFromDevice/datalogger.py index ecf0e7c..862432d 100644 --- a/software/DataAcquisitionFromDevice/datalogger.py +++ b/software/DataAcquisitionFromDevice/datalogger.py @@ -1,5 +1,6 @@ from serial import Serial import datetime +import mcp3425 myDeviceId = '/dev/ttyUSB0' myBaudrate = 9600 @@ -10,17 +11,14 @@ logFile = open('data.log', 'w') logFile.write("Time,Counter\n") while True: - #dataIn = int(ord(ser.readline().strip())) dataIn = ser.readline().strip() - msb = dataIn[0] - lsb = dataIn[1] - voltage = ((dataIn[0] & 0xf) << 8) | lsb; + (msb, lsb) = (dataIn[0], dataIn[1]) + voltage = mcp3425.convert(msb, lsb, mcp3425.MCP3425_RESOLUTION.R14) now = datetime.datetime.now() + logFile.write("{0},{1}\n".format(now, dataIn)) logFile.flush() - print(dataIn) print(voltage) - diff --git a/software/DataAcquisitionFromDevice/mcp3425.py b/software/DataAcquisitionFromDevice/mcp3425.py new file mode 100644 index 0000000..93be9b1 --- /dev/null +++ b/software/DataAcquisitionFromDevice/mcp3425.py @@ -0,0 +1,23 @@ +# based on https://ww1.microchip.com/downloads/en/DeviceDoc/22072b.pdf +# assumed that gain = 1 + +from enum import Enum +class MCP3425_RESOLUTION(Enum): + R12 = 1 + R13 = 2 + R14 = 3 + +def convert(upperByte, lowerByte, resolution): + digitalToAnalog = lambda value, lsb, pga: (value * (lsb / pga)) + + digitalOutput = (upperByte << 8) | lowerByte; + + + if resolution == MCP3425_RESOLUTION.R12: + return digitalToAnalog(digitalOutput, (1 * 0.01), 1) + + if resolution == MCP3425_RESOLUTION.R13: + return digitalToAnalog(digitalOutput, (250 * 0.00001), 1) + + if resolution == MCP3425_RESOLUTION.R14: + return digitalToAnalog(digitalOutput, (62.5 * 0.0001), 1) From d909000c14c9a2446ac513b949232c786d7afaf4 Mon Sep 17 00:00:00 2001 From: RobertGawron Date: Sun, 4 Aug 2019 14:51:45 +0100 Subject: [PATCH 5/6] minor formatting changes --- software/DataAcquisitionFromDevice/mcp3425.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/software/DataAcquisitionFromDevice/mcp3425.py b/software/DataAcquisitionFromDevice/mcp3425.py index 93be9b1..4b2fc42 100644 --- a/software/DataAcquisitionFromDevice/mcp3425.py +++ b/software/DataAcquisitionFromDevice/mcp3425.py @@ -2,6 +2,7 @@ # assumed that gain = 1 from enum import Enum + class MCP3425_RESOLUTION(Enum): R12 = 1 R13 = 2 @@ -12,7 +13,6 @@ def convert(upperByte, lowerByte, resolution): digitalOutput = (upperByte << 8) | lowerByte; - if resolution == MCP3425_RESOLUTION.R12: return digitalToAnalog(digitalOutput, (1 * 0.01), 1) @@ -21,3 +21,4 @@ def convert(upperByte, lowerByte, resolution): if resolution == MCP3425_RESOLUTION.R14: return digitalToAnalog(digitalOutput, (62.5 * 0.0001), 1) + From 4d1c84b757646ed5d147f0fa14bf8553928f1087 Mon Sep 17 00:00:00 2001 From: RobertGawron Date: Sun, 4 Aug 2019 15:18:29 +0100 Subject: [PATCH 6/6] i2c works, this time for real --- software/DataAcquisitionFromDevice/mcp3425.py | 4 ++-- software/Firmware/Src/VoltageSensorActualValue.c | 5 +---- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/software/DataAcquisitionFromDevice/mcp3425.py b/software/DataAcquisitionFromDevice/mcp3425.py index 4b2fc42..02c50bf 100644 --- a/software/DataAcquisitionFromDevice/mcp3425.py +++ b/software/DataAcquisitionFromDevice/mcp3425.py @@ -17,8 +17,8 @@ def convert(upperByte, lowerByte, resolution): return digitalToAnalog(digitalOutput, (1 * 0.01), 1) if resolution == MCP3425_RESOLUTION.R13: - return digitalToAnalog(digitalOutput, (250 * 0.00001), 1) + return digitalToAnalog(digitalOutput, (250 * 0.000001), 1) if resolution == MCP3425_RESOLUTION.R14: - return digitalToAnalog(digitalOutput, (62.5 * 0.0001), 1) + return digitalToAnalog(digitalOutput, (62.5 * 0.00001), 1) diff --git a/software/Firmware/Src/VoltageSensorActualValue.c b/software/Firmware/Src/VoltageSensorActualValue.c index a42843b..82ec1d1 100644 --- a/software/Firmware/Src/VoltageSensorActualValue.c +++ b/software/Firmware/Src/VoltageSensorActualValue.c @@ -24,9 +24,7 @@ #define MCP3425_REG_BIT_GAIN_UPPER (1 << 1) #define MCP3425_REG_BIT_GAIN_LOWER (1 << 0) -//#define MCP3425_CONFIGURATION (MCP3425_REG_BIT_READY | MCP3425_REG_BIT_SAMPLE_RATE_UPPER) -#define MCP3425_CONFIGURATION (MCP3425_REG_BIT_READY | MCP3425_REG_BIT_SAMPLE_RATE_LOWER) - +#define MCP3425_CONFIGURATION (MCP3425_REG_BIT_READY | MCP3425_REG_BIT_SAMPLE_RATE_UPPER) #define MCP3425_READ_MEASSUREMENT 0x10 static void GPIO_setup(void); @@ -47,7 +45,6 @@ bool VoltageSensorActualValue_MeasureValue(VoltageSensorActualValue_MeasurementD // select adc configuration and start measurement write(MCP3425_CONFIGURATION); - write(MCP3425_READ_MEASSUREMENT); *measurementData = read(0); // getRegisterValue should return false on timeout and this should be later propagated to GUI component