Skip to content

Commit

Permalink
Merge pull request adafruit#23 from plamponi/pwm_freq
Browse files Browse the repository at this point in the history
PWMOut variable frequency not required, uses only one counter
  • Loading branch information
siddacious committed Dec 30, 2018
2 parents 7f93c2a + f7fb4d8 commit a889448
Show file tree
Hide file tree
Showing 3 changed files with 56 additions and 29 deletions.
7 changes: 5 additions & 2 deletions adafruit_motor/stepper.py
Expand Up @@ -69,14 +69,17 @@ class StepperMotor:
:param ~pulseio.PWMOut bin2: `pulseio.PWMOut`-compatible output connected to the driver for
the fourth coil (unipolar) or second input to second coil (bipolar).
:param int microsteps: Number of microsteps between full steps. Must be at least 2 and even.
.. note:: The ``StepperMotor`` class requires PWM frequencies > 1500. Specify
``frequency=1500`` or higher when instantiating the above ``PWMOut`` objects.
"""
def __init__(self, ain1, ain2, bin1, bin2, *, microsteps=16):
self._coil = (ain2, bin1, ain1, bin2)

# set a safe pwm freq for each output
# reject unsafe (low) pwm freq
for i in range(4):
if self._coil[i].frequency < 1500:
self._coil[i].frequency = 2000
raise ValueError("PWMOut: 'frequency' must be at least 1500")

self._current_microstep = 0
if microsteps < 2:
Expand Down
39 changes: 12 additions & 27 deletions examples/stepper_motor.py
@@ -1,39 +1,24 @@
# This example uses an Adafruit Stepper and DC Motor FeatherWing to run a Stepper Motor.
# https://www.adafruit.com/product/2927
# Run a Stepper Motor. Tested on ItsyBitsy M4 Express + DRV8833.
# https://www.adafruit.com/product/3800
# https://www.adafruit.com/product/3297

import time

from board import SCL, SDA
import busio

# Import the PCA9685 module. Available in the bundle and here:
# https://github.com/adafruit/Adafruit_CircuitPython_PCA9685
from adafruit_pca9685 import PCA9685

import board
import pulseio
from adafruit_motor import stepper

i2c = busio.I2C(SCL, SDA)

# Create a simple PCA9685 class instance for the Motor FeatherWing's default address.
pca = PCA9685(i2c, address=0x60)
pca.frequency = 1600
AIn1 = pulseio.PWMOut(board.D9, frequency=1600)
AIn2 = pulseio.PWMOut(board.D10, frequency=1600)
BIn1 = pulseio.PWMOut(board.D11, frequency=1600)
BIn2 = pulseio.PWMOut(board.D12, frequency=1600)

# Motor 1 is channels 9 and 10 with 8 held high.
# Motor 2 is channels 11 and 12 with 13 held high.
# Motor 3 is channels 3 and 4 with 2 held high.
# Motor 4 is channels 5 and 6 with 7 held high.
stepper_motor = stepper.StepperMotor(AIn1, AIn2, BIn1, BIn2)

pca.channels[7].duty_cycle = 0xffff
pca.channels[2].duty_cycle = 0xffff
stepper_motor = stepper.StepperMotor(pca.channels[4], pca.channels[3], # Motor 3
pca.channels[5], pca.channels[6]) # Motor 4

for i in range(100):
for i in range(1000):
stepper_motor.onestep()
time.sleep(0.01)

for i in range(100):
for i in range(1000):
stepper_motor.onestep(direction=stepper.BACKWARD)
time.sleep(0.01)

pca.deinit()
39 changes: 39 additions & 0 deletions examples/stepper_motor_pca9685.py
@@ -0,0 +1,39 @@
# This example uses an Adafruit Stepper and DC Motor FeatherWing to run a Stepper Motor.
# https://www.adafruit.com/product/2927

import time

from board import SCL, SDA
import busio

# Import the PCA9685 module. Available in the bundle and here:
# https://github.com/adafruit/Adafruit_CircuitPython_PCA9685
from adafruit_pca9685 import PCA9685

from adafruit_motor import stepper

i2c = busio.I2C(SCL, SDA)

# Create a simple PCA9685 class instance for the Motor FeatherWing's default address.
pca = PCA9685(i2c, address=0x60)
pca.frequency = 1600

# Motor 1 is channels 9 and 10 with 8 held high.
# Motor 2 is channels 11 and 12 with 13 held high.
# Motor 3 is channels 3 and 4 with 2 held high.
# Motor 4 is channels 5 and 6 with 7 held high.

pca.channels[7].duty_cycle = 0xffff
pca.channels[2].duty_cycle = 0xffff
stepper_motor = stepper.StepperMotor(pca.channels[4], pca.channels[3], # Motor 3
pca.channels[5], pca.channels[6]) # Motor 4

for i in range(100):
stepper_motor.onestep()
time.sleep(0.01)

for i in range(100):
stepper_motor.onestep(direction=stepper.BACKWARD)
time.sleep(0.01)

pca.deinit()

0 comments on commit a889448

Please sign in to comment.