|atse bb4f43fe1c||1 month ago|
|.cargo||5 years ago|
|doc||3 years ago|
|pytec||6 months ago|
|src||1 month ago|
|.gitignore||5 years ago|
|Cargo.lock||2 years ago|
|Cargo.toml||2 years ago|
|LICENSE||5 years ago|
|README.md||1 month ago|
|build.rs||5 years ago|
|flake.lock||1 month ago|
|flake.nix||1 month ago|
|memory.x||3 years ago|
|openocd.gdb||5 years ago|
Firmware for the Sinara 8451 Thermostat
Reproducible build with Nix
Thermostat firmware is packaged using the Nix Flakes system. Install Nix 2.4+ and enable flakes by adding
experimental-features = nix-command flakes to
Once you have Flakes enabled, you can use
nix build to build the firmware.
Clone this repository and with Nix Flakes enabled, use the following commands:
nix develop cargo build --release
The resulting ELF file will be located under
Alternatively, you can install the Rust toolchain without Nix using rustup; see the Rust manifest file pulled in
flake.nix to determine which Rust version to use.
Connect SWDIO/SWCLK/RST/GND to a programmer such as ST-Link v2.1. Run OpenOCD:
openocd -f interface/stlink-v2-1.cfg -f target/stm32f4x.cfg
You may need to power up the programmer before powering the device. Leave OpenOCD running. Run the GNU debugger:
gdb target/thumbv7em-none-eabihf/release/thermostat (gdb) source openocd.gdb
There are several options for flashing Thermostat. DFU requires only a micro-USB connector, whereas OpenOCD needs a JTAG/SWD adapter.
dfu-util on Linux
- Install the DFU USB tool (dfu-util).
- Convert firmware from ELF to BIN:
arm-none-eabi-objcopy -O binary thermostat thermostat.bin(you can skip this step if using the BIN from Hydra)
- Connect to the Micro USB connector to Thermostat below the RJ45.
- Add jumper to Thermostat v2.0 across 2-pin jumper adjacent to JTAG connector.
- Cycle board power to put it in DFU update mode
- Push firmware to flash:
dfu-util -a 0 -s 0x08000000:leave -D thermostat.bin
- Remove jumper
- Cycle power to leave DFU update mode
st.com DfuSe tool on Windows
- add jumper to Thermostat v2.0 across 2-pin jumper adjacent to JTAG connector
- cycle board power to put it in DFU update mode
- connect micro-USB to PC
- use st.com software to upload firmware
- remove jumper
- cycle power to leave DFU update mode
openocd -f interface/stlink-v2-1.cfg -f target/stm32f4x.cfg -c "program target/thumbv7em-none-eabihf/release/thermostat verify reset;exit"
Ethernet, IP: 192.168.1.26/24
Use netcat to connect to port 23/tcp (telnet)
rlwrap nc -vv 192.168.1.26 23
telnet clients send binary data after connect. Enter \n once to invalidate the first line of input.
Reading ADC input
Set report mode to
on for a continuous stream of input data.
The scope of this setting is per TCP session.
Send commands as simple text string terminated by
\n. Responses are
formatted as line-delimited JSON.
||Show current input|
||Show current report mode|
||Set report mode|
||Show current PWM settings|
||Set maximum positive output current|
||Set maximum negative output current|
||Set maximum output voltage|
||Disengage PID, set fixed output current|
||Let output current to be controlled by the PID|
||Set the MAX1968 0A-centerpoint to the specified fixed voltage|
||Set the MAX1968 0A-centerpoint to measure from VREF|
||Show PID configuration|
||Set the PID controller target temperature|
||Set proportional gain|
||Set integral gain|
||Set differential gain|
||Set mininum output|
||Set maximum output|
||Show Steinhart-Hart equation parameters|
||Set Steinhart-Hart parameter for a channel|
||Show postfilter settings|
||Set postfilter output data rate|
||Restore configuration for channel all/0/1 from flash|
||Save configuration for channel all/0/1 to flash|
||Reset the device|
||Reset device and enters USB device firmware update (DFU) mode|
||Configure IPv4 address, netmask length, and optional default gateway|
||Show current fan settings and sensors' measurements|
||Set fan power with values from 1 to 100|
||Enable automatic fan speed control|
||Set fan controller curve coefficients (see Fan control section)|
||Set fan controller curve coefficients to defaults (see Fan control section)|
||Show hardware revision, and settings related to it|
The firmware includes experimental support for acting as a USB-Serial peripheral. Debug logging will be sent there by default (unless build with logging via semihosting.)
Caveat: This logging does not flush its output. Doing so would hang indefinitely if the output is not read by the USB host. Therefore output will be truncated when USB buffers are full.
Connect the thermistor with the SENS pins of the device. Temperature-depending resistance is measured by the AD7172 ADC. To prepare conversion to a temperature, set the Beta parameters for the Steinhart-Hart equation.
Set the base temperature in degrees celsius for the channel 0 thermistor:
s-h 0 t0 20
Set the resistance in Ohms measured at the base temperature t0:
s-h 0 r0 10000
Set the Beta parameter:
s-h 0 b 3800
50/60 Hz filtering
The AD7172-2 ADC on the SENS inputs supports simultaneous rejection of
50 Hz ± 1 Hz and 60 Hz ± 1 Hz (dB). Affecting sampling rate, the
postfilter rate can be tuned with the
|Postfilter rate||Rejection||Effective sampling rate|
|16.67 Hz||92 dB||8.4 Hz|
|20 Hz||86 dB||9.1 Hz|
|21.25 Hz||62 dB||10 Hz|
|27 Hz||47 dB||10.41 Hz|
Thermo-Electric Cooling (TEC)
- Connect TEC module device 0 to TEC0- and TEC0+.
- Connect TEC module device 1 to TEC1- and TEC1+.
- The GND pin is for shielding not for sinking TEC module currents.
When using a TEC module with the Thermostat, the Thermostat expects the thermal load (where the thermistor is located) to cool down with a positive software current set point, and heat up with a negative current set point.
Testing heat flow direction with a low set current is recommended before installation of the TEC module.
Each of the MAX1968 TEC driver has analog/PWM inputs for setting output limits.
pwm command to see current settings and maximum values.
||Amperes||Maximum positive current|
||Amperes||Maximum negative current|
||Amperes||(Not a limit; Open-loop mode)|
Example: set the maximum voltage of channel 0 to 1.5 V.
pwm 0 max_v 1.5
Example: set the maximum negative current of channel 0 to -3 A.
pwm 0 max_i_neg 3
Example: set the maximum positive current of channel 1 to 3 A.
pwm 0 max_i_pos 3
To manually control TEC output current, omit the limit parameter of
pwm command. Doing so will disengage the PID control for that
Example: set output current of channel 0 to 0 A.
pwm 0 i_set 0
PID-stabilized temperature control
Set the target temperature of channel 0 to 20 degrees celsius:
pid 0 target 20
Enter closed-loop mode by switching control of the TEC output current of channel 0 to the PID algorithm:
pwm 0 pid
|L3||Green||Closed-loop mode (PID engaged)|
Use the bare
report command to obtain a single report. Enable
continuous reporting with
report mode on. Reports are JSON objects
with the following keys.
||Seconds||Temperature measurement time|
||Ohms||Thermistor resistance derived from
||Degrees Celsius||Steinhart-Hart conversion result derived from
||Amperes||TEC output current|
||Volts||MAX1968 VREF (1.5 V)|
||Volts||AD5680 output derived from
||Volts||ADC measurement of the AD5680 output|
||Volts||MAX1968 TEC current monitor|
||Amperes||TEC output current feedback derived from
||Volts||Measurement of the voltage across the TEC|
||Amperes||PID control output|
The thermostat implements a PID control loop for each of the TEC channels, more details on setting up the PID control loop can be found here.
Fan control is available for the thermostat revisions with integrated fan system. For this purpose four commands are available:
fan- show fan stats:
fan auto- enable auto speed controller mode, which correlates with fan curve
fan <value>- set the fan power with the value from
100and disable auto mode. There is no way to disable the fan. Please note that power doesn't correlate with the actual speed linearly.
fcurve <a> <b> <c>- set coefficients of the controlling curve
a*x^2 + b*x + c, where
abs_max_tec_i/MAX_TEC_I, i.e. receives values from 0 to 1 linearly tied to the maximum current. The controlling curve should produce values from 0 to 1, as below and beyond values would be substituted by 0 and 1 respectively.
fcurve default- restore fan curve settings to defaults:
a = 1.0, b = 0.0, c = 0.0.