228 lines
5.7 KiB
Python
228 lines
5.7 KiB
Python
from machine import Pin, PWM, SPI
|
|
import time
|
|
import utime
|
|
from config import *
|
|
from led import *
|
|
from sTimer import sTimer_Start, sTimer_Stop
|
|
import sys
|
|
|
|
EN = Pin(13, Pin.OUT)
|
|
DIR = Pin(14, Pin.OUT)
|
|
STEP = Pin(15, Pin.OUT)
|
|
ENDSTOP = Pin(8, Pin.IN, Pin.PULL_UP)
|
|
DC_EN = Pin(11, Pin.OUT)
|
|
DC_IN = Pin(10, Pin.OUT)
|
|
DC_OUT = Pin(12, Pin.IN)
|
|
SPI_MODE = Pin(20, Pin.OUT)
|
|
spi_cs = Pin(17, Pin.OUT)
|
|
|
|
spi = SPI(0, baudrate=100000, polarity=1, phase=1, bits=8, firstbit=SPI.MSB, sck=Pin(18, Pin.OUT), mosi=Pin(19, Pin.OUT), miso=Pin(16, Pin.IN))
|
|
|
|
DC_EN(0)
|
|
DC_IN(0)
|
|
spi_cs(1)
|
|
EN(1) #0 = enabled
|
|
DIR(0)
|
|
STEP(0)
|
|
|
|
MM_PER_STEP = SCREW_PITCH / (MOTOR_STEPS * MICROSTEPPING)
|
|
FREQ_PER_STEP_INCREASE = (((MOTOR_STEPS * MICROSTEPPING) / SCREW_PITCH) * ACCELERATION) / 60
|
|
|
|
REG_GCONF = 0x00
|
|
REG_GSTAT = 0x01
|
|
REG_IHOLD_IRUN = 0x10
|
|
REG_CHOPCONF = 0x6C
|
|
REG_COOLCONF = 0x6D
|
|
REG_DCCTRL = 0x6E
|
|
REG_DRVSTATUS = 0x6F
|
|
|
|
step_cntr = 0
|
|
target_steps = 0
|
|
target_frequency = 0
|
|
current_frequency = 0
|
|
def step():
|
|
global STEP, step_cntr, current_frequency, target_frequency, target_steps, FREQ_PER_STEP_INCREASE
|
|
STEP.value(not STEP.value())
|
|
STEP.value(not STEP.value())
|
|
LED_ERR.value(not LED_ERR.value())
|
|
|
|
step_cntr += 1
|
|
if(current_frequency < target_frequency):
|
|
current_frequency += FREQ_PER_STEP_INCREASE
|
|
if(target_steps >= step_cntr):
|
|
pass
|
|
|
|
def rotate_motor(steps, feedrate):
|
|
global current_frequency, step_cntr, target_steps, target_frequency
|
|
step_cntr = 0
|
|
target_steps = steps
|
|
target_frequency = ((feedrate / SCREW_PITCH) * MOTOR_STEPS * MICROSTEPPING) / 60 #steps/s = rpm * steps_per_rotation / 60
|
|
print(target_frequency)
|
|
print(FREQ_PER_STEP_INCREASE)
|
|
current_frequency = FREQ_PER_STEP_INCREASE
|
|
|
|
def timer_callback(counter):
|
|
if (counter % 1) == 0:
|
|
step()
|
|
|
|
def get_stats():
|
|
global STEP, step_cntr, current_frequency, target_frequency, target_steps, FREQ_PER_STEP_INCREASE
|
|
print(step_cntr, current_frequency, target_frequency, FREQ_PER_STEP_INCREASE)
|
|
|
|
def rotate_motor_test():
|
|
rotate_motor(32*200, 5)
|
|
sTimer_Start()
|
|
time.sleep(2)
|
|
sTimer_Stop()
|
|
|
|
def prepare_spi_msg(addr, d0, d1, d2, d3, rw):
|
|
msg = bytearray()
|
|
if rw == 'r':
|
|
msg.append(addr)
|
|
else:
|
|
msg.append(0x80 + addr)
|
|
msg.append(d0)
|
|
msg.append(d1)
|
|
msg.append(d2)
|
|
msg.append(d3)
|
|
|
|
return msg
|
|
|
|
def send_spi_msg(msg):
|
|
spi_cs(0)
|
|
rxdata = bytearray(5)
|
|
spi.write_readinto(msg, rxdata)
|
|
#print(rxdata.hex())
|
|
spi_cs(1)
|
|
time.sleep(0.01)
|
|
|
|
def TMC2130_Rotate(dir, steps, speed): #speed in rpm
|
|
#1rmp = 200steps/min=3.333steps/s~150ms@50%duty
|
|
wait = (((1 / ((MOTOR_STEPS * MICROSTEPPING) / 60)) / 2) / speed) * 1000 * 1000
|
|
freq = 1 / ((wait / 1000000) * 2)
|
|
|
|
if AXIS_REVERSE:
|
|
if dir == 0:
|
|
dir = 1
|
|
else:
|
|
dir = 0
|
|
|
|
DIR(dir)
|
|
LED_DIR(dir)
|
|
|
|
STEP = PWM(Pin(15), freq=int(freq), duty_u16=32768)
|
|
time.sleep((1 / freq) * steps)
|
|
STEP.deinit()
|
|
|
|
homing = False
|
|
def TMC2130_Home():
|
|
global homing
|
|
|
|
dir = HOME_DIR
|
|
STEP = Pin(15, Pin.OUT)
|
|
|
|
steps_mm = (MOTOR_STEPS * MICROSTEPPING) / SCREW_PITCH
|
|
rpm = HOME_SPEED / SCREW_PITCH
|
|
wait = (((1 / ((MOTOR_STEPS * MICROSTEPPING) / 60)) / 2) / rpm) * 1000 * 1000
|
|
freq = 1 / ((wait / 1000000) * 2)
|
|
|
|
if AXIS_REVERSE:
|
|
if dir == 0:
|
|
dir = 1
|
|
else:
|
|
dir = 0
|
|
|
|
DIR(dir)
|
|
LED_DIR(dir)
|
|
|
|
sys.stdout.write('homing\r\n')
|
|
homing = True
|
|
STEP = PWM(Pin(15), freq=int(freq), duty_u16=32768)
|
|
while homing:
|
|
pass
|
|
STEP.deinit()
|
|
|
|
if HOME_DEBOUNCE == True:
|
|
sys.stdout.write('debouncing\r\n')
|
|
if dir == 0:
|
|
dir = 1
|
|
else:
|
|
dir = 0
|
|
|
|
DIR(dir)
|
|
LED_DIR(dir)
|
|
|
|
steps = steps_mm * abs(HOME_DEBOUNCE_DISTANCE)
|
|
|
|
TMC2130_Rotate(dir, steps, HOME_DEBOUNCE_SPEED)
|
|
|
|
rpm = HOME_DEBOUNCE_SPEED / SCREW_PITCH
|
|
wait = (((1 / ((MOTOR_STEPS * MICROSTEPPING) / 60)) / 2) / rpm) * 1000 * 1000
|
|
freq = 1 / ((wait / 1000000) * 2)
|
|
|
|
if dir == 0:
|
|
dir = 1
|
|
else:
|
|
dir = 0
|
|
|
|
DIR(dir)
|
|
LED_DIR(dir)
|
|
|
|
homing = True
|
|
STEP = PWM(Pin(15), freq=int(freq), duty_u16=32768)
|
|
while homing:
|
|
pass
|
|
STEP.deinit()
|
|
|
|
def TMC2130_Disable():
|
|
EN.value(1)
|
|
|
|
def TMC2130_Enable():
|
|
EN.value(0)
|
|
|
|
def endstop_callback(endstop):
|
|
global homing
|
|
|
|
homing = False
|
|
|
|
def TMC2130_Init():
|
|
SPI_MODE(1)
|
|
# setup coolstep
|
|
microstep = 0
|
|
if MICROSTEPPING == 128:
|
|
microstep = 1
|
|
elif MICROSTEPPING == 64:
|
|
microstep = 2
|
|
elif MICROSTEPPING == 32:
|
|
microstep = 3
|
|
elif MICROSTEPPING == 16:
|
|
microstep = 4
|
|
elif MICROSTEPPING == 8:
|
|
microstep = 5
|
|
elif MICROSTEPPING == 4:
|
|
microstep = 6
|
|
elif MICROSTEPPING == 2:
|
|
microstep = 7
|
|
elif MICROSTEPPING == 1:
|
|
microstep = 8
|
|
else:
|
|
microstep = 0
|
|
|
|
msg = prepare_spi_msg(REG_CHOPCONF, 0x00+microstep, 0x01, 0x00, 0xC3, 'w')
|
|
send_spi_msg(msg)
|
|
msg = prepare_spi_msg(REG_IHOLD_IRUN, 0x00, 0x06, I_RUN, I_HOLD, 'w')
|
|
send_spi_msg(msg)
|
|
msg = prepare_spi_msg(0x11, 0x00, 0x00, 0x00, 0x0A, 'w')
|
|
send_spi_msg(msg)
|
|
msg = prepare_spi_msg(REG_GCONF, 0x00, 0x00, 0x00, 0x04, 'w')
|
|
send_spi_msg(msg)
|
|
msg = prepare_spi_msg(0x13, 0x00, 0x00, 0x01, 0xF4, 'w')
|
|
send_spi_msg(msg)
|
|
msg = prepare_spi_msg(0x70, 0x00, 0x04, 0x01, 0xC8, 'w')
|
|
send_spi_msg(msg)
|
|
msg = prepare_spi_msg(REG_COOLCONF, 0x00, 0x00, 0x03, 0x01, 'w')
|
|
send_spi_msg(msg)
|
|
|
|
TMC2130_Enable()
|
|
|
|
ENDSTOP.irq(trigger=Pin.IRQ_FALLING, handler=endstop_callback) |