2020-11-17 00:36:16 +08:00
[![QUARTIQ Matrix Chat ](https://img.shields.io/matrix/quartiq:matrix.org )](https://matrix.to/#/#quartiq:matrix.org)
2021-04-06 22:28:56 +08:00
[![Continuous Integration ](https://github.com/quartiq/stabilizer/actions/workflows/ci.yml/badge.svg )](https://github.com/quartiq/stabilizer/actions/workflows/ci.yml)
2021-04-13 19:58:56 +08:00
[![Stabilizer HITL [Nightly]](https://github.com/quartiq/hitl/actions/workflows/stabilizer-nightly.yml/badge.svg)](https://github.com/quartiq/hitl/actions/workflows/stabilizer-nightly.yml)
2020-06-16 22:54:40 +08:00
2019-03-21 02:32:23 +08:00
# Stabilizer Firmware
2019-03-10 20:08:32 +08:00
2021-03-03 18:38:28 +08:00
## Hardware
[![Hardware ](https://github.com/sinara-hw/Stabilizer/wiki/Stabilizer_v1.0_top_small.jpg )](https://github.com/sinara-hw/Stabilizer)
## Applications
2019-05-09 22:05:36 +08:00
2021-05-13 17:57:56 +08:00
This firmware offers a library of hardware and software functionality targeting the use of the Stabilizer hardware in various digital signal processing applications commonly occurring in Quantum Technology applications.
It provides abstractions over the fast analog inputs and outputs, time stamping, Pounder DDS interfaces and a collection of tailored and optimized digital signal processing algorithms (IIR, FIR, Lockin, PLL, reciprocal PLL, Unwrapper, Lowpass, Cosine-Sine, Atan2).
An application can compose and configure these hardware and software components to implement different use cases.
Several applications are provides by default:
2019-05-09 22:05:36 +08:00
2021-03-03 18:38:28 +08:00
### Dual-IIR
![Flow diagram ](stabilizer_pid.svg )
2019-04-12 23:43:51 +08:00
* dual channel
* SPI ADC
* SPI DAC
2021-03-03 18:38:28 +08:00
* up to 800 kHz rate, timed sampling
* down to 2 µs latency
2019-04-12 23:43:51 +08:00
* f32 IIR math
* generic biquad (second order) IIR filter
* anti-windup
* derivative kick avoidance
2019-05-28 18:15:15 +08:00
2021-05-06 19:08:10 +08:00
### Lockin
2019-04-12 23:43:51 +08:00
2021-05-13 17:57:56 +08:00
* Up to 800 kHz sampling
* Up to 400 kHz modulation frequency
* Reciprocal PLL for external reference
* Internal reference
* Adjustable PLL and locking time constants
* Adjustable phase offset and harmonic index
* Different output modes (in-phase, quadrature, magnitude, log2 power, phase, frequency)
2019-04-12 23:43:51 +08:00
## Minimal bootstrapping documentation
* Clone or download this
2019-06-06 15:40:17 +08:00
* Get [rustup ](https://rustup.rs/ )
2021-05-13 17:57:56 +08:00
* Minimum supported Rust version (MSRV) is 1.52.0
* Install target support: `rustup target add thumbv7em-none-eabihf`
* Install `probe-run` : `cargo install probe-run`
* `cargo run --release --bin dual-iir`
2021-03-03 18:38:28 +08:00
* When using debug (non `--release` ) mode, increase the sample interval significantly.
The added error checking code and missing optimizations may lead to the code
missing deadlines and panicing.
2019-06-06 15:40:17 +08:00
2021-05-13 17:57:56 +08:00
## Alternative flashing tools
2021-05-13 17:34:17 +08:00
2021-05-13 17:57:56 +08:00
### Cargo-embed
2021-02-03 00:33:58 +08:00
* Install `cargo-embed` : `cargo install cargo-embed`
* Program the device: `cargo embed --bin dual-iir --release`
2021-05-13 17:57:56 +08:00
### GDB/OpenOCD
2019-06-06 15:40:17 +08:00
2019-04-12 23:43:51 +08:00
* Get a recent openocd, a JTAG adapter ("st-link" or some clone) and
2019-05-29 22:25:45 +08:00
everything connected and permissions setup. Most
[Nucleo ](https://www.digikey.de/short/p41h4v ) boards have a
detachable ST-Link v2 and are cheap.[^swd]
2019-04-12 23:43:51 +08:00
* Get a multiarch `gdb` (or a cross arm gdb and edit `.cargo/config` accordingly)
* `openocd -f stabilizer.cfg` and leave it running
* `cargo run --release`
2019-05-28 18:15:15 +08:00
2021-05-13 17:57:56 +08:00
### USB-DFU
2019-06-06 15:40:17 +08:00
2021-05-13 17:34:17 +08:00
* Get [cargo-binutils ](https://github.com/rust-embedded/cargo-binutils/ )
* `cargo objcopy --release --bin dual-iir -- -O binary dual-iir.bin` or `arm-none-eabi-objcopy -O binary target/thumbv7em-none-eabihf/release/dual-iir dual-iir.bin`
2019-06-07 16:17:50 +08:00
* Install the DFU USB tool (`dfu-util`)
2019-06-06 15:40:17 +08:00
* Connect to the Micro USB connector below the RJ45
2019-06-07 16:17:50 +08:00
* Short JC2/BOOT
2021-02-02 06:38:41 +08:00
* `dfu-util -a 0 -s 0x08000000:leave -D dual-iir.bin`
2019-06-06 15:40:17 +08:00
2021-05-13 17:57:56 +08:00
### ST-Link virtual mass storage
2019-06-06 15:40:17 +08:00
2021-05-13 17:34:17 +08:00
* Prepare `dual-iir.bin` like above
2019-06-06 15:40:17 +08:00
* Connect the ST-Link debugger
2021-05-13 17:34:17 +08:00
* Copy `dual-iir.bin` to the `NODE_H743ZI` virtual mass storage device
2019-06-06 15:40:17 +08:00
2019-05-28 18:15:15 +08:00
## Protocol
2021-03-03 18:38:28 +08:00
Stabilizer can be configured via MQTT. Refer to
2021-02-19 17:57:12 +08:00
[`miniconf` ](https://github.com/quartiq/miniconf ) for more information about topics.
2021-03-03 18:38:28 +08:00
A basic command line interface is available in [`miniconf.py` ](miniconf.py ).
2021-05-13 17:57:56 +08:00
Telemetry is published via MQTT as well.