From 038be6aa9a2882db877954c1a57bb23ea70b5ad5 Mon Sep 17 00:00:00 2001 From: Eddy Pedroni Date: Thu, 2 Jun 2022 21:51:22 +0200 Subject: Minor improvements --- lab_control/frequency_response.py | 14 +++--- lab_control/measurement.py | 9 ++++ .../test/frequency_response_measurement_test.py | 51 -------------------- lab_control/test/frequency_response_test.py | 56 ++++++++++++++++++++++ lab_control/test/measurement_test.py | 53 ++++++++++++++++++++ 5 files changed, 126 insertions(+), 57 deletions(-) delete mode 100644 lab_control/test/frequency_response_measurement_test.py create mode 100644 lab_control/test/frequency_response_test.py create mode 100644 lab_control/test/measurement_test.py (limited to 'lab_control') diff --git a/lab_control/frequency_response.py b/lab_control/frequency_response.py index af399b1..8d46689 100644 --- a/lab_control/frequency_response.py +++ b/lab_control/frequency_response.py @@ -1,6 +1,6 @@ from lab_control.function_generator import FunctionGenerator from lab_control.oscilloscope import Oscilloscope -from lab_control.measurement import Measurement +from lab_control.measurement import Measurement, getLinearRange class FrequencyResponseMeasurement(Measurement): def __init__(self): @@ -13,13 +13,15 @@ class FrequencyResponseMeasurement(Measurement): self.data = None def measure(self, osc: Oscilloscope, fg: FunctionGenerator) -> None: - frequencyRange = self.maxFrequency - self.minFrequency + frequencies = getLinearRange(self.minFrequency, self.maxFrequency, self.steps) self.data = [] - for i in range(0, self.steps): - frequency = self.minFrequency + i * frequencyRange / (self.steps - 1) - fg.setFrequency(self.functionGeneratorChannel, frequency) + for f in frequencies: + fg.setFrequency(self.functionGeneratorChannel, f) response = osc.measureAmplitude(self.oscilloscopeChannel) - self.data.append((frequency, response)) + self.data.append((f, response)) self.measurementDone = True + + def saveToCSV(self, path: str) -> None: + pass diff --git a/lab_control/measurement.py b/lab_control/measurement.py index 78f393e..eca228d 100644 --- a/lab_control/measurement.py +++ b/lab_control/measurement.py @@ -1,6 +1,15 @@ from lab_control.function_generator import FunctionGenerator from lab_control.oscilloscope import Oscilloscope +def getLinearRange(first: float, last: float, steps: int) -> list[float]: + assert steps > 1, "Linear range requires at least two steps" + diff = last - first + stepSize = diff / (steps - 1) + return [first + i * stepSize for i in range(0, steps)] + class Measurement: def measure(self, osc: Oscilloscope, fg: FunctionGenerator) -> None: pass + + def saveToCSV(self, path: str) -> None: + pass diff --git a/lab_control/test/frequency_response_measurement_test.py b/lab_control/test/frequency_response_measurement_test.py deleted file mode 100644 index 5a73b3e..0000000 --- a/lab_control/test/frequency_response_measurement_test.py +++ /dev/null @@ -1,51 +0,0 @@ -import pytest - -from lab_control.test.mock_lab import MockLab -from lab_control.frequency_response import FrequencyResponseMeasurement - -@pytest.fixture -def mockLab(): - return MockLab() - -@pytest.fixture -def uut(mockLab): - return FrequencyResponseMeasurement() - -def test_frequencyResponseDefaults(uut): - assert uut.minFrequency == 20e0 - assert uut.maxFrequency == 16e3 - assert uut.steps == 50 - assert uut.functionGeneratorChannel == 1 - assert uut.oscilloscopeChannel == 1 - -def test_frequencyResponseRamp(mockLab, uut): - uut.minFrequency = 100.0 - uut.maxFrequency = 200.0 - uut.steps = 11 - uut.functionGeneratorChannel = 1 - uut.oscilloscopeChannel = 1 - - # Expect a ramp response from 0.5 to 1.5 * input amplitude - inputAmplitude = 1.0 - minScale = 0.5 - maxScale = 1.5 - - def testFunction(f: float) -> float: - assert f >= uut.minFrequency and f <= uut.maxFrequency - frequencyPu = (f - uut.minFrequency) / (uut.maxFrequency - uut.minFrequency) - return minScale + maxScale * frequencyPu - - mockLab.connectChannels(uut.functionGeneratorChannel, uut.oscilloscopeChannel) - mockLab.setTestFunction(uut.oscilloscopeChannel, testFunction) - mockLab.setAmplitude(uut.functionGeneratorChannel, inputAmplitude) - mockLab.setOn(uut.functionGeneratorChannel) - - expectedData = [(f, testFunction(f) * inputAmplitude) for f in [100.0, 110.0, 120.0, 130.0, 140.0, 150.0, 160.0, 170.0, 180.0, 190.0, 200.0]] - - assert not uut.measurementDone - assert uut.data == None - - response = uut.measure(mockLab, mockLab) - - assert uut.measurementDone - assert uut.data == expectedData diff --git a/lab_control/test/frequency_response_test.py b/lab_control/test/frequency_response_test.py new file mode 100644 index 0000000..014b4f6 --- /dev/null +++ b/lab_control/test/frequency_response_test.py @@ -0,0 +1,56 @@ +import pytest + +from lab_control.test.mock_lab import MockLab +from lab_control.frequency_response import FrequencyResponseMeasurement +from lab_control.measurement import getLinearRange + +@pytest.fixture +def mockLab(): + return MockLab() + +@pytest.fixture +def uut(mockLab): + return FrequencyResponseMeasurement() + +def prepareRampResponse(uut, mockLab): + # Expect a ramp response from 0.5 to 1.5 * input amplitude + inputAmplitude = 2.0 + minScale = 0.5 + maxScale = 1.5 + + def testFunction(f: float) -> float: + assert f >= uut.minFrequency and f <= uut.maxFrequency + frequencyPu = (f - uut.minFrequency) / (uut.maxFrequency - uut.minFrequency) + return minScale + maxScale * frequencyPu + + mockLab.connectChannels(uut.functionGeneratorChannel, uut.oscilloscopeChannel) + mockLab.setTestFunction(uut.oscilloscopeChannel, testFunction) + mockLab.setAmplitude(uut.functionGeneratorChannel, inputAmplitude) + mockLab.setOn(uut.functionGeneratorChannel) + + return [(f, testFunction(f) * inputAmplitude) for f in getLinearRange(uut.minFrequency, uut.maxFrequency, uut.steps)] + +def test_frequencyResponseDefaults(uut): + assert uut.minFrequency == 20e0 + assert uut.maxFrequency == 16e3 + assert uut.steps == 50 + assert uut.functionGeneratorChannel == 1 + assert uut.oscilloscopeChannel == 1 + +def test_frequencyResponseRamp(mockLab, uut): + uut.minFrequency = 100.0 + uut.maxFrequency = 200.0 + uut.steps = 11 + uut.functionGeneratorChannel = 1 + uut.oscilloscopeChannel = 1 + + expectedData = prepareRampResponse(uut, mockLab) + + assert not uut.measurementDone + assert uut.data == None + + response = uut.measure(mockLab, mockLab) + + assert uut.measurementDone + assert uut.data == expectedData + diff --git a/lab_control/test/measurement_test.py b/lab_control/test/measurement_test.py new file mode 100644 index 0000000..07716a3 --- /dev/null +++ b/lab_control/test/measurement_test.py @@ -0,0 +1,53 @@ +import pytest + +from lab_control.measurement import * + +@pytest.fixture +def uut(): + return Measurement() + +def test_linearRangeAscending(): + first = 100.0 + last = 200.0 + steps = 11 + + expectedRange = [ + 100.0, 110.0, 120.0, 130.0, + 140.0, 150.0, 160.0, 170.0, + 180.0, 190.0, 200.0 + ] + + actualRange = getLinearRange(first, last, steps) + assert actualRange == expectedRange + +def test_linearRangeDescending(): + first = 200.0 + last = 180.0 + steps = 3 + + expectedRange = [ + 200.0, 190.0, 180.0 + ] + + actualRange = getLinearRange(first, last, steps) + assert actualRange == expectedRange + +def test_linearRangeTwoSteps(): + first = 20.0 + last = -20.0 + steps = 2 + + expectedRange = [ + 20.0, -20.0 + ] + + actualRange = getLinearRange(first, last, steps) + assert actualRange == expectedRange + +def test_linearRangeOneStep(): + first = 20.0 + last = -20.0 + steps = 1 + + with pytest.raises(AssertionError): + actualRange = getLinearRange(first, last, steps) -- cgit v1.2.3