AD4130 Mbed IIO Firmware
Dependencies: tempsensors sdp_k1_sdram
scripts/ad4130_data_capture.py@2:871d585d96ee, 2022-07-15 (annotated)
- Committer:
- MPhalke@MPHALKE-L02.ad.analog.com
- Date:
- Fri Jul 15 17:47:44 2022 +0530
- Revision:
- 2:871d585d96ee
AD4130 firmware - initial commit
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 1 | import numpy |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 2 | from serial import Serial |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 3 | from time import sleep |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 4 | from pynput import keyboard |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 5 | import sys |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 6 | import select |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 7 | import os |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 8 | import csv |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 9 | import math |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 10 | from ad4130 import * |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 11 | |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 12 | # Global variables |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 13 | line = 0 |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 14 | writer = 0 |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 15 | run_continuous = False |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 16 | iterations = 0 |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 17 | data_capture_abort = False |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 18 | chn_count = 0 |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 19 | data_list = [] |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 20 | |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 21 | def key_press_event(key): |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 22 | global data_capture_abort |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 23 | data_capture_abort = True |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 24 | |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 25 | def init_data_capture(): |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 26 | global device |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 27 | global data_list |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 28 | global chn_count |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 29 | global listener |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 30 | global samples_block |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 31 | |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 32 | ######## User configuration ########## |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 33 | # Configure the backend for PC to IIOD interface |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 34 | uri = "serial:COM12,230400" # For UART, baud rate must be same as set in the FW. COM port is physical Or VCOM. |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 35 | device_name = "ad4130" # Name of the device must be same as set in the FW. |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 36 | ###################################### |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 37 | |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 38 | # Create an IIO device context |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 39 | device = ad4130(uri, device_name) |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 40 | device._ctx.set_timeout(100000) |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 41 | |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 42 | ######## User configuration ########## |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 43 | # Channels to be captured e.g. [0]: 1chn, [0,1]: 2chns, [0,1,2,3]: 4chns, [0,1,2,3,4,5,6,7]: 8chns |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 44 | device.rx_enabled_channels = [0] |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 45 | |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 46 | # The block of samples to be captured. Total samples are received in multiple iterations or blocks |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 47 | samples_block = 400 # The samples needs to be captured in smaller blocks due to limitations |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 48 | # of buffer size (RAM) in the firmware and IIO client timeout factor. |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 49 | # Request to capture samples more than buffer size, will be ignored by firmware. |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 50 | # Large time taken to read the samples from device, may cause timeout on IIO client. |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 51 | ###################################### |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 52 | |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 53 | # Get the channels count from user |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 54 | chn_count = len(device.rx_enabled_channels) |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 55 | |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 56 | # Store the rx buffer size and rx data type based on input channels |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 57 | device.rx_buffer_size = samples_block # Size of the IIO buffer (buffer is submitted during call to rx() method) |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 58 | device._rx_data_type = np.int32 # size of ADC sample |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 59 | |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 60 | listener = keyboard.Listener(on_press=key_press_event) |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 61 | listener.start() |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 62 | |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 63 | def read_user_inputs(): |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 64 | global iterations |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 65 | global run_continuous |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 66 | global device |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 67 | global samples_block |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 68 | |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 69 | samples_count = int(input("Enter the number of samples to be captured \n\ |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 70 | 0: Unlimited \n\ |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 71 | <50-1000000>: ")) |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 72 | |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 73 | if (samples_count == 0): |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 74 | run_continuous = True |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 75 | else: |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 76 | run_continuous = False |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 77 | if (samples_count <= samples_block): |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 78 | device.rx_buffer_size = samples_count |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 79 | iterations = 1 |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 80 | else: |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 81 | iterations = math.ceil(samples_count / samples_block) |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 82 | |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 83 | def init_data_logger(): |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 84 | global writer |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 85 | global chn_count |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 86 | |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 87 | file_name = "adc_data_capture.csv" |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 88 | current_dir = os.getcwd() |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 89 | output_file = os.path.join(current_dir, file_name) |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 90 | result_file = open(output_file, 'w', newline="") |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 91 | writer = csv.writer(result_file) |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 92 | row = [] |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 93 | # Write the channels list header |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 94 | for chn in range(0,chn_count): |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 95 | item = "Ch {}".format(chn) |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 96 | row.insert(chn, item) |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 97 | writer.writerow(row) |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 98 | |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 99 | def read_buffered_data(): |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 100 | global line |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 101 | global writer |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 102 | global device |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 103 | |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 104 | # Receive data from device |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 105 | data = device.rx() |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 106 | if (line == 0): |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 107 | print("Data capture started >>") |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 108 | print("."*line, end="\r") |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 109 | |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 110 | if (chn_count == 1): |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 111 | # Convert 1-D array to 2-D array |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 112 | data_arr = np.reshape(data, (-1,1)) |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 113 | else: |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 114 | # Transpose data from N-D data array |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 115 | data_arr = np.transpose(data) |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 116 | |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 117 | writer.writerows(data_arr) |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 118 | |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 119 | line = line+1 |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 120 | if (line == 100): |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 121 | line = 1 |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 122 | print("\n", end="\r") |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 123 | |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 124 | def do_data_capture(): |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 125 | global iterations |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 126 | global run_continuous |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 127 | global data_capture_abort |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 128 | done = False |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 129 | |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 130 | if (run_continuous == True): |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 131 | print("Press any key to stop data capture..") |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 132 | sleep(2) |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 133 | data_capture_abort = False |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 134 | while not data_capture_abort: |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 135 | read_buffered_data() |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 136 | else: |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 137 | for val in range(0,iterations): |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 138 | read_buffered_data() |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 139 | |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 140 | print("\r\nData capture finished\r\n") |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 141 | |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 142 | def exit(): |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 143 | global listener |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 144 | global writer |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 145 | global device |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 146 | |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 147 | # Delete the objects |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 148 | del listener |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 149 | del writer |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 150 | del device |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 151 | |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 152 | def main(): |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 153 | init_data_capture() |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 154 | init_data_logger() |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 155 | read_user_inputs() |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 156 | do_data_capture() |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 157 | exit() |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 158 | |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 159 | if __name__ == "__main__": |
MPhalke@MPHALKE-L02.ad.analog.com | 2:871d585d96ee | 160 | main() |