[09-AUG-22] The Implantable Stimulator-Transponder (A3041) receives commands through its crystal radio, interprets these commands and executes them with its own embedded microprocewssor, applies stimuli to its two stimulus leads, transmits a synchronizing telemetry signal upon command, and reports on its own battery voltage. All versions of the A3014 stimulator are powered by CR-series lithium primary cell. These batteries are not rechargeable, but provide long life and ample stimulus current. We ship the A3041 in its own box with a magnet that keeps it in its hibernation state, consuming 0.8 μA. When we remove the IST from its box, the A3041 enters its sleep state, consuming 5.5 μA. When its crystal radio receives a command, the A3041 becomes activate, in which state its logic circuits consume 200 μA.
The A3041A-DD provides two pins on the ends of its stimulus leads that we can connect to an Implantable Lamp (A3036IL) to provide optogenetic stimulation or to a bipolar electrode to provide direct electrical stimulation. All versions of the A3041 generate stimuli by connecting a current source to its stimulus leads. A stimulus is a series of pulses, each of a certain length, each of a certain current, and at a certain frequency. The timing of the pulses can be randomized so that they are not regular, but maintain the same frequency. The current source is programmable by a current code. The A3041A provides currents from 200 μA to 10 mA. The maximum voltage the A3041 will apply to its stimulus leads in an effort to achieve the programmed current is fixed for each version of the device. The A3041A can deliver at most 3.3 V. The other voltage options are 3.0 V and 5.0 V.
|Volume of Implant||≤0.83 ml|
|Mass of Implant||≤1.6 g|
|Maximum Dimensions||10 mm × 10 mm × 7 mm|
|Battery Type||CR1025 Coin Cell|
|Battery Capacity||1250 μA-days|
|Hibernation Current||0.5 μA|
|Hibernation Control||hibernates in magnetic field|
|Sleep Current||5 μA|
|Active Current||200 μA|
|Stimulus Voltage||3.3 V|
|Stimulus Current||100 μA to 10 mA|
|Stimulus Charge||10 mA for ≤2 ms, 1 mA for ≤200 ms, 100 μA for ≤20 s.|
The A3041 uses its antenna to receive commands and to transmit SCT messages. Whenever the A3041 receives a command, we can ask it to acknowledge reception of the command with an SCT auxiliary message. When we receive the acknowledgement, we know the A3041 has executed the command. The A3041 can transmit battery measurements, and it will identify itself in response to an all-stimulator identification request command. The A3041 will transmit a synchronizing signal that shows when its stimulus pulses occur, and indicates their power and duration. We address each A3041 with its own unique four-byte identifier, which we record as a four-digit hexadecimal number on the device label. We use this identifier in the Stimulator Tool to control individual stimulators. When the A3041 transmits SCT messages, it uses an SCT channel number of our own choosing. We can instruct our device 0xA123, for example, to transmit its synchronizing, acknowledgement, and battery messages using channel number 3, 67, or 118 as we see fit, so as not to conflict with the channel numbers used by other telemetry devices in the same system.
Here are planned versions of the A3041.
|A3041A||3.3||10 μA to 10 mA||1250 (CR1025)
|0.83||1.6||For co-implantation with SCTs in mice.|
|A3041B||3.3||10 μA to 10 mA||1250 (CR1025)
|0.70||1.4||For co-implantation with SCTs in mice.|
The following files define the A3041 design. Note that we distribute all these files under the GNU Public License. Any design that incorporates any part of our work must itself be distributed under the same GNU Public License.S3041A_1.gif: Crystal radio, logic, stimulator.
There are two ways to mount a battery on the A3041 circuit: top and side. The side-mount results in a longer device, but thinner and with smaller volume and mass. The side-mount is possible with the CR1025 and CR1225 batteries.
[27-JUL-22] At the moment, the only way to command the IST is with a Command Transmitter (A3029C) connected to a LWDAQ Driver (A2071E). We describe how to connect these devices, along with an Octal Data Receiver (A3027), in our setup instructions for earlier versions of the stimulator, which you will find at Set-Up. We set up TCPIP communication between our data acquisition computer and the LWDAQ Driver. We run the LWDAQ Software on our computer. We use the program's Stimulator Tool to transmit commands to the IST and we use its Receiver Instrument to receiver signals from the IST. We must use Stimulator Tool V2.0+, available in LWDAQ 10.4.4+.
The Telemetry Control Box (TCB-B16) will replace the A3029C, A3027E, and A2071E. The new operation instructions will appear on the IST landing page. The TCB-B16 needs only one Power over Ethernet (PoE) connection for power and communication. It provides sixteen coaxial antennas that receiver telemetry signals and transmit commands to ISTs, or indeed any other of our implants with crystal radio receivers. The TCB-B16 should be available in November 2022. With the TCB-B!6, set-up is simpler: we put antennas wherever we need reception or transmission, and we can use any antenna alternately for reception and transmission. The TCB receives its power from the PoE connection, and all communication with the TCB takes place over the same PoE cable. The same LWDAQ Software with its Stimulator Tool operates the TCB using the same interface as for the older A3029C, A3027E, and A2071E system.
[09-AUG-22] The A3041's stimulus output is limited in both current and voltate: there is a maximum voltage it will apply to the stimulus leads and a maximum current it will allow to flow through the stimulus leads. The maximum voltage is a function of the boost converter we load onto the A3041 circuit. It can be 3.0 V, 3.3 V, or 5.0 V. In the case of the A3041A, the stimulus voltages is 3.3 V. The maximum current is controlled by a four-bit current code we select in Stimulator Tool. Its value can be 0-15. The magnitude of the current is inversely proportional to the value of a resistor we load onto the circuit. In the case of the A3041A, the maximum current, which we obtain with code 15, is a little under 10 mA.
We equip all versions of the A3041 with CR-series lithium primary cells. These batteries provide a voltage close to 2.7 V for all but the first 5% and final 5% of their operating lives. The boost converter that generates the 3.3 V stimulus potential in the A3041 is 85% efficient, so a stimulus current of 10 mA will draw 14 mA from the battery. The plot above shows stimulus
[29-JUN-22] From one sample circuit, we estimate the current consumption of the A3041.
Hibernation current is 0.8 μA. The A3041A is equipped with a 30 mA-hr battery. It provides four years of hibernation on the shelf before its battery runs down. Provided we use the A3041A within five months of manufacture, we have 90% of its battery capacity remaining. Once we remove an A3041 from the magnet in its box, current consumption increases to 5.5 μA. While implanted and sleeping, A3041A battery life is 32 weeks. When active, but generating no stimulus or transmission, current consumption increases to roughly 150 μA at 25°C, and a maximum of 200 μA at 37°C. A typical optogenetic stimulus through a fiber-coupled LED is 1 mA pulsed for 10 ms every 100 ms. The plot below shows how battery current varies with stimulus current.
With 1-mA stimulus we consume 2 mA from the battery. Average current consumption for 1 mA pulses with 10% duty cycle is 200 μA, which we add to the maximum 37°C current consumption of 200 μA to get a total of 400 μA. An A3041A with a fresh battery can keep this stimulus going for 75 hours. Synchronizing signal transmission at 512 SPS, which is sufficient to show clearly the 10-ms flashes, adds another 108 μA. The synchronizing signal on the A3041A turns off automatically 32768 samples after the end of any stimulus. At 512 SPS, the synchronizing signal will run for 64 s after the stimulus completes. The synchronizing signal turns itself off to avoid draining the battery for no reason.
The A3041 is equipped with a D-Type antenna: 30-mm stranded-steel thin loop used both for receiving commands and transmitting synchronizing signals, acknowledgements, and battery measurements.
[28-JUN-22] We transmit commands to the implant by turning on and off a 915-MHz power source. The implant's crystal radio generates a logic HI when the power at its antenna is greater than a threshold. It generates a logic LO otherwise. We construct the command out of a pattern of HI and LO levels. Implants like the IST are almost always asleep. Their logic chips are disabled. The command transmission begins with an initializing pulse that wakes up the implant and enables the logic chip.
The initializing pulse lasts for tI ≥5 ms. While the pulse endures, the crystal radio asserts OND, which powers up the logic chip. As soon as the logic chip has configured itself, it asserts OND itself. The configuration should take tPU < 3 ms so that the initializing pulse will endure for > 2 ms after configuration is complete. When the logic chip has seen ≥2 ms of the initializing pulse, it starts to monitors the state of RP (Radio Frequency Power) for the purpose of receiving command bytes. It samples RP on the rising edges of RCK, its 32.768 kHz oscillator. When it sees RP go LO it waits for a start bit, after which it records eight bits of a command byte followed by a stop bit. It waits for another start bit, and so on, until one of the stop bits extends for 5 ms, which indicates the end of the command. The implant can analyze the command bytes as they arrive, or it can analyze them later. If the command requires nothing of the implant, the implant will send itself back to sleep immediately.
In the photograph above we see the IST receiving a command on RP, then processing the command afterwards. The CPU reads the bytes out of the command memory one by one and executes them. When it's done, it clears CMDRDY.
The A3041 can transmit acknowledgements and battery measurements using SCT metadata messages. It can transmit a synchronizing signal, which shows the state of the stimulus, using an SCT data channel.
[16-AUG-22] The A3041AV1 assembly as received from our assembly house needs the following modifications.
The A304101A printed circuit board needs the following modifications.
[02-FEB-22] The A3041 will incorporate the following improvements compared to the A3036.
With CR1025's 30-mAhr capacity, we have 6000 hrs = 36 weeks of sleep life while implanted, ignoring stimulus current. Stimulus current we assume will be of order 2 mA for optogenetics, following our study of FCLEDs in mice, where 1-ms flashes of 15 mA was sufficient to cause response with blue light, so 10-ms flashes of 1.5 mA should be sufficient. Because the current is ten times lower than we expected when we designed the A3036, we can switch out the A3036's lipo battery for a CR-series coin cell with three times the capacity per unit volume, and low enough source resistance to supply the LCMXO2-1200ZE with its startup current, and a lamp with 10 mA. We will make sure the lamp does not turn on when the device powers up. We will include resistors to allow us to turn on the device with a jumper when we tune the crystal radio.
[10-FEB-22] We are wondering if we can use the crystal radio's split capacitor tuner to create a resonator at the same frequency, and so tune both transmit and receive frequencies at the same time during production of the A3041. We build the following circuit using an A3038X. According to our calculations, the tuner should provide a phase shift of close to 180° just above its resonant frequency. Combined with the phase shift through a single-stage amplifier, we might see oscillation near the resonant frequency.
In the tuner, we use the same inductors and capacitors as the A3038DM-E tuner. We start with R1 = 560 Ω and C2 = 10 pF. We connect a spectrometer to J1 and we connect J2 to an oscilloscope. The P output on J2 tells us the power at J1 in the range 50-6000 MHz. We use the spectrometer to measure frequency and stability of the peak.
With R1 = 560 Ω and C2 = 10 pF we adjust VC1 until our peak is at 905 MHz. Power is −20 dBm. With C2 increased to 100 pF we see 902 MHz −18 dBm. We drop R1 to 280 Ω and see 870 MHz −4 dBm. We adjust VC1 to get 917 MHz −10 dBm.
[14-FEB-22] Complete S3041_1 schematic. We have dropped the 10-μH, P1210 inductor used in the A3030E to a 4.7 μH P0805 inductor to save space, and anticipating that our output current will be no more than 10 mA. Our stimulus output switch is an npn transistor driven by a low-pass filter. If we know the current gain of this transistor, and the cut-off frequency of the filter is much lower than the frequency of our drive square wave, we can vary the duty cycle of the square wave to control the stimulus current. Our sleep switch is a p-channel mosfet.
[18-FEB-22] We decide against double-use of the split-capacitor tuner. When we add up all the parts it requires, we get no reduction in board area compared to a MAX2624, and we introduce uncertainty into the design. We plan to embed an OSR8 microprocessor in the logic of the IST. Because we have an ADC dedicated to measuring battery voltage, we can use our OSR8 microprocessor to compensate for drop in battery voltage when driving the tuning input of the MAX2623 or MAX2624, having established the correct DAC output value for a known battery voltage. We now have all logic IO banks connected to VA, which simplifies our layout.
[25-MAR-22] Working on the layout of the A304101A, a 400-mil square (10.2 mm square) implant with two extensions, battery pads on the North and South edges rather than at the corners, built-in zig-zag antenna, test points for calibration and tuning. We will be using 8-mil via-in-pad between top and bottom layer pads, as well as 4-mil microvias from top layer to middle layer in the WLCSP-25 ball grid array (BGA), see here for layout description and here for the BGA pinout.
[28-MAR-22] The A304101AR1 layout is complete. The implant circuit is 400-mil square (10.2-mm square).
[07-APR-22] Our A304101A layout has passed DFM and final netlist checks. We are waiting for quotes. Digi-Key has no stock of MCP6541, but we have 200 pieces on cut tape. We identify LPV7215 by TI in SC-70-5 package as a drop-in replacement, but it's out of stock too. We have a draft version of the firmware A01 based upon P3035A11. We use the new OSR8V3 CPU, which allows us to change the process and program memory space easily with generic constants. Upon power-up, the Command Processor in Main.vhd looks for a start pulse on RP. When it sees a start pulse, it asserts OND with its own Command Processor Active (CPA) signal. It receives command bytes carried by RP and stores them in the Command Memory. When the command ends, due to lack of RP for the termination pulse length, if the checksum of the command is correct, the Command Processor asserts Command Ready (CMDRDY) and waits for Command Processor Reset (CPRST). The Command Processor will continue to assert OND with CPA until it is reset. The number of bytes it stored is available to the CPU at the command count locations. After power-up, the CPU must poll the command ready location. When it sees a command, it reads out and processes all the command bytes, except for the final two, which are the checksum. The CPU can then decide whether to assert OND through Device Active (DACTIVE) before writing to the Command Processor Reset location to restore the Command Processor, which will un-assert CPA. If the CPU has not set DACTIVE, the power will turn off.
In the A3041, the positive stimulus voltage is always driven while the device is active. As soon as VA is asserted, S+ pumps up to 3.3 V or 5.0 V, depending upon our choice of U6. For implantable lamps, we'll have 3.3 V connected to an LED with forward voltage 3.0 V. With ONL unasserted, the S− will float up to S+ immediately. We assert and unassert the ONL signal with the Stimulus Current location. The ONL signal passes through R6 to drive C9 and the base of Q2. With 33 kΩ and 10 nF, the time constant of the low-pass filter formed by R6 and C9 is 330 μs. We will measure the current gain of Q2, 2SC6026MFV. Assume gain is 200, base-emitter drop 600 mV. With ONL set at VA = 2.6 V we have base current 60 μA and collector current 12 mA. If we are driving 50-Ω leads and a 3.0-V LED with 3.3 V we cannot deliver more than 6 mA, so Q2 will saturate and S− will be around 50 mV. If we modulate ONL, the current flowing into S− will be 12 mA multiplied by the duty cycle of ONL, provided the load does not restrict the current. If we want to deliver a 200-μA electrical stimulus in a 10-ms pulse at 1 Hz, we use the processor's 5 MHz boost clock speed to run a counter from 0 to 59 and assert ONL on count 0 only. We deliver 833 such pulses on ONL in the 10-ms stimulus pulse length.
The A3041 allows us to measure the regulated 1V2 power supply with respect to VA with an eight-bit ADC, U9. The CPU reads the ADC by writing to the sensor control register, which turns on the transmit clock and uses it to read the ADC in about 5 μs. The CPU can read the result in the battery monitor location. If this eight-bit value is x, the current value of VA is 1.2 × 255 / x, which the CPU can of course work out for itself. Having figured out the battery voltage, the CPU can adjust the value it uses on the 5-bit transmit frequency control DAC so as to compensate for variable battery voltage during the life of the device. In previous implants, we have used a regulated voltage for the I/O banks that drive the DAC, but in this case we simplified routing by using VA.
The A3041 auto-calibrates its own ring oscillator upon power up, just like the A3035, so we have TCK set to 5.0 MHz to within 5%. We still have to obtain a value for the transmit low frequency that we should apply to the transmit DAC for a reference battery voltage of 2.6 V, and put this in the software that runs on in the A3041's CPU. Or, we could transmit a calibration value to the A3041 with every command, having measured the center frequency of each one and stored the calibration value with the device identifier. Suppose we give the A3041 a twenty-four bit identifier for command reception. Each one will be unique, so we can keep calibration constants on-line and use them to calibrate the stimulator when it wakes up.
[13-JUN-22] Receive 10 of A3041AV1 assemblies, build B109535. We start with circuit No4. Connect external 2.7 V. Quiescent current 5.9 μA. Bring magnet near to activate U1 and we have 1.0 μA. We connect OND to VH. Current is 17 mA. We have VA=0.5V and 1V2=0V while VS=VH=2.7V. Current drawn from VA is 17 mA at 0.5V. While messing about with another circuit, we see the current drop to 4 mA and we are able to program the chip, but we program with P3035A code rather than P3041A. We are unable to re-program or to program the first board.
[15-JUN-22] We short U6-1 and U6-3 on No4 with tweezers, thus connecting VA to VH. We see 130 mA flowing into the board from our 2.7-V power supply. We program the logic chip while holding the tweezers in place. After programming, current remains 120 mA with VA=VH. We remove U9, no change. We remove U8, we now can apply jumper to OND-VH to turn on the board and we see 253 μA quiescent current, of which 81 μA is current through R8, so active current is 172 μA. Now switch to circuit No6, which we previously were able to program, but upon which we now see VA will not power up. We short VA to VH and see 20 mA. We program the logic chip. Now we see 1.8 μA hibernation current, 6.5 μA sleep current, and 251−81 = 170 μA active current. Our U8 on No4 must have been damaged.
Start work on firmware A03. We program No6 repeatedly without any difficulty. Our ROM.asm program, assembled to ROM.mem, runs on the OSR8V3 CPU. We have configured the CPU with 12-bit program and cpu memory addresses. The program memory is therefore 4 kBytes, all of which is provided by ROM. Variable and stack memory are 1 kByte from address 0 to 1023, stack is from 768 to 1008. The command memory, where commands received by the crystal radio are stored, is 1 kByte from 1024 to 2047. The control memory space is from 2048 to 3071. The V3 software generates a ramp at 128 SPS on Channel 55, completing the ramp every two seconds. It generates a pulse on TP1 during every sample transmission, a pulse on TP2 on every run through the main loop, RCK on TP3, as marked on silk screen, and TCK on TP4, as marked on silk screen. The stimulus power supply is always powered up while the device is active, and we measure it to be 3.3V as we vary the supply voltage from 2.2-2.8 V. Current consumption at 2.7V is 152 μA when active, 7.0 μA sleep, 2.1 μA hibernating. We set up GitHub repository P3041 for our firmware and software.
[17-JUN-22] We take our No6 circuit. We solder a 10-Ω resistor in series with 0V. We connect external 2.7V power supply. We place the circuit on a command antenna. We have not tuned No6's crystal radio, but the A3041AV1 is contains an antenna built into the tuning extension. We transmit an XON command. We connect probes on VA, VR, and RP. We measure the voltage across the resistor. Our VR trace is corrupted on power-up, but the voltage across the resistor tells us the current consumption.
Peak power consumption is 65 mA. We suspect this current is flowing into C8 as the stimulus converter ramps up. We increase the timebase to view the entire command reception.
We zoom in on the first bits of the command, after the 10-ms power-up start bit.
We replace our 2.7-V power supply with a CR1025 battery and repeat our power-up current measurement.
Maximum current with the battery is 15 mA. We see the start-up current dropping the battery voltage for the 1.5 ms of the start-up. Average start-up current 10 mA, consistent with that of the A3036AV2. Total start-up charge consumption is 15 μC. The CR1025 capacit is 108 C, so we can start up almost ten million times. We look at the entire command reception and increase the gain for current and VR.
Now we see the 10-mA startup followed by stable voltages for RP and VA. The VA supply turns off when the logic chip un-asserts OND. The device is not responding to the command. Indeed, it is not capable of doing so because we have not written the code to respond to a command.
[18-JUN-22] We simplify the firmware by eliminating stack pointer read from firmware, combining status bits into one status register, and eliminating readback of the interrupt timer period. The default stack pointer is now zero. The software can move the pointer somewhere else during initialization. We now have enough spare LUTs to provide four eight-bit interrupt timers where previously we had only one. Firmware is 1249 of 1280 LUTs. We have the following timing report from our P3041 VHDL compile. Maximum speed of our CPU is 8.2 MHz. We are running it at 5 MHz.
---------------------------------------------------------------------------- Preference | Constraint| Actual|Levels ---------------------------------------------------------------------------- | | | FREQUENCY NET "FCK" 10.000 MHz | 10.000 MHz| 32.121 MHz| 3 FREQUENCY NET "RCK_c" 0.032 MHz | 0.032 MHz| 24.523 MHz| 7 FREQUENCY NET "CK" 5.000 MHz | 5.000 MHz| 8.138 MHz| 11 FREQUENCY NET "Fast_CK/RIN" 100.000 MHz | 100.000 MHz| 137.684 MHz| 3
Our ROM.asm begins with setting the stack pointer, in which process it uses the existing zero-base stack. We have a boot delay of 256 RCK periods, or 8 ms, which our plots above show us is enough time for the power supplies to settle. After that we calibrate the transmit clock and configure the interrupts. We are now ready for Command Ready (CMDRDY), which we poll with the status register.
[20-JUN-22] We program No6 with the code we worked on over the past few days and it runs perfectly, generating a ramp on channel No55. Check transmit center frequency and transmit clock. We tag this version of P3041 as v1.3. Below is the FHI test pin signal, showing the decline in the VS power supply during the tranmission. We have VH from an external 2.7-V bench-top power supply. Reception of the VCO output on the crystal radio's VR does not exceed 5 mV and we never see R being asserted.
The TUNE input varies during transmission as shown below. The average voltage drops by around 40 mV from start to end, which for the MAX2624 means at most a 40 mV × 100 MHz/V = 4 MHz drop in center frequency, which is easily accommodated by our receivers.
We give CPU access to the command memory write address, from which it can subtract three to get the number of command bytes that need to be read, skipping the two-byte checksum at the end. We reject a faulty command transmitter, after which we see the following.
[24-JUN-22] We increase our stimulus current value from zero to fifteen and measure the stimulus current. We provoke the step increase by transmitting any self-consistent command to the IST. We have an ammeter attached to the stimulus pins. We have ONL on a test pin, and on the circuit we have R6 = 33 KΩ and C9 = 10 nF.
The boost converter U6/L2/C8 is producing 3.3V from 2.7V. We see 14.1 mA from the battery for 8.74 mA to 3.3V, and quiescent current is 0.26 mA, so efficiency of converter is 85%. We connecto 100 Ω to the stimulus leads. We put probes on S+ and S−. We have another probe on an ONL test point.
We increase C6 to 100 nF (actually, we increase it to 110nF by loading 100nF in parallel with 10nF). We record average current versus stimulus code, and we look again at the stimulus voltage for 100-Ω load.
[27-JUN-22] We program No6 to turn on stimulus for 8 ms. The rise and fall times of the stimulus current are both around 250 μs.
[28-JUN-22] We have command reception, readout, and execution. We can turn on and off transmission, turn on and off the stimulus current, and set the stimulus current. We remove the jumper on OND. Turn on 128 SPS transmission with XON, 180 μA. Stimulus with zero current, XOFF, 154 μA. Cost of transmission is 26 μA / 128 SPS = 0.20 μA/SPS. We have a blue LED connected to the stimulus outputs. When we set the stimulus current to maximum (code 15), battery current is 12.2 mA. Sleep current is 6.8 μA, hibernation current 1.5 μA. Clean thoroughly and dry. Sleep 5.5 μA, hibernation 0.8 μA.
[29-JUN-22] We are updating our command syntax. We now begin every command with a two-byte identifier. The transmit command sets the transmit channel number and sample rate. We use our software-controlled sample rate to measure the slope of quiescent current versus sample rate and optain 0.20 μA/SPS.
[05-JUL-22] The Stimulator Tool V2.1 and P3041 V1.4 provide fully-functional stimuli. The stimulator transmits a two-byte pulse length, three-byte interval length, and two-byte stimulus length. The P3041 code multiplies the pulse length and interval length by RCK periods to form the pulse and interval. The P3041 code decrements the stimulus length to zero. We do not have randomized pulses implemented yet. We have acknowledgements, but the pre-tranmsit warm-up does not appear to be working: we receive acknowledgements only when the data transmission is running. We have a software eight-bit multiplication routine running, calculating the square of an eight-bit counter for the data transmission. We do not have "infinite stimulus" implemented with stimulus length zero.
[07-JUL-22] In order to transmit isolated messages, we must warm up the VCO, but this warm-up drops the VS voltage as C3 discharges and U3 must supply the current continuously. We see C3 discharging by 0.2 V in 20 μs, suggesting the MAX2624 is drawing 10 mA.
Stimulator Tool V2.2 and P3041 V1.5 provide battery readout, acknowledgements, automatic extinguish of data transmission, and automatic shut-off when idle.
The battery voltage measurement we obtain from our ADC measurement of 1.2 V using VBAT = 255 × 1.2 V / ADC, and we find the result is accurate to ±0.05V. Our synchronizing signal is still a parabola generated by our software multiplier. We want it to be an indication of the lamp status. We would like to implement our self-identification instruction as well. Right now, commands implemented are as follows:
const op_stop_stim 0 ; 0 operands const op_start_stim 1 ; 8 operands const op_xmit 2 ; 1 operand const op_ack 3 ; 1 operand const op_battery 4 ; 0 operand const op_identify 5 ; 0 operands const op_setpcn 6 ; 1 operand
The newest command is "set primary channel number", which we include before we ask for a battery measurement, an acknowledgement, or before we start data transmission. This command changes the primary channel number used by the device to a value known to the stimulator tool, which may be different from its default value. We no longer pass the channel number with the transmit command.
[13-JUL-22] We implement a sixteen-bit Galois linear feedback shift register (LFSR) to generate a pseudo-random number. We implement a random delay for random stimuli, which we calculate at the start of each interval by multiplying the stimulus interval length be a random number between 0/256 and 255/256, and dividing by two. The divide by two we intend to avoid collisions between this interval's pulse and that of the next interval. We examine the distribution of pulses during a random stimulus and observe that the delays are often strongly correlated from one interval to the next. We simulate the same LFSR in TclTk and confirm that it contains no duplicates in a series of 65536 numbers. We plot the top and bottom bytes to look for correlations.
We see in both the top and bottom byte values a tendancy towards correlation arising several times during one hundred successive states. We resolve this issue of correlation in the following way: we call the random number update routine in the main loop, so that we update the number more often than it is needed, thus jumping ahead through the sequence and avoiding most of the correlation. Our pulses are now randomly delayed by up to 50% of the interval from one interval top the next.
We vary VH from 2.0 V to 3.3 V and find that the A3041 shuts down at VH < 2.4 V. Reception of the synchronizing signal is robust from 2.4 V to 3.3 V. By centering the RF output spectrum for VH = 2.7 V, it appears we will be able to operate throughout this voltage range with no need to adjust our tuning DAC values as the battery discharges. We decide against transmission scatter for the A3041 synchronizing signal, as scatter disrupts the synchronization of the signal with respect to the pulses.
We adjust our randomization procedure: we subtract the pulse length from the interval length to obtain our maximum delay, and multiply this by our random number between zero and one. We now avoid automatically any overlap of pulses, but also maximize the randomness of the pulses. We are well-satisfied with the result. We try pulses of 80 ms with period 100 ms and see no pulses merging. With randomization, our start_pulse is performing three eight-bit multiplications. It executes in 250 μs, compared to 25 μs when not random. Randomized 1-ms pulses of current=0 at 10 Hz consume 333 μA. The same stimulus non-randomized is 325 μA. Boosted execution for 225 μs × 10 Hz = 2.25 ms costs 8 μA, implying boosted CPU consumption of 3.5 mA. Our transmit interrupt boosted execution time is 22 μs, as shown by diagnostic flags on our test pins. At 128 SPS, the interrupt adds 10 μA. Our stimulus interrupt is 18 μs long and executes every 1 ms. It adds 63 μA. With 10% duty cycle, 10 mA stimulus, no transmission, our average current is 1.3 mA, compared to which 63 μA is insignificant. But if we are providing an electrical stimulation of 300 μA, our current consumption is 335 μA and our 63 μA is an additional 20% due to our insisting upon 1-ms precision in the timing.
We set up test points TP1 = df_reg(0) = interrupt running flag, TP2 = ONL, TP3 = RCK, TP4 = FHI. Watching these, we find the shortest interval we can provide is 15 ms, for 67 Hz. Our shortest pulse is 600 μs with pulse_ms = 0, but the light does not illuminate. Shortes pulse with light is 1.25 ms with pulse_ms = 1. Watching the synchronizing signal, the average period of the stimulus is accurate to better than ±0.1%.
The identify instruction in the Stimulator Tool will find any devices in range and report their serial numbers. We decide not to build firmware and hardware identification numbers into the A3041. Instead, we will provide an HTML database that provides this information on-line.
We turn on and off the device and look at the TCK period. It ranges from 208 ns to 214 ns. We adjust min_tcf in ROM.asm from 70 to 72, pushing the maximum acceptable period down to 212 ns. We power up repeatedly and see consistent 213 ns. Release V1.6, fully tested.
We generate an 855-955 MHz sweep of around +12 dBm and apply to a straight, vertical quarter-wave antenna. We remove our 100 nF in parallel with 10 nF in place of C9 and load a single 100 nF. We load C4 = 0.5 pF and C5 = 1.4 pF and see the following response on VR at range 30 cm, which peaks at around 920 MHz.
We remove programming extension and load a battery. We must insulate the bottom (positive) side of the battery to avoid contact with pins on the top side of the circuit baord. We must insulate the side of the battery where the netagive tab ascends to the top side of the battery. We apply +22 dBm 910 MHz power to an A3015C loop antenna and move our A3041B around nearby with a probe attached to VR. We see VR is above 10 mV 80% of the time while we move at range 0-30 cm. Reception of commands is robust only at ranges up to 10 cm. We will encapsulate in epoxy, check tuning, clip off the build-in antenna, coat in silicone, and check range for commands once again. We take out another A3041AV1 circuit board. We load C9 = 100 nF, C4 = 0.5 pF and C6 = 1.4 pV. We see tuning peak at around 915 MHz. We resolve to load the same values on the remaining seven boards.
[20-JUL-22] We study current consumption with VBAT = 2.7 V. We have the OND jumper loaded on device 7C2D, which in theory consumes 82 μA. We program so that the CPU runs off RCK but we have TCK enabled, 1.01 mA. We turn off TCK, 203 μA. So TCK uses 800 μA. We turn on TCK and BOOST with the CPU running its main event loop, 2.14 mA. We put the CPU in its wait state with TCK and BOOST, 1.49 mA. We turn on data transmission at 128 SPS, 150 μA. When we turn on data transmission, the CPU asserts OND, so the jumper is no longer drawing 82 μA. At 1024 SPS, 370 μA. The TCK oscillator consumes 800 μA. The TCK oscillator consists of a ring oscillator running at around 130 MHz plus a divider that generates the 5 MHz. When we run the CPU on TCK instead of RCK, its current consumption increases by 1.13 mA when the CPU is running an event loop, or 490 μA when it is in its wait state. The CPU wait-state current consumption is ≈100 μA/MHz and event loop current consumption is ≈230 μA/MHz.
Inside the ring oscillator are five ring gates running at around 100 MHz and a four-bit counter, so dynamic current consumption of the logic is around 1 μA/MHz/LUT. The IGLOO nano from Microsemi claims current consumption of around 0.5 μA/MHz/LUT, but the IGLOO LUT is three-input, compared to the XO2 LUT's four inputs.
We have seven new A3041AV1 circuits with C4=0.5pF, C5=1.4pF, C9=100nF, plus our original 0xA123. We generate a 12 dBm 855-955 MHz sweep. We measure frequency at which we obtain peak response on VR. Out of eight, we have five at 915 MHz, two at 920 MHz, and one at 910 MHz. We modify S3041A_1.gif schematic. We program and test five more circuits, making six functioning in all. Two we cannot program. One we program but it won't stay on after a command.
[27-JUL-22] After encapsulation in epoxy, our first A3041A's runing response peaks at 915 MHz.
When we ask the A3041A to produce 10-ms, 10-mA pulses, it turns off after roughly ten pulses. When we ask it to generate 10-ms, 1-mA pulses, it runs indefinitely, as it does for 1-ms 10-mA pulses as well. We cut off the mounting extension, loop the antenna and dip in silicone.
[05-AUG-22] We put 0xA123 in water at 60°C to poach on 29-JUL-22. Today it is still 100% functional.
[09-AUG-22] We have three more A3041A with batteries loaded. We measure hibernation, sleep, and transmit current, as well as plot stimulus current versus current code.
The linear plot of current versus code reveals a bug in our P3041 firmare, whereby the current for 9 is equal to that of 10. Correction will be in V1.7. We record from four SCTs in hot water with A123 flashing its light at 10 Hz, 10-ms pulses of 3 mA. The lamp leads are bare and uninsulated at the tips. We see stimulus artifact in two or three SCT signals. We shake the jar and restore to Faraday enclosure, it's another two or three that have significant artifact. Our five minute recording is M1660079782.ndf. Maximum stimulus artifact is 800 μVpp. Minimum is <10 μV. Most often we see around 100 μVpp.
[12-AUG-22] We have three more A3041A encapsulated in epoxy. We apply −3 dBm sweep to an A3015C antenna and observe peak response on VR at the same frequency in all three: 910 MHz. Meanwhile A123 flashes its light, transmits synch signal, and reports battery voltage 2.9 V after fourteen days in water at 60°C.
[15-AUG-22] Three new, encapsulated A3041As. Average mass 1.56 g. Average volume 0.83 ml. All three respond to an identification command. After that, only 7C2D and No6EEA respond to commands, which they do perfectly. Report battery voltages 2.8 V. But we get no further response from No5464. Dissect No5464. Battery voltage 3.0 V. Connect external 2.7 V, functions perfectly flashing light. Reconnect battery. Responds to commands to flash and transmit, but cannot flash at power level 15: we get one flash and the device shuts down. After a few shut-downs, No5464 is no longer responsive. Battery voltage remains 3.0 V as measured by our oscilloscope. Apply magnet in hope of resetting, but magnet does nothing. Disconnect battery and reconnect. Now responds to command to flash at power level 5, 10, and 12, but not 13. A few commands to flash at power level 15 and the device is non-responsive again. Apply magnet for ten seconds, no change. disconnect battery for five seconds, device has recovered. Reports battery voltage 2.8 V. Set it to flashing randomly at 10 Hz, power level 8, one thousand 10-ms pulses and transmitting too. Reports battery voltage 2.7 V. Completes the stimulus, continues transmitting for 60 s then turns off. Will not repond to any further commands. Disconnect battery for one second and reconnect. Responds to stimulus command, starts one thousand non-random pulses. This time we turn off the synchronizing signal before the end of the stimulus. After stimulus, will not respond to commands.
We take out A123 from poach. We have it flash one thousand times at power level 8. At the end of the stimulus, A123 will not respond to commands. We apply magnet, wait ten minutes, still no response. Disconnect battery, battery voltage 2.8 V. Connect external 2.7 V. Hibernation currnet 2.2 μA. Sleep current 7.8 μA. With command antenna 10 cm away, device does not power up upon commands. Place command antenna right on top of A123 and it responds.
Connect No5464 to external 2.7 V. Hibernation current 2.2 μA, sleep current 5.4 μA. Tries to power up through our micrammeter when we send any command. Switch to ammeter and we see No5464 responding to all commands. Flash one thousand times at power level 15 and it's active afterwards. We drop external voltage from 2.7 to 2.5 V and we can still deliver full-power pulses. But at 2.4 V, we see only one flash at full power. When we drop to power level 8, we see the full stimulus. The device tries to power up at 2.3 V, but fails. We start a stimulus with 2.6 V and slowly drop to 2.3 V when the stimulus stops. We raise the battery voltage to 2.7 V again. The device responds to commands.
Back to A123 we remove battery, burn off epoxy around U4 and connect external 2.7 V. Hibernation current 0.8 μA, sleep current 4.0 μA. Tries to power up on commands, then sleep current rises to 7.8 μA. XEN is 0V on U4-4 and VS is 2.7 V. We see S+ is 1.2 V. Clear epoxy from U6. Reconnect power. X+ is 0.6 V, sleep current 4.0 μA. Does not respond to commands at all. Back to 6454 we send it stimuli until it stops responding. We see S+ = 2.5 V. We discharge S+ down to 0V, device remains unresponsive. Disconnect battery and reconnect, it responds. Ask for full-power pulses, get one pulse only, on fifteenth comnmand, the device stops responding. We have S+ = 2.5 V. Discharge to zero, on second command thereafter, the device responds. Try this again, device does not respond. We must disconnect battery and reconnect.
We attach a battery to un-encapsulated No4721. We have used this battery before. We clean and dry, during which our green light turns on brightly. We exercise the IST. After a while, we find that VH drops to 2.3 V with 0.2 Vpp 2 kHz ripple. If we short the battery, it comes back as 2.5 V. As soon as we try a stimulus, the drop with ripple return. We connect external 2.7 V and the device behaves perfectly. We look at VH on 6454 when it is unresponsive. We see the same 2.3 V with 0.2 Vpp ripple on one occasion. We see 0.4 Vpp ripple in another case, followed by return to 2.7 V. We see the device turn on and flash the lamp in another case. Whenever we see failure to respond, we either see the small, sustained ripple or the large, short-lived ripple. When we have external 2.7 V connected, we never see failure to respond to commands. When the ripple is sustained, we see S+ is 3.3 V. We remove L2 and U6 from No4721. We short our battery for three seconds, then try XON, see sustained ripple. When we touch OND, the ripple stops and battery voltage rises to 2.7 V. If we leave probe on OND, we see it flucutating HI and LO during a failed power-up. We repeat and this time we are able to touch OND and see it is HI with ripple.
We conclude that the CR1025 battery, when exhausted by stimulation, cannot provide sufficient current for the logic chip to start up. When exhausted, it can enter a state where the logic chip is trying to start up, but the battery is delivering inadequate current, and somehow OND is asserted so that the logic chip keeps trying to start up. Once the circuit gets stuck in the reduced battery voltage with 0.2-V ripple, it stays in this state, which we name the Power Up Oscillation (PUO) state. We observe VS = VA = VH. As soon as we touch OND the oscillation stops. We reprogram No4721 with KEEPER on OND, no change in behavior. Try DOWN, no change in behavior. Go back to NONE.
We restore U6 and L2 to No4721. We connect an 11-mF supercapacitor across VH. It takes twenty seconds to fill up. Sleep consumption 18 μA suggest the capacitor is taking 10 μA. Still get PUO. Remove supercapacitor and sleep current is 8 μA. Try 66 μF on VH. Still see PUO, but ripple is now 400 Hz. Add another 66 μF and see PUO with ripple 200 Hz. We now find it much harder to provoke PUO. We short the battery for five seconds and press XON repeatedly as the battery recovers, but fail to provoke PUO. We repeat three times, and each time PUO does not occur. The device fails to power up and goes back to sleep until the battery recovers sufficiently, then it powers up properly. With roughly 150 μF on VH we have sufficient capacitance to deliver 10 mA for 4 ms before VH drops from 2.7 V to 2.4 V. When generating full-power stimuli or powering up, the capacitors cut the battery current by half.
Remove added capacitors from No4721. Short battery and provoke PUO as the battery recovers. Bring magnet near circuit and put it into hibernation. Wait one minute. Circuit responds to commands, even flashing its lamp. Connect bench-top power through ammeter with 50 Ω series resistor. We immediately obtain PUO with every command. With 100 Ω we get PUO sometimes, but usuall back to sleep. With 25 Ω, we never get PUO. We drop the applied voltage to 2.4 V and are now able to get PUO with 25 Ω. But without 25Ω the device won't power up. We need 2.5 V minimum. The battery reports 2.4 V. Apply our CR1025 again. It flashes the light and transmits. Reports battery voltage 2.7 V. We deliver 500 of 10-ms pulses at power level 8, which is 3 mA. Battery voltage drops to 2.4 V during stimulus. Looking at VH, we see a few failures to receive commands because of battery exhaustion, but no PUO. With 30-ms pulses of 3 mA we exhaust the battery enough to get PUO. Switch off with magnet, wait five minutes. Still get PUO. Battery exhausted beyond recovery in five minutes.
[16-AUG-22] We have No4721 in restored to A3041A. We supply external 2.7 V through 50 Ω and issue a command. We see PUO immediately. Current consumption is 5.7 mA. We have VA = VS = VH within 100 mV. We see OND staying HI, but the RCK test point output from U7 drops during the rising edge of the ripple with time constant 100 μs towards LO. We see 1V2 is being switched off when VH drops below 2.3 V. We consult the TPS70912 data sheet and read, "Dropout is only valid when VOUT ³ 2.8 V because of the minimum input voltage limits." In moving from the 3.7V LiPo to the 2.7V Li batteries, we overlooked this detail, even though we noted it when studying the A3036 with CR1025 battery.
We apply a 100-kΩ pull-down resistor to OND. We now see if falling with a time constant of 4 μs. We see power-up failure (PUF) but we never see power-up oscillations (PUO). We adjust the power supply voltage from 2.4 to 3.0 V and see no PUO with our 50-Ω source resistance. We try 1 Ω pull-down and see OND falling with 40-μs time constant. We try 100 times to provoke POU with various values of VH from 2.2 to 3.0 V and see none. Instead of power-up oscillations we see power-up failure (PUF), in which the assertion of RP turns on VA and 1V2, which starts up the logic chip, which in turn drops the battery voltage until the 1V2 regulator drops its output to 0.7 V. The cycle repeats only so long as RP is asserted. As soon as the command transmission ends, the pull-down resistor on OND makes sure the device powers down completely.
We power No4721 with the exhausted battery we used yesterday. It cannot start up the logic chip. We try twenty times. We see no PUO, only PUF. We replace the batter with a new CR1025. The IST behaves perfectly. We set it to flashing 1000 times, 10 ms, power level 8 (3 mA) at 10 Hz. It response afterwards. We increase pulses to 30 ms and repeat. We remove the 1 MΩ. We load 2 MΩ P0402 onto No4721 and No61A7 between R8 and U6-5, which is OND to 0V, see here. We add this 2.0 MΩ as R15. We have No61A7 flash its lamp at full power (15) for 1000 random pulses, 10 ms, 10 Hz. Afterwards we repeat and it again it completes the stimulus. Repeat and it stops half-way through. We are able to flash at power level 8.
[23-AUG-22] We have one side-mount and one top-mount CR1025 to make one A3041B and one A3041A, ready for encapsulation.
[26-AUG-22] We test No4721 and No61A7 after encapsulation in epoxy; No 61A7 is 100% reliable. No4721 does not respond at first, but after handling, does respond to commands and flash its lamp.
[29-AUG-22] We have four encapsulated ISTs. No4721 is our A3041B. It has the R15 modification but won't respond to commands. We dissect. Battery voltage 2.9 V. Remove battery and connect external 2.7 V. Device responds perfectly. Examine battery. The negative tab was burned through by the spot welder. We believed the connection was still robust, but now we see that there was no weld, only a pressure contact, which was broken by the epoxy. We load a CR2330 battery. Reception of commands is poor. No6EEA is A3041A. It responds to commands and flashes its lamp but does not have the R15 modification. No7C2D is A3041A. It does not have the R15 modification, responds to all commands, but does not flash its lamp, even as its synchronizing signal states that the lamp is on. We replace the lamp and the lamp flashes. No61A7 is A3041A. It has R15, responds to commands, and flashes its lamp.
[07-SEP-22] Prepare Stimulator 3.1 with its own documentation here. Device No6EEA flashing and responding well yesterday and today. No7C2D responded intermittently yesterday, not at all today. Puncture silicone and find battery voltage fluctuating 2.7-2.9 V. Abandon this device and put it in our sample bag. We obtain the discrete Fourier transform of the synchronizing signal from a regular and random stimulus.
[08-SEP-22] We have Stimulator 3.1 working with the Neuroplayer, using this architecture. The Stimulator sends LWDAQ instructions directly to the telemetry hardware. So does a Neurorecorder. The Neurorecorder and only the Neurorecorder writes to disk. No other process writes to disk. The Neuroplayers and only the Neuroplayers read from disk. One Neuroplayer runs in the same process as the Stimulator to provide auxilliary messages. We place two-channel A3028W2Z SCT in water with our A3041A IST No6EEA, inside a Farady enclosure. We use Stimulator 3.1 to ask for identification, battery measurements, and acknowledgements. We change the primary channel number of the IST and transmit synchronizing signal at various sample rates. We try regular and random pulses. We see lamp artifact in the SCT inputs. Our experiment is recorded in M1662657796.ndf. Towards the end of the recording, the IST is exhuasted and will not power up, but in the last few seconds it does power up and we get battery and identification from it.