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 serial
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 2 from time import sleep
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 3 from pynput import keyboard
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 4 from ad4130 import *
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 5 from ad4130_xattr import *
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 6
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 7 # Delays in seconds
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 8 short_time = 0.1
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 9 long_time = 1
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 10 loadcell_settling_time = 2
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 weight_input = 0
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 14 loadcell_offset = [ 0 ]
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 15 loadcell_gain = [ 0 ]
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 16
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 17 # Power test channels defined in the firmware
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 18 POWER_TEST_V_AVDD_CHN = 0
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 19 POWER_TEST_V_IOVDD_CHN = 1
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 20 POWER_TEST_I_AVDD_CHN = 2
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 21 POWER_TEST_I_IOVDD_CHN = 3
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 22 POWER_TEST_V_AVSS_DGND_CHN = 4
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 23 POWER_TEST_V_REF_CHN = 5
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 24
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 25 # IIO Channel name and respective channel index mapping
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 26 chn_mappping = {
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 27 "voltage0" : 0, "voltage1" : 1, "voltage2" : 2, "voltage3" : 3, "voltage4" : 4,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 28 "voltage5" : 5, "voltage6" : 6, "voltage7" : 7, "voltage8" : 8, "voltage9" : 9,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 29 "voltage10" : 10, "voltage11" : 11, "voltage12" : 12, "voltage13" : 13,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 30 "voltage14" : 14, "voltage15" : 15,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 31
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 32 "current0" : 0, "current1" : 1, "current2" : 2, "current3" : 3, "current4" : 4,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 33 "current5" : 5, "current6" : 6, "current7" : 7, "current8" : 8, "current9" : 9,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 34 "current10" : 10, "current11" : 11, "current12" : 12, "current13" : 13,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 35 "current14" : 14, "current15" : 15,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 36
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 37 "temp0" : 0, "temp1" : 1, "temp2" : 2, "temp3" : 3, "temp4" : 4,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 38 "temp5" : 5, "temp6" : 6, "temp7" : 7, "temp8" : 8, "temp9" : 9,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 39 "temp10" : 10, "temp11" : 11, "temp12" : 12, "temp13" : 13,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 40 "temp14" : 14, "temp15" : 15,
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 41 }
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 42
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 43 def key_press_event(key):
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 44 global key_pressed
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 45 key_pressed = True
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 46
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 47 def init_sensor_measurement():
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 48 global device
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 49 global demo_config
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 50 global listener
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 51
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 52 ######## User configuration ##########
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 53 # Configure the backend for PC to IIOD interface
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 54 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 55 device_name = "ad4130" # Name of the device must be same as set in the FW.
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 56 ######################################
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 57
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 58 # Create an IIO device context
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 59 device = ad4130_xattr(uri, device_name)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 60 device._ctx.set_timeout(100000)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 61
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 62 # Get current user device config from the firmware
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 63 demo_config = device.demo_config
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 64 print("\r\nDemo Config: {}\r\n".format(demo_config))
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 65
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 66 listener = keyboard.Listener(on_press=key_press_event)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 67 listener.start()
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 68
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 69 def perform_loadcell_calibration(chn):
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 70 global loadcell_offset
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 71 global loadcell_gain
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 72 global weight_input
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 73 global device
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 74
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 75 chn_indx = chn_mappping[chn.name]
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 76
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 77 print("\r\nCalibrating Loadcell for channel {}".format(chn_indx))
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 78 input("Please ensure no weight is applied on Loadcell and press enter to continue calibration ")
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 79 print("Waiting to settle-down the Loadcell..")
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 80 sleep(loadcell_settling_time)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 81 print("Performing Loadcell offset calibration..")
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 82 chn.loadcell_offset_calibration = 'start_calibration'
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 83 print("Loadcell offset calibration complete")
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 84 loadcell_offset[chn_indx] = chn.loadcell_offset_calibration
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 85 print("Loadcell offset: {}".format(loadcell_offset[chn_indx]))
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 86
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 87 weight_input_done = False
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 88 while weight_input_done is False:
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 89 try:
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 90 weight_input = int(input("\r\nApply the weight on loadcell and enter here (in grams): "))
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 91 if (weight_input <= 0):
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 92 print("Please ensure weight is > 0!!")
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 93 else:
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 94 weight_input_done = True
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 95 except:
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 96 print("Invalid input")
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 97
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 98 print("Waiting to settle-down the Loadcell..")
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 99 sleep(loadcell_settling_time)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 100 print("Performing load cell gain calibration..")
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 101 chn.loadcell_gain_calibration = 'start_calibration'
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 102 print("Load cell gain calibration complete")
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 103 loadcell_gain[chn_indx] = chn.loadcell_gain_calibration
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 104 print("Loadcell gain: {}".format(loadcell_gain[chn_indx]))
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 105
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 106 def perform_sensor_measurement():
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 107 global device
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 108 global key_pressed
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 109 global loadcell_offset
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 110 global loadcell_gain
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 111 global weight_input
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 112
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 113 # Loadcell must be calibrated before performing measurement
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 114 if (demo_config == 'Loadcell'):
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 115 for chn in device.channel:
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 116 perform_loadcell_calibration(chn)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 117
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 118 weight = 0
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 119 print("\r\n*** Press any key to stop the measurement ***\r\n")
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 120 sleep(long_time)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 121
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 122 # Print the header
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 123 header = ""
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 124 for chn in device.channel:
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 125 header = header + chn.name + ' '
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 126 print(header)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 127
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 128 key_pressed = False
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 129 while not key_pressed:
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 130 result_str = ""
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 131 for chn in device.channel:
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 132 sleep(short_time)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 133 if (demo_config == 'Loadcell'):
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 134 adc_raw = chn.raw
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 135 try:
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 136 chn_indx = chn_mappping[chn.name]
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 137 weight = ((adc_raw - loadcell_offset[chn_indx]) * weight_input) / (loadcell_gain[chn_indx] - loadcell_offset[chn_indx])
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 138 result_str = result_str + str(round(weight,4)) + ' gram '
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 139 except:
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 140 print("\r\nInvalid measurement result. Please check device settings!!")
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 141 break
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 142 elif (demo_config == 'ECG' or demo_config == 'Noise Test' or demo_config == 'Power Test' or demo_config == 'User Default'):
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 143 adc_raw = chn.raw
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 144 scale = chn.scale
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 145 offset = chn.offset
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 146 if (demo_config == 'Power Test'):
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 147 chn_indx = chn_mappping[chn.name]
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 148 if (chn_indx == POWER_TEST_I_AVDD_CHN or chn_indx == POWER_TEST_I_IOVDD_CHN):
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 149 current = ((adc_raw + offset) * scale)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 150 result_str = result_str + str(round(current,4)) + 'mA '
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 151 else:
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 152 voltage = ((adc_raw + offset) * scale) / 1000
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 153 result_str = result_str + str(round(voltage,4)) + 'V '
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 154 else:
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 155 voltage = ((adc_raw + offset) * scale) / 1000
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 156 result_str = result_str + str(round(voltage,4)) + 'V '
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 157 else:
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 158 # Temperature sensors demo configs (RTD, Thermocouple and Thermistor)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 159 adc_raw = chn.raw
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 160 scale = chn.scale
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 161 temperature = (adc_raw * scale) / 1000
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 162 result_str = result_str + str(round(temperature,4)) + 'C '
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 163
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 164 print(result_str)
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 165
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 166 def exit():
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 167 global listener
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 168 global device
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 169
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 170 # Delete the objects
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 171 del listener
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 172 del device
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 173
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 174 def main():
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 175 init_sensor_measurement()
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 176 perform_sensor_measurement()
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 177 exit()
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 178
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 179 if __name__ == "__main__":
MPhalke@MPHALKE-L02.ad.analog.com 2:871d585d96ee 180 main()