81 lines
3.1 KiB
Markdown
81 lines
3.1 KiB
Markdown
[![QUARTIQ Matrix Chat](https://img.shields.io/matrix/quartiq:matrix.org)](https://matrix.to/#/#quartiq:matrix.org)
|
|
[![Continuous Integration](https://github.com/quartiq/stabilizer/actions/workflows/ci.yml/badge.svg)](https://github.com/quartiq/stabilizer/actions/workflows/ci.yml)
|
|
[![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)
|
|
|
|
# Stabilizer Firmware
|
|
|
|
## Hardware
|
|
|
|
[![Hardware](https://github.com/sinara-hw/Stabilizer/wiki/Stabilizer_v1.0_top_small.jpg)](https://github.com/sinara-hw/Stabilizer)
|
|
|
|
## Applications
|
|
|
|
The Stabilizer firmware offeres a library of hardware and software functionality
|
|
exposing input/output, timing, and digital signal processing features.
|
|
An application can compose and configure these hardware and software components
|
|
to implement different use cases. Several applications are provides by default
|
|
|
|
### Dual-IIR
|
|
|
|
![Flow diagram](stabilizer_pid.svg)
|
|
|
|
* dual channel
|
|
* SPI ADC
|
|
* SPI DAC
|
|
* up to 800 kHz rate, timed sampling
|
|
* down to 2 µs latency
|
|
* f32 IIR math
|
|
* generic biquad (second order) IIR filter
|
|
* anti-windup
|
|
* derivative kick avoidance
|
|
|
|
### Lockin
|
|
|
|
## Minimal bootstrapping documentation
|
|
|
|
* Clone or download this
|
|
* Get [rustup](https://rustup.rs/)
|
|
* `rustup target add thumbv7em-none-eabihf`
|
|
* `cargo build --release`
|
|
* Minimum supported Rust version (MSRV) is 1.51.0
|
|
* 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.
|
|
|
|
### Using Cargo-embed
|
|
|
|
* Install `cargo-embed`: `cargo install cargo-embed`
|
|
* Program the device: `cargo embed --bin dual-iir --release`
|
|
|
|
### Using GDB/OpenOCD
|
|
|
|
* Get a recent openocd, a JTAG adapter ("st-link" or some clone) and
|
|
everything connected and permissions setup. Most
|
|
[Nucleo](https://www.digikey.de/short/p41h4v) boards have a
|
|
detachable ST-Link v2 and are cheap.[^swd]
|
|
* 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`
|
|
|
|
### Using USB-DFU
|
|
|
|
* Install the DFU USB tool (`dfu-util`)
|
|
* Connect to the Micro USB connector below the RJ45
|
|
* Short JC2/BOOT
|
|
* 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`
|
|
* `dfu-util -a 0 -s 0x08000000:leave -D dual-iir.bin`
|
|
|
|
### Using ST-Link virtual mass storage
|
|
|
|
* 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`
|
|
* Connect the ST-Link debugger
|
|
* copy `dual-iir.bin` to the `NODE_H743ZI` USB disk
|
|
|
|
## Protocol
|
|
|
|
Stabilizer can be configured via MQTT. Refer to
|
|
[`miniconf`](https://github.com/quartiq/miniconf) for more information about topics.
|
|
A basic command line interface is available in [`miniconf.py`](miniconf.py).
|