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-01-09 02:04:59 +08:00
|
|
|
[![HITL (private)](https://github.com/quartiq/hitl/workflows/Stabilizer/badge.svg)](https://github.com/quartiq/hitl/actions?query=workflow%3AStabilizer)
|
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
|
|
|
|
2019-05-21 23:55:01 +08:00
|
|
|
![Flow diagram](stabilizer_pid.svg)
|
2019-05-09 22:05:36 +08:00
|
|
|
|
|
|
|
![Hardware](https://github.com/sinara-hw/Stabilizer/wiki/Stabilizer_v1.0_top_small.jpg)
|
|
|
|
|
2019-04-12 23:43:51 +08:00
|
|
|
## Features
|
|
|
|
|
|
|
|
* dual channel
|
|
|
|
* SPI ADC
|
|
|
|
* SPI DAC
|
2019-05-28 18:15:15 +08:00
|
|
|
* 500 kHz rate, timed sampling
|
|
|
|
* 2 µs latency, unmatched between channels
|
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
|
|
|
|
|
|
|
## Limitations/TODOs
|
|
|
|
|
|
|
|
* Fixed AFE gains
|
2021-02-02 06:38:41 +08:00
|
|
|
* The IP and MAC address are [hardcoded](src/hardware/configuration.rs)
|
2019-05-28 18:15:15 +08:00
|
|
|
* Expose configurable limits
|
|
|
|
* 100Base-T only
|
|
|
|
* Digital IO, GPIO header, AFE header, EEM header are not handled
|
2019-04-12 23:43:51 +08:00
|
|
|
|
|
|
|
## Hardware
|
|
|
|
|
|
|
|
See https://github.com/sinara-hw/Stabilizer
|
|
|
|
|
|
|
|
## Minimal bootstrapping documentation
|
|
|
|
|
|
|
|
* Clone or download this
|
2019-06-06 15:40:17 +08:00
|
|
|
* Get [rustup](https://rustup.rs/)
|
2020-06-03 19:37:42 +08:00
|
|
|
* Get [cargo-binutils](https://github.com/rust-embedded/cargo-binutils/)
|
2019-06-06 15:40:17 +08:00
|
|
|
* `rustup target add thumbv7em-none-eabihf`
|
|
|
|
* `cargo build --release`
|
2019-06-07 17:55:10 +08:00
|
|
|
* Do not try the debug (default) mode. It is guaranteed to panic.
|
2019-06-06 15:40:17 +08:00
|
|
|
|
2021-02-03 00:33:58 +08:00
|
|
|
### Using Cargo-embed
|
|
|
|
|
|
|
|
* Install `cargo-embed`: `cargo install cargo-embed`
|
|
|
|
* Program the device: `cargo embed --bin dual-iir --release`
|
|
|
|
|
2019-06-06 15:40:17 +08:00
|
|
|
### Using GDB/OpenOCD
|
|
|
|
|
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
|
|
|
|
2019-05-29 22:25:45 +08:00
|
|
|
[^swd]: Build a cable: connect a standard 8 conductor ribbon with the wires numbered
|
|
|
|
`1-8` to the pins on the St-Link v2 single row 2.54mm connector as `647513(82)`
|
|
|
|
(`(i)` marks an unused wire)
|
|
|
|
and to the [1.27mm dual row](https://www.digikey.de/short/p41h0n) on Stabilizer as `657483x2x1`
|
|
|
|
(`x` marks an unused pin, enumeration is standard for dual row, as in the
|
|
|
|
schematic).
|
|
|
|
It's just folding the ribbon between wires `5` and `6`. The signals on the ribbon
|
|
|
|
are then `NRST,TDI,TDO,TCK,TMS,3V3,GND,GND`.
|
2019-05-28 18:15:15 +08:00
|
|
|
|
2019-06-06 15:40:17 +08:00
|
|
|
### Using USB-DFU
|
|
|
|
|
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
|
|
|
* `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`
|
2019-06-06 15:40:17 +08:00
|
|
|
|
|
|
|
### Using ST-Link virtual mass storage
|
|
|
|
|
2021-02-02 06:38:41 +08:00
|
|
|
* `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-06 15:40:17 +08:00
|
|
|
* Connect the ST-Link debugger
|
2021-02-02 06:38:41 +08:00
|
|
|
* copy `dual-iir.bin` to the `NODE_H743ZI` USB disk
|
2019-06-06 15:40:17 +08:00
|
|
|
|
2019-05-28 18:15:15 +08:00
|
|
|
## Protocol
|
|
|
|
|
|
|
|
Stabilizer can be configured via newline-delimited JSON over TCP.
|
|
|
|
It listens on port 1235. [stabilizer.py](stabilizer.py) contains a reference
|
|
|
|
implementation of the protocol.
|