Adafruit_CircuitPython_STSPIN/examples/stspin_microsteps.py
2025-06-13 16:23:33 -04:00

113 lines
No EOL
4 KiB
Python

# SPDX-FileCopyrightText: Copyright (c) 2025 Liz Clark for Adafruit Industries
#
# SPDX-License-Identifier: MIT
"""
Microstepping mode test for the Adafruit STSPIN220 stepper motor driver.
"""
import time
import board
import adafruit_stspin220
# Define the number of steps per revolution for your stepper motor
# Most steppers are 200 steps per revolution (1.8 degrees per step)
STEPS_PER_REVOLUTION = 200
STEP_PIN = board.D5 # Step clock pin
DIR_PIN = board.D6 # Direction pin
MODE1_PIN = board.D9 # Mode 1 pin (REQUIRED for mode switching)
MODE2_PIN = board.D10 # Mode 2 pin (REQUIRED for mode switching)
EN_FAULT_PIN = board.D11 # Enable/Fault pin (optional)
STBY_RESET_PIN = board.D12 # Standby/Reset pin (REQUIRED for mode switching)
print("Initializing STSPIN220...")
motor = adafruit_stspin220.STSPIN220(
STEP_PIN,
DIR_PIN,
STEPS_PER_REVOLUTION,
mode1_pin=MODE1_PIN,
mode2_pin=MODE2_PIN,
en_fault_pin=EN_FAULT_PIN,
stby_reset_pin=STBY_RESET_PIN
)
print("Adafruit STSPIN220 Microstepping Mode Test")
print("=" * 50)
# Define all available modes with their names for display
MODES = [
(adafruit_stspin220.Modes.STEP_FULL, "Full Step"),
(adafruit_stspin220.Modes.STEP_1_2, "1/2 Step"),
(adafruit_stspin220.Modes.STEP_1_4, "1/4 Step"),
(adafruit_stspin220.Modes.STEP_1_8, "1/8 Step"),
(adafruit_stspin220.Modes.STEP_1_16, "1/16 Step"),
(adafruit_stspin220.Modes.STEP_1_32, "1/32 Step"),
(adafruit_stspin220.Modes.STEP_1_64, "1/64 Step"),
(adafruit_stspin220.Modes.STEP_1_128, "1/128 Step"),
(adafruit_stspin220.Modes.STEP_1_256, "1/256 Step"),
]
BASE_RPM = 30 # Base speed for full step mode
print(f"Base speed: {BASE_RPM} RPM (for full step mode)")
print("Speed will be adjusted for each mode to maintain similar rotation time")
print("=" * 50)
time.sleep(2.0)
while True:
for mode, mode_name in MODES:
print(f"\nTesting {mode_name} mode...")
try:
# Set the microstepping mode
motor.step_mode = mode
# Get the number of microsteps for this mode
microsteps = motor.microsteps_per_step
# Adjust speed to maintain similar rotation time across all modes
# More microsteps = need higher RPM to maintain same angular velocity
adjusted_rpm = BASE_RPM * (microsteps / 1.0) # Normalized to full step
motor.speed = adjusted_rpm
# Calculate total steps needed for one full revolution
total_steps = STEPS_PER_REVOLUTION * microsteps
print(f" Microsteps per full step: {microsteps}")
print(f" Adjusted speed: {adjusted_rpm:.1f} RPM")
print(f" Steps for full revolution: {total_steps}")
# Check for any faults before moving
if motor.fault:
print(" WARNING: Fault detected! Clearing...")
motor.clear_fault()
time.sleep(0.1)
# Perform one full revolution forward
print(f" Rotating forward 360°...")
start_time = time.monotonic()
motor.step(total_steps)
rotation_time = time.monotonic() - start_time
print(f" Rotation completed in {rotation_time:.2f} seconds")
# Brief pause to see the position
time.sleep(0.5)
# Return to starting position
print(f" Returning to start position...")
motor.step(-total_steps)
print(f" {mode_name} test complete!")
except ValueError as e:
print(f" ERROR: Could not set {mode_name} mode - {e}")
print(" Make sure MODE1, MODE2, and STBY/RESET pins are connected!")
# Pause between modes
time.sleep(1.0)
print("\n" + "=" * 50)
print("All modes tested! Starting next cycle in 3 seconds...")
print("=" * 50)
time.sleep(3.0)