Skip to content

Firmware release notes

What changed in each firmware release, from the release notes in the firmware repository, up to the release this site describes.

There is no release 108 for the Spectral Micro: from 109 it shares its version numbers with STEPFOC, and goes from 107 straight to 109. Upgrading from older firmware says what a driver keeps and what to run when it moves to 109.

V110 (2026-11-13)

Spectral BLDC firmware V110 — application image for flashing via the Spectral bootloader. Mostly gripper work: an SSG-48 gripper (a Spectral Micro in gripper mode) now ends its moves cleanly and closes fully at position 255. Everything below is described in the manual: Spectral Micro docs; what a driver keeps and what to run after the update: Upgrading from older firmware.

Grippers

  • A move ends cleanly. On 109 the current took over two seconds to settle after a move: the speed loop's integral was carried into the hold and unwound slowly through friction. Now the integral is dropped on arrival, the last stretch of a move slows down, and the hold has a small dead zone (a quarter of a position count). A few mA are left after a move.
  • A soft start. A move picks up speed over 0.1 s instead of starting at full speed.
  • Positions 0 and 255 clear the stops, and 255 is fully closed. On 109 the calibration read the ends while pushing at 500 mA, so 0 and 255 lay inside the stops: a full open or close pressed on the stop, drew the grip current for good and often reported an object. Each end is now read under a light 100 mA push (released to no current, the SSG-48's free-running jaws spring back about 1 mm off the stop); 0 sits 32 ticks inside the open stop and 255 16 ticks from the closed one. On an SSG-48 the jaws stop 0.12 mm short of fully closed at 255, and the calibration repeats within 4 ticks.
  • Object detection reports an object after the jaws have stood still against it for 50 ms.
  • The gripper pushes with its own current limit. On 109 every gripper command overwrote the driver's current limit (parameter 16) with its grip current, and a Save config then stored it.
  • The gripper calibration can be started again while it runs, ends on a timeout or a stroke under 1000 ticks, and puts the current limit back. The position is rounded to the nearest count (it was cut off).

CAN bus

  • Parameters 90-93: 90 #Rstint, 91 the thermistor (#Term), 92 gripper mode (#Gripper, written only while idle), each 0 or 1 and saved by Save config, so a preset over CAN can set everything (issue #1); 93, read only, the gripper's stroke between positions 0 and 255 in ticks (0 until calibrated).

UART

  • #Estop: the E-stop, as CAN has it. The motor is released, a running calibration ends, and the E-stop latches until #Clear.
  • #Close during a motor calibration stops the calibration (Close: the calibration is stopped). On 109 it switched the mode under the running calibration.

Settings and safety

  • Brake or coast when idle (parameter 18) is saved by Save config. On 109 it was back to its default at every power-up. A driver that never saved it coasts, as before.
  • Watchdog: a trip while the driver is idle no longer starts the hold or the descend (on 109 it did, for the whole fallback time). A trip while a loop is closed holds as before.

Compatibility

  • The settings and the motor calibration of 109 are kept. The gripper calibration is kept in RAM, as always: calibrate the gripper after the update.
  • Python library 1.22 (pip install --upgrade Spectral-BLDC) names parameters 90-93; 1.21 reads them by number. Motor GUI 0.7.0 uses what 110 adds: STOP over UART sends #Estop, brake or coast counts as saved, a preset over CAN writes 90-92.
  • Bench-tested for this release on an SSG-48 gripper: the moves and the hold, moves of one count, the ends and the closed gap, the soft start, gripping objects, the calibration's repeatability, parameters 90-93, brake or coast over a save and a restart, the driver's current limit through gripper moves, the watchdog while idle and in a closed loop, an aborted gripper calibration. #Estop and #Close were tried over UART on the STEPFOC, which has the same code. Not tested on the bench: an upgrade from V103 with the ST-Link, and a downgrade.

Assets

  • spectral-bldc-firmware-V110.bin — application firmware image (flash at 0x08003000, target STM32F103CB).
  • firmware.json — manifest with version, size, and SHA-256 for download verification by the web flasher.

Integrity

  • SHA-256: eae54f56b4d0eb3677155447a5ce68156bfbda16e81534513ad71cb0dbbbfb21
  • Size: 112984 bytes

Built from commit 38d210d on Bootloader_main (#Info shows it as Build: 38D210D). Includes bootloader entry support (CAN/UART reset-into-bootloader).

V109 (2026-11-10)

Spectral Micro BLDC firmware V109 — application image for flashing via the Spectral bootloader. From 109 the Spectral Micro and the STEPFOC share their version numbers, so there is no 108: 109 follows 107. Everything below is described in the manual: Spectral Micro docs; what a driver keeps and what to run after the update: Upgrading from older firmware.

Phase B (the main fix)

  • In every release up to 107 the gate driver's phase-B enable input was fed by the microcontroller's 8 MHz clock output instead of a steady level, so phase B could drop out: weaker or uneven torque, a calibration that failed with a wrong pole-pair count, or a motor that took a current command and did not move, with no error. 109 drives the pin properly. On the bench: 5 of 5 calibrations and full torque on every test, also over 10 restarts.
  • The calibration now reports the true phase resistance and inductance (on the reference gimbal motor about 7.0-7.2 Ω and 1.75-1.9 mH, where 107 reported about 6.4 Ω and 1.25 mH); the old × 1.25 correction is gone.
  • After the update: a calibration made with 107 keeps working. Calibrate again (#Cal) where the motor can turn freely, so the current gains follow the true values. An assembled SSG-48 gripper keeps its calibration: apply Motor GUI's SSG-48 preset instead, with the gripper's CAN ID set first.

New features

  • Parameters: any setting or read-out by number over CAN (commands 36-38) or #Par (parameters 1-89). Identity (39) and telemetry (40) frames.
  • Capture, histogram and buffers (41-43).
  • Watchdog actions: idle, brake, coast, hold the position, or descend at a capped speed, with a fallback time.
  • Current loop from R, L and one bandwidth (parameter 49, default 160 Hz; the SSG-48 preset uses 300 Hz). Measured on the bench and on by default: the direct PLL speed estimate at 100 Hz and commutation delay compensation of 234 µs (a speed step overshoots about 18 % instead of 63 %).
  • Encoder table and anti-cogging measured on the driver: #Cal runs the calibration, then both, and saves; #Calonly is the calibration alone.
  • Sound through the motor: tones, a queue of notes and samples (CAN 44 and 45, #Tone).
  • Identification: #Info and parameters 84-87 report the build (git commit), the board ID and a calibration ID. Parameters 88 and 89 are an experimental current-sampling diagnostic, off by default.
  • Settings in blocks with their own checksums; a reset keeps the CAN ID; a product lock refuses a STEPFOC image on a Spectral board.

Calibration

  • Both current sensors are averaged; pole pairs 1-49; a rotor that does not follow the open-loop field ends with Open loop: Failed and two hint lines; an inductance that gives no gains fails the calibration instead of hanging.
  • Kt and KV are measured in four spins alternating direction; a warning only when two same-direction spins differ by more than 5 %.
  • The gate driver stays awake for the whole calibration. A failed calibration switches the bridge off at once and enables all three phases again. An E-stop ends a calibration, and #Cal is refused while one is latched. Calibrating many times without a power cycle no longer uses up memory.

Safety

  • The control loop keeps the gate driver awake in every driving mode: a command arriving at the wrong moment could leave it asleep, with no torque and no error, until the next idle.
  • Limits: a negative or not-a-number value is ignored by the legacy CAN frames (limits, gains, Kt, voltage limit 0-60000 mV); #Ilim and #Vlimit take the magnitude; the current of a gripper move stays within 0-2800 mA; #PP and parameter 78 take 1-49 pole pairs, only while idle (50 and more would read as a STEPFOC calibration at the next start). PWM duties stay between 0 and 100 %.
  • The current-sense zero waits for the motor supply: started on USB before the supply, the driver used a zero about 100 mA off. It now says so in #Info and measures the zero by itself once the supply is there.
  • #Error says FAULT pin is LOW: the gate driver reports a fault (the text said HIGH). No undervoltage error while the supply ramps up at power-up.

CAN bus

  • A gripper poll right after a new move command no longer cancels it as new: object detection reports contact again (it read "at position" while pressing on an object). The same in every release before 109.
  • The current and PD frames set their setpoint and mode together. Length codes above 8 are read as 8; extended (29-bit) frames are ignored.
  • Watchdog: setting its time or a save starts a fresh window; a negative time means off; hold and descend no longer use the last moving loop's delay compensation.

Bug fixes

  • After #Cal, a host that takes the driver within 3 s drops the encoder-table and anti-cogging runs. #Encal and #Cogcal start only on their own words. While such a run turns the motor, a capture is not armed and the histogram is not changed.
  • A storage block whose check fails is read up to three times before its defaults are used. #Info says the anti-cogging is saved only while what is in RAM equals what is stored.
  • The sound queue and sample buffer no longer replay old content after a stop; a pitch the driver cannot play answers Tone: not played.

Compatibility

  • Python library 1.21 or newer (pip install --upgrade Spectral-BLDC), Motor GUI 0.5.0.
  • Bench-tested for this release: calibration, current mode, restarts, the E-stop, the encoder table and anti-cogging, and the SSG-48 gripper on its 107 calibration. Not tested on the bench: an upgrade from V103 with the ST-Link, a downgrade, and on the Spectral Micro the watchdog actions, the capture and the sound (the same code passed on the STEPFOC).

Assets

  • spectral-bldc-firmware-V109.bin — application firmware image (flash at 0x08003000, target STM32F103CB).
  • firmware.json — manifest with version, size, and SHA-256 for download verification by the web flasher.

Integrity

  • SHA-256: 96945eec70be12f0e74c6add5fd9fafd4054677e4ebf29d0380062c77a4f6d87
  • Size: 112420 bytes

Built from commit b5cedd5 on Bootloader_main (#Info shows it as Build: B5CEDD5). Includes bootloader entry support (CAN/UART reset-into-bootloader).

V107 (2026-08-26)

Spectral BLDC firmware V107 — application image for flashing via the Spectral bootloader.

CAN bus

  • Fixed IN_DATA_PACK_PD writing the commanded speed into Feedforward_speed instead of Velocity_setpoint — PD mode's KD (velocity-damping) term was being evaluated against a stale/zero setpoint, so it silently ignored the commanded speed.
  • Added a generic mask+value settings command (IN_SETTINGS) for CAN-unreachable boolean settings, starting with idle-mode brake/coast selection.

Usability

  • Idle mode can now be set to brake (driver stays enabled, phases held shorted via a zero-voltage PWM vector) or coast (Hi-Z, previous/default behavior), via IN_SETTINGS over CAN or #Brake <0|1> over UART.

Calibration

  • Fixed #Cal spuriously failing with "Commutation/alignment check failed!" on some individual motor units. The pre-check that confirms the motor responds to a current command was driving a fixed voltage at the raw (uncalibrated) encoder angle; whether that produced torque depended on each unit's random magnet-to-encoder mounting angle. It now retries once at a 90-degree angle bias before failing.

Assets

  • spectral-bldc-firmware-V107.bin — application firmware image (flash at 0x08003000, target STM32F103CB).
  • firmware.json — manifest with version, size, and SHA-256 for download verification by the web flasher.

Integrity

  • SHA-256: 2ca1f2e3ad3ee7848cf47d8733b084be2daa87fc2e49f954dd41c76405d48ada
  • Size: 95404 bytes

Built from commit 2e7febc on Bootloader_main.

V106 (2026-07-06)

Spectral BLDC firmware V106 — application image for flashing via the Spectral bootloader.

CAN bus - The controller now drains up to 8 CAN messages per pass instead of just 1, so short bursts (multiple commands sent back-to-back, or a busy multi-node bus) no longer silently drop messages once the 3-deep hardware FIFO fills. - A CAN peripheral that fails to initialize no longer bricks the board — UART stays fully usable, only the CAN bus is skipped.

Safety - Added a hardware watchdog (100ms). If the control loop ever stops running, the board resets instead of leaving the motor driven at a stale duty cycle. - Fixed a bug where Torque_mode could silently overwrite your commanded Iq setpoint when clamping to the current limit — reading it back after clamping now shows what you actually asked for, and raising the current limit afterward immediately restores the original commanded torque instead of requiring the command to be resent. - Fixed undefined behavior in a serial-protocol integer conversion (fourBytesToInt). - Synced default configuration values that had drifted between two locations in the code, so a fresh #Default and a freshly-flashed board's built-in defaults now agree.

EEPROM / configuration integrity - Added CRC validation over the saved configuration, split into two independent halves: calibration data (resistance, inductance, Kt/KV, angle offset, current-loop gains, etc.) and settings (PID tuning, limits, watchdog config, CAN ID, etc.). - This means a corrupted save (e.g. from a power loss mid-write) is detected and safely defaulted instead of silently running with garbage values — and critically, a future firmware update that only adds a new setting can no longer wipe your calibration, since the two are validated independently. - Boards upgrading from older, pre-CRC firmware keep their existing calibration automatically — no need to recalibrate after this update. - A few unused slots were reserved in the calibration block for upcoming features (e.g. magnet alignment), so those can be added later without another migration.

Performance - PWM output no longer re-resolves which timer/channel it's writing to on every single call (it was doing this 4x per control tick) — resolved once and cached, freeing up ISR headroom. - Velocity calculation switched from a floating-point divide to an integer multiply.

Usability - New #Help command — prints a summary of the available commands. - Serial now responds with "Unknown command" for unrecognized input instead of silently ignoring it. - Calibration now prints progress during the angle-offset search (previously up to ~40 seconds of silence that could look like the board had hung). - #Info now always reports live ISR execution time, useful for checking control-loop headroom on the bench. - Fixed a leftover calibration-failure message that incorrectly suggested swapping motor phases — that failure mode no longer exists (reversed wiring has been auto-detected/compensated in software since V105); the message now accurately describes what actually happened (a commutation/current-response check, not a wiring-direction problem).

Assets - spectral-bldc-firmware-V106.bin — application firmware image (flash at 0x08003000, target STM32F103CB). - firmware.json — manifest with version, size, and SHA-256 for download verification by the web flasher.

Integrity - SHA-256: edb06ca112a7d24b0581e0b157a4524928067a46f8dc850ce22df8128092a758 - Size: 94908 bytes

Built from commit e1f8611 on Bootloader_main.

V105 (2026-07-05)

Spectral BLDC firmware V105 — reversed-wiring auto-calibration

#Cal now auto-detects reversed motor phase wiring during the open-loop spin and compensates it in software as a phase B<->C reflection, instead of failing and telling you to physically swap phases. Angle-offset calibration is now found automatically as part of #Cal itself (deterministic rotor-lock + verify + symmetry-sweep), so the standalone #Calangle command has been removed. #Info now reports the true firmware version instead of a stale EEPROM value. Existing calibrated units are unaffected and do not need #Default.

Assets - spectral-bldc-firmware-V105.bin — application firmware image (flash at 0x08003000, target STM32F103CB). - firmware.json — manifest with version, size, and SHA-256 for download verification by the web flasher.

Integrity - SHA-256: 0bd80ea038b8497fca8ab6a613b083d28e3473b360fa152b512b8ab0304dedb5 - Size: 91732 bytes

Built from commit b7dded3 on Bootloader_main. Includes reversed-wiring auto-calibration (commutation_dir detection + phase B<->C reflection) and deterministic rotor-lock angle-offset calibration.

V104 (2026-06-19)

Spectral BLDC firmware V104 — bootloader build.

Assets

  • spectral-bldc-firmware-V104.bin — firmware image (90,968 bytes).
  • firmware.json — manifest with version, size, and SHA-256.

Integrity

  • SHA-256: 76d70a6091218d74021eeef55c31d39f19fe97f68e2b236169f84c708518a360
  • Size: 90968 bytes

Built from commit 20765c9 on Bootloader_main. Includes CAN Vlim command and bootloader support.

v101 (2025-09-29)

Some small fixes added based on STEPFOC code that is a clone of this code.

  1. Added theta_offset calib.
  2. Fixed some issues related to gripper mode where it vibrates

NOTE added another entry to EEPROM memory. Loading this code to update your previous code you will need to run #Default to load that new entry in EEPROM!

v100 (2024-03-27)

Software version 100

Comments


Found a mistake on this page? Edit it on GitHub · Report it · Get help · This page as Markdown · llms.txt · The whole manual as PDF