DEFAULT_FRONTEND_CONFIG = [ # nomenclature: name [default setting] [bits 7-0] : description # Read only ID: 0x3E, # ID [xx] [REV_ID[2:0], 1, DEV_ID[1:0], NU_CH[1:0]] : (RO) # Global Settings Across Channels: 0x96, # CONFIG1 [96] [1, DAISY_EN(bar), CLK_EN, 1, 0, DR[2:0]] : Datarate = 250 SPS 0xC0, # CONFIG2 [C0] [1, 1, 0, INT_CAL, 0, CAL_AMP0, CAL_FREQ[1:0]] : No tests 0x60, # CONFIG3 [60] [PD_REFBUF(bar), 1, 1, BIAS_MEAS, BIASREF_INT, PD_BIAS(bar), BIAS_LOFF_SENS, BIAS_STAT] : Power-down reference buffer, no bias 0x00, # LOFF [00] [COMP_TH[2:0], 0, ILEAD_OFF[1:0], FLEAD_OFF[1:0]] : No lead-off # Channel-Specific Settings: 0x61, # CH1SET [61] [PD1, GAIN1[2:0], SRB2, MUX1[2:0]] : Channel 1 active, 24 gain, no SRB2 & input shorted 0x61, # CH2SET [61] [PD2, GAIN2[2:0], SRB2, MUX2[2:0]] : Channel 2 active, 24 gain, no SRB2 & input shorted 0x61, # CH3SET [61] [PD3, GAIN3[2:0], SRB2, MUX3[2:0]] : Channel 3 active, 24 gain, no SRB2 & input shorted 0x61, # CH4SET [61] [PD4, GAIN4[2:0], SRB2, MUX4[2:0]] : Channel 4 active, 24 gain, no SRB2 & input shorted 0x61, # CH5SET [61] [PD5, GAIN5[2:0], SRB2, MUX5[2:0]] : Channel 5 active, 24 gain, no SRB2 & input shorted 0x61, # CH6SET [61] [PD6, GAIN6[2:0], SRB2, MUX6[2:0]] : Channel 6 active, 24 gain, no SRB2 & input shorted 0x61, # CH7SET [61] [PD7, GAIN7[2:0], SRB2, MUX7[2:0]] : Channel 7 active, 24 gain, no SRB2 & input shorted 0x61, # CH8SET [61] [PD8, GAIN8[2:0], SRB2, MUX8[2:0]] : Channel 8 active, 24 gain, no SRB2 & input shorted 0x00, # BIAS_SENSP [00] [BIASP8, BIASP7, BIASP6, BIASP5, BIASP4, BIASP3, BIASP2, BIASP1] : No bias 0x00, # BIAS_SENSN [00] [BIASN8, BIASN7, BIASN6, BIASN5, BIASN4, BIASN3, BIASN2, BIASN1] No bias 0x00, # LOFF_SENSP [00] [LOFFP8, LOFFP7, LOFFP6, LOFFP5, LOFFP4, LOFFP3, LOFFP2, LOFFP1] : No lead-off 0x00, # LOFF_SENSN [00] [LOFFM8, LOFFM7, LOFFM6, LOFFM5, LOFFM4, LOFFM3, LOFFM2, LOFFM1] : No lead-off 0x00, # LOFF_FLIP [00] [LOFF_FLIP8, LOFF_FLIP7, LOFF_FLIP6, LOFF_FLIP5, LOFF_FLIP4, LOFF_FLIP3, LOFF_FLIP2, LOFF_FLIP1] : No lead-off flip # Lead-Off Status Registers (Read-Only Registers): 0x00, # LOFF_STATP [00] [IN8P_OFF, IN7P_OFF, IN6P_OFF, IN5P_OFF, IN4P_OFF, IN3P_OFF, IN2P_OFF, IN1P_OFF] : Lead-off positive status (RO) 0x00, # LOFF_STATN [00] [IN8M_OFF, IN7M_OFF, IN6M_OFF, IN5M_OFF, IN4M_OFF, IN3M_OFF, IN2M_OFF, IN1M_OFF] : Laed-off negative status (RO) # GPIO and OTHER Registers: 0x0F, # GPIO [0F] [GPIOD[4:1], GPIOC[4:1]] : All GPIOs as inputs 0x00, # MISC1 [00] [0, 0, SRB1, 0, 0, 0, 0, 0] : Disable SRBM 0x00, # MISC2 [00] [00] : Unused 0x00, # CONFIG4 [00] [0, 0, 0, 0, SINGLE_SHOT, 0, PD_LOFF_COMP(bar), 0] : Single-shot, lead-off comparator disabled ] FRONTEND_CONFIG = [ 0x3E, # ID (RO) 0x95, # CONFIG1 [95] [1, DAISY_EN(bar), CLK_EN, 1, 0, DR[2:0]] : Datarate = 500 SPS 0xD0, # CONFIG2 [C0] [1, 1, 0, INT_CAL, 0, CAL_AMP0, CAL_FREQ[1:0]] 0xFC, # CONFIG3 [E0] [PD_REFBUF(bar), 1, 1, BIAS_MEAS, BIASREF_INT, PD_BIAS(bar), BIAS_LOFF_SENS, BIAS_STAT] : Power-down reference buffer, no bias 0x00, # No lead-off 0x62, # CH1SET [60] [PD1, GAIN1[2:0], SRB2, MUX1[2:0]] set to measure BIAS signal 0x60, # CH2SET 0x60, # CH3SET 0x60, # CH4SET 0x60, # CH5SET 0x60, # CH6SET 0x60, # CH7SET 0x60, # CH8SET 0x00, # BIAS_SENSP 00 0x00, # BIAS_SENSN 00 0x00, # LOFF_SENSP Lead-off on all positive pins? 0x00, # LOFF_SENSN Lead-off on all negative pins? 0x00, # Normal lead-off 0x00, # Lead-off positive status (RO) 0x00, # Lead-off negative status (RO) 0x00, # All GPIOs as output ? 0x20, # Enable SRB1 ] LEADOFF_CONFIG = [ 0x3E, # ID (RO) 0x95, # CONFIG1 [95] [1, DAISY_EN(bar), CLK_EN, 1, 0, DR[2:0]] : Datarate = 500 SPS 0xC0, # CONFIG2 [C0] [1, 1, 0, INT_CAL, 0, CAL_AMP0, CAL_FREQ[1:0]] 0xFC, # CONFIG3 [E0] [PD_REFBUF(bar), 1, 1, BIAS_MEAS, BIASREF_INT, PD_BIAS(bar), BIAS_LOFF_SENS, BIAS_STAT] : Power-down reference buffer, no bias 0x00, # No lead-off 0x60, # CH1SET [60] [PD1, GAIN1[2:0], SRB2, MUX1[2:0]] set to measure BIAS signal 0x60, # CH2SET 0x60, # CH3SET 0x60, # CH4SET 0x60, # CH5SET 0x60, # CH6SET 0x60, # CH7SET 0x60, # CH8SET 0x00, # BIAS_SENSP 00 0x00, # BIAS_SENSN 00 0xFF, # LOFF_SENSP Lead-off on all positive pins? 0xFF, # LOFF_SENSN Lead-off on all negative pins? 0x00, # Normal lead-off 0x00, # Lead-off positive status (RO) 0x00, # Lead-off negative status (RO) 0x00, # All GPIOs as output ? 0x20, # Enable SRB1 0x00, 0x02, ] def to_ads_frequency(frequency): possible_datarates = [250, 500, 1000, 2000, 4000, 8000, 16000] dr = 16000 for i in possible_datarates: if i >= frequency: dr = i break return dr def mod_config(config, datarate, channel_modes): # datarate: possible_datarates = [(250, 0x06), (500, 0x05), (1000, 0x04), (2000, 0x03), (4000, 0x02), (8000, 0x01), (16000, 0x00)] mod_dr = 0x00 for i, j in possible_datarates: if i >= datarate: mod_dr = j break new_cf1 = config[1] & 0xF8 new_cf1 = new_cf1 | mod_dr config[1] = new_cf1 # bias: assert len(channel_modes) == 7 config[13] = 0x00 # clear BIAS_SENSP config[14] = 0x00 # clear BIAS_SENSN for chan_i, chan_mode in enumerate(channel_modes): n = 6 + chan_i mod = config[n] & 0x78 # clear PDn and MUX[2:0] if chan_mode == 'simple': # If channel is activated, we send the channel's output to the BIAS mechanism bit_i = 1 << chan_i + 1 config[13] = config[13] | bit_i config[14] = config[14] | bit_i elif chan_mode == 'disabled': mod = mod | 0x81 # PDn = 1 and input shorted (001) else: assert False, f"Wrong key: {chan_mode}." config[n] = mod # for n, c in enumerate(config): # print ADS1299 configuration registers # print(f"config[{n}]:\t{c:08b}\t({hex(c)})") return config