James Kuszmaul | 7c8aad6 | 2018-09-08 18:16:18 -0700 | [diff] [blame] | 1 | #!/usr/bin/python3 |
| 2 | import sys |
| 3 | import numpy as np |
| 4 | |
| 5 | # Note on associated data files: |
| 6 | # calib_data_60*.csv has each output channel set at a constant value of 60. |
Brian Silverman | 37a95d6 | 2018-11-09 16:08:32 -0800 | [diff] [blame] | 7 | # calib_data_6030*.csv actuates two channels. |
James Kuszmaul | 7c8aad6 | 2018-09-08 18:16:18 -0700 | [diff] [blame] | 8 | |
Ravago Jones | 5127ccc | 2022-07-31 16:32:45 -0700 | [diff] [blame] | 9 | |
James Kuszmaul | 7c8aad6 | 2018-09-08 18:16:18 -0700 | [diff] [blame] | 10 | def calibrate(fnames): |
Ravago Jones | 5127ccc | 2022-07-31 16:32:45 -0700 | [diff] [blame] | 11 | """Do fitting to calibrate ADC data given csv files. |
James Kuszmaul | 7c8aad6 | 2018-09-08 18:16:18 -0700 | [diff] [blame] | 12 | |
| 13 | CSVs should be of format: |
Brian Silverman | 37a95d6 | 2018-11-09 16:08:32 -0800 | [diff] [blame] | 14 | command_a, command_b, command_c, reading0, reading1, reading2 |
| 15 | The command columns are the on-time for each timer in FTM ticks. |
| 16 | The reading columns in this case are the 3 samples taken from the |
| 17 | ADC (with each pair corresponding to the same measurement pre-averaged). We |
| 18 | only care about the averaged samples because otherwise the solution matrix |
| 19 | can't be solved for in a stable manner. |
James Kuszmaul | 7c8aad6 | 2018-09-08 18:16:18 -0700 | [diff] [blame] | 20 | """ |
Ravago Jones | 5127ccc | 2022-07-31 16:32:45 -0700 | [diff] [blame] | 21 | data = np.zeros((1, 6)) |
| 22 | for fname in fnames: |
| 23 | data = np.vstack((data, np.genfromtxt(fname, delimiter=','))) |
| 24 | data = data[1:, :] |
James Kuszmaul | 7c8aad6 | 2018-09-08 18:16:18 -0700 | [diff] [blame] | 25 | |
Ravago Jones | 5127ccc | 2022-07-31 16:32:45 -0700 | [diff] [blame] | 26 | data = data[:, :6] |
James Kuszmaul | 7c8aad6 | 2018-09-08 18:16:18 -0700 | [diff] [blame] | 27 | |
Ravago Jones | 5127ccc | 2022-07-31 16:32:45 -0700 | [diff] [blame] | 28 | b = data[:, 0:3] |
| 29 | b = b - np.tile(np.mean(b, axis=1), (3, 1)).T |
| 30 | # Vcc / 3000 / R |
| 31 | # 3000 converts duty cycle in FTM ticks to fraction of full. |
| 32 | b *= 20.9 / 3000.0 / 0.0079 |
| 33 | A = data[:, 3:] |
James Kuszmaul | 7c8aad6 | 2018-09-08 18:16:18 -0700 | [diff] [blame] | 34 | |
Ravago Jones | 5127ccc | 2022-07-31 16:32:45 -0700 | [diff] [blame] | 35 | return np.linalg.lstsq(A, b[:])[0].T |
| 36 | |
James Kuszmaul | 7c8aad6 | 2018-09-08 18:16:18 -0700 | [diff] [blame] | 37 | |
| 38 | if __name__ == "__main__": |
Ravago Jones | 5127ccc | 2022-07-31 16:32:45 -0700 | [diff] [blame] | 39 | if len(sys.argv) < 2: |
| 40 | print("Need filenames for data") |
| 41 | sys.exit(1) |
| 42 | print(calibrate(sys.argv[1:])) |