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 21:18:22 +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.
2021-05-13 17:57:56 +08:00
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.