AD4130 Mbed IIO Firmware

Dependencies:   tempsensors sdp_k1_sdram

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?

UserRevisionLine numberNew 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()