IIO firmware for the AD717x and AD411x family of devices.

Dependencies:   sdp_k1_sdram

Committer:
Janani Sunil
Date:
Fri Jun 10 09:37:03 2022 +0530
Revision:
1:f71de62b7179
Parent:
0:5ad86d8d396a
V2: Updated readme, python script and added requirements

Who changed what in which revision?

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