Spaces:
Sleeping
Sleeping
File size: 6,317 Bytes
a64c5cc |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 |
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 |