add fibre HWIL tests

This commit is contained in:
Samuel Sadok
2020-06-10 14:05:52 +02:00
parent 61bc1322d1
commit 6380c2b201
3 changed files with 66 additions and 0 deletions
+1
View File
@@ -17,6 +17,7 @@ The testing facility consists of the following components:
- `can_test.py`: Partial coverage of the commands described in [CAN Protocol](can-protocol)
- `closed_loop_test.py`: Velocity control, position control (TODO: sensorless control), brake regen current hard limit, current control with velocity limiting
- `encoder_test.py`: Incremental encoder, hall effect encoder, sin/cos encoder, SPI encoders (AMS, CUI)
- `fibre_test.py`: General USB protocol tests
- `nvm_test.py`: Configuration storage
- `pwm_input_test.py`: PWM input
- `step_dir_test.py`: Step/dir input
+56
View File
@@ -0,0 +1,56 @@
import test_runner
import time
from fibre.utils import Logger
from odrive.enums import *
from test_runner import *
class FibreFunctionalTest():
"""
Tests basic protocol functionality.
"""
def get_test_cases(self, testrig: TestRig):
return testrig.get_components(ODriveComponent)
def run_test(self, odrive: ODriveComponent, logger: Logger):
# Test property read/write
odrive.handle.test_property = 42
test_assert_eq(odrive.handle.test_property, 42)
odrive.handle.test_property = 0xffffffff
test_assert_eq(odrive.handle.test_property, 0xffffffff)
# Test function call
val = odrive.handle.get_adc_voltage(0)
test_assert_within(val, 0.01, 3.29)
# Test custom setter (aka property write hook)
odrive.handle.axis0.motor.config.phase_resistance = 1
odrive.handle.axis0.motor.config.phase_inductance = 1
odrive.handle.axis0.motor.config.current_control_bandwidth = 1000
old_gain = odrive.handle.axis0.motor.current_control.p_gain
test_assert_eq(old_gain, 1000, accuracy=0.0001) # must be non-zero for subsequent check to work
odrive.handle.axis0.motor.config.current_control_bandwidth /= 2
test_assert_eq(odrive.handle.axis0.motor.current_control.p_gain, old_gain / 2, accuracy=0.0001)
class FibreBurnInTest():
"""
Tests continuous usage of the protocol.
"""
def get_test_cases(self, testrig: TestRig):
return testrig.get_components(ODriveComponent)
def run_test(self, odrive: ODriveComponent, logger: Logger):
data = record_log(lambda: [odrive.handle.vbus_voltage], duration=10.0)
expected_data = np.mean(data[:,1]) * np.ones(data[:,1].size)
test_curve_fit(data, expected_data, max_mean_err = 0.1, inlier_range = 0.5, max_outliers = 0)
if __name__ == '__main__':
test_runner.run([
FibreFunctionalTest(),
FibreBurnInTest(),
])
+9
View File
@@ -89,6 +89,15 @@ class TestUartAscii():
response = int(ser.readline().strip())
test_assert_eq(response, 12345)
# Test custom setter (aka property write hook)
odrive.handle.axis0.motor.config.phase_resistance = 1
odrive.handle.axis0.motor.config.phase_inductance = 1
odrive.handle.axis0.motor.config.current_control_bandwidth = 1000
old_gain = odrive.handle.axis0.motor.current_control.p_gain
test_assert_eq(old_gain, 1000, accuracy=0.0001) # must be non-zero for subsequent check to work
ser.write('w axis0.motor.config.current_control_bandwidth {}\n'.format(odrive.handle.axis0.motor.config.current_control_bandwidth / 2).encode('ascii'))
test_assert_eq(ser.readline(), b'')
test_assert_eq(odrive.handle.axis0.motor.current_control.p_gain, old_gain / 2, accuracy=0.0001)
# Test 'c', 'v', 'p', 'q' and 'f' commands