- This firmware is for two phase stepper motor actuator controller.
- It allows for smooth (close-loop) torque control by reading shaft angle from a magnetic sensor
- it support CANbus communication. It can interpret values based on specified motor gearing
- PCB Schematics repo here
- STMicroelectronics' 32-bit MCU, STM32F103C8T6 ARM 32-bit, Cortex™-M3 CPU Core, 72MHz maximum frequency, 20k RAM, 64k Flash (but really 128k ??).
- TLE5012 15bit magnetic (GMR) angle sensor. Also provides temperature sensing.
- A4950 drivers with integrated mosfets and cureent limit
- It uses Platformio build system, to configure, upload and debug the program
- Uses ST's (old) Standard Peripheral Library (src/lib) for registers configuration
- CAN handling c-code is generated from dbc file using cantools. See
generate_Msg.sh
- User can interact with the program using Function buttons (F1 and F2) and Reset button (Rst)
- Specify your programming dongle in
firmware/platformio.ini
- default is stlink - The easiest way to build is to load
firmware
folder into VScode workspace and loading Platformio IDE extension. Quick start. - Alternatively Platformio Core can be used to build from command line:
cd /firmware
platformio run
- Upload firmware to the board by pressing Upload arrow at the status bar in VScode
- Eeprom is not erased when flashing the firmware - any future calibration will not be lost
- Eeprom can be erased to factory state using ST-Link tool or in Platformio activity bar ServoCAN_dev -> Custom -> Erase Flash
- In
firmware/src/BSP/actuator_config.c
set:rated_current
(single phase) andrated_torque
from motor spec or measurement. Note, this is just a datapoint and will be extrapolated up to 3.3A. Choose motor wisely.motor_gearbox_ratio
- gearbox attached to the motorfinal_drive_ratio
- any additional gearing - separate parameter for convenience
- Depending on mounting orientation and gearing the motor rotation direction may be reversed. You can change the direction by setting
motor_gearbox_ratio
orfinal_drive_ratio
to a negative value.
BLUE LED (Function):
- short single blink after user long presses
F1
button indicating button can be released - solid - waiting for user confirmation [of calibration] (either with
F1
button or Enter in Platformio OpenOCD debugger virtual serial console)
RED LED (Error):
- solid/dim/flickering - Motion task CPU overrun (shall not happen)
- slowly blinking every 1s- encoder initialization error
- solid
with short interruption every 1s- waiting for power supply voltage to be above 8V (checks voltage every 1s)
-
On first start default parameters are loaded to be later stored in Flash.
-
During first start two phases are briefly actuated and based on angle sensor movement
motorParams.motorWiring
is determined automatically. -
Next the controller automatically waits (blue LED on) for the user to confirm sensor calibration. Press
F1
button to start calibration. The motor will be calibrated and values stored in Flash. Calibration can be repeated any time by long pressingF1
button until first short blink of the blue LED. -
Actuator physical values (gearing, torque, current, etc) need to be specified
firmware/actuator_config.h
. It affectes signal values read from CANbus to internal control. CANbus values are represented in actuator domain (i.e. considering motor gearbox). Change gearbox and final gear ratios infirmware/actuator_config.h
file. Available parameters arerated_current
,rated_torque
,motor_gearbox_ratio
,final_drive_ratio
. -
Additionally, one can extract sensor calibration values (point 3) from the Flash using
readCalibration.py
:(wiki)
Actuator accepts commands via CANbus as defined by dbc
file in Retropilot/Opendbc/ocelot_controls.dbc
CAN Command - expect rate is 10ms
- 0x22E (0558) STEERING_COMMAND
- STEER_TORQUE (Nm)
- STEER_ANGLE (deg)
- STEER_MODE
- 0 - "Off" - instant 0 torque
- 1 - "TorqueControl" - uses STEER_TORQUE signal to control torque
- 2 - "AngleControl"- uses STEER_ANGLE signal to control absolute angle using PID close-loop and STEER_TORQUE as feedforward
- 3 - "SoftOff" - ramp torque to 0 in 1s - meant to be used for coommunication error safe mode
- COUNTER
- CHECKSUM
Actuator will report back its status every 10ms:
- 0x22F (0559) STEERING_STATUS
- STEERING_ANGLE (deg)
- STEERING_SPEED (rev/s)
- STEERING_TORQUE (Nm)
- CONTROL_STATUS
- COUNTER
- CHECKSUM
- TEMPERATURE (C)
- DEBUG_STATES
Reference implementation can be found in my bmw openpilot repo:
opendbc/
- make sure ocelot_controls.dbc is copied hereselfdrive/car/xxx/xxxcan.py
- sending CAN messageselfdrive/car/xxx/carstate.py
- parsing CAN messagepanda/board/safety/safety_xxx.h
- CAN tx filter558
, some safety, and safety testing
Use this StepperServoCANtester.py
GUI program to quickly test the StepperServoCAN motor.
pip install tkinter cantools python-can
git submodule init opendbc
git submodule update opendbc
-
Connect the StepperServoCAN motor to the computer via CAN interface supported by
python-can
. -
Run the program:
python StepperServoCANtester.py
-
Upon startup, the program will automatically attempt to connect to the default CAN interface, which is
pcan
. If you are using a different interface, you can select the desired CAN interface from the dropdown menu in the program. Once you have selected the interface, the program will establish a connection and start sending the 0x22E STEERING_COMMAND message with initial values of 0 for torque and angle. -
In addition to the CAN interface dropdown menu, the program also provides two input fields where you can enter the desired motor torque and angle values. Note that torque values can be entered as floats.
-
You can update the injected values to the motor by clicking the "Update Torque/Angle Value" button or by pressing the "Return" key on your keyboard or changing Steer mode.
-
After selecting either "TorqueControl" and providing a "Steer Torque" value, or selecting "AngleControl" and providing a "Steer Angle" value, the StepperServoCAN motor will start spinning accordingly.
-
To exit the program, you can click the "Exit" button, press the "ESC" key, or simply close the window.
- The torque value should be between -16 and 15.875, and the angle value should be between -4096 and 4096.
- To use the program with SocketCAN on Linux, you can set up a virtual CAN interface with the following commands:
sudo modprobe vcan sudo ip link add dev vcan0 type vcan sudo ip link set up vcan0 ip -details -brief link | grep can | grep UP
If SocketCAN interfaces are not found, the program will abort.
- Develop using MISRA C:2012 standard and analyzed using Cppcheck. Project is preconfigured with (
misra.json
) for C/C++ Advanced Lint and SonarLint to highlight violations in VScode. Ask priv about themisra_rules_set_cppcheck.txt
for cppcheck.
- In VScode press F5 to start debugging using Platformio
The debugging session is setup to use semihosting when debugging and some debug information is printed to the debug console. When debugging, the motor calibration can be initiated by liong pressing F1 as usual, but then to start calibration used can press any key in the console. This is not very reliable though and sometimes calibration will start on debug events.
STM32 has an ability to view and edit global variables using SWD debug interface
- connect to debug port and launch STMViewer. Load example configuration
firmware/swdio.STMViewer.cfg
- The firmware is based on Misfittech project which is based on nano_stepper project and it inherited GPL V3 license
- GPL v3 license scheme as required for the software derivatives
- Derivatives of this software under GPLv3 license will also need to remain open source if distributed commercially.
For initial software and hardware: