Skip to main content

Postupno povećavanje i smanjenje stope

Što ovaj primjer prikazuje​

Motor se ubrzava, a zatim usporava. Modul nema ugrađenu krivulju ubrzanja, pa primjer stvara jednu na jednostavan način: svaki put malo skraćuje vrijeme odgode između koraka, a zatim ga ponovno produžuje.

Ovdje se koriste samo DIR i STEP. ENABLE, RESET i SLEEP su izostavljeni iz begin(), stoga moraju biti hardverski spojeni na visoku razinu da bi ova skica radila: oba imaju interne povlačne otpornike prema masi i inače bi držali upravljač u resetu i uspavanom stanju.

Brojevi pinova u primjeru, GPIO4 za DIR i GPIO5 za STEP, oboje su izvedeni na pločici NULA DeepSleep ESP32-S3, pa ovaj kôd radi nepromijenjeno.

Kôd primjera​

from drv8825 import DRV8825 # Import the DRV8825 motor driver module
from time import sleep # Import sleep function for timing delays

# Define GPIO pins for motor control
DIR_PIN = 4 # GPIO pin used for direction control
STEP_PIN = 5 # GPIO pin used for step pulses

# Create a DRV8825 motor instance
motor = DRV8825()

# Initialize the motor with the specified DIR and STEP pins
motor.begin(DIR=DIR_PIN, STEP=STEP_PIN)

# Set the number of steps the motor takes per full rotation (usually 200 for a 1.8° stepper motor)
motor.setStepsPerRotation(200)

# Set the length of each step pulse in microseconds
motor.setStepPulseLength(1000)

# Set motor rotation direction to clockwise
motor.setDirection(DRV8825.CLOCK_WISE)

# Enable the motor driver (turns on output)
motor.enable()

print("Accelerating")

# Gradually increase the step frequency (i.e., speed up the motor)
accelerationFactor = 1
while accelerationFactor < 2000:
motor.step() # Send a single step pulse to the motor
sleep(
1 / accelerationFactor
) # Delay inversely proportional to the factor (higher = faster)
accelerationFactor += 1 # Increase acceleration factor
print(accelerationFactor) # Print current acceleration factor

# Gradually decrease the step frequency (i.e., slow down the motor)
while accelerationFactor > 1:
motor.step() # Send a single step pulse
sleep(1 / accelerationFactor) # Delay increases as acceleration factor decreases
accelerationFactor -= 1 # Decrease acceleration factor
print(accelerationFactor) # Print current acceleration factor

Očekivani rezultat:

ShellMicroPython
Accelerating
2
3
4
...
2000
1999
1998
...
2

Primjer ispisuje brojčanicu na svakom koraku, tako da je oblik točan: ona raste od 2 do 2000, a zatim se vraća natrag na 2.

Motor započinje gotovo u mirovanju i ubrzava. Prvi korak čeka punu sekundu, a zatim se tempo brzo ubrzava, tako da se veći dio vremena izvođenja provede u prvih nekoliko koraka. Očekujte da će cijelo ubrzanje trajati desetke sekundi, a ne tren.

Ovaj primjer poziva enable() ali nikada ne prosljeđuje pin za omogućavanje begin()-u, pa taj poziv vraća False i ne radi ništa. To ovdje nije važno: ulaz ENABLE upravljača je aktivan nisko s internim povlačenjem prema dolje, pa nevezani pin je u niskom stanju i izlazi su ionako omogućeni.

Koristene funkcije​

DRV8825()returns DRV8825

Stvara objekt upravljača. Sam po sebi ništa ne konfigurira; svaki pin se postavlja pomoću begin().

ReturnsNova instanca upravljača bez dodijeljenih pinova.

Parametri

Ovaj konstruktor ne prima parametre.

begin(DIR, STEP, EN=None, RST=None, SLP=None)returns bool

Dodjeljuje kontrolne pinove i konfigurira ih kao izlaze. Ovdje se poziva samo s DIR i STEP, što ostavlja EN, RST i SLP neuređene. RESET i SLEEP tada moraju biti u hardveru držani na visokoj razini.

ReturnsIstina kad su pinovi konfigurirani.

Parametri

TipNazivOpis
intDIRBroj GPIO-a za pin smjera.
intSTEPbroj GPIO-a za pin koraka.
intENbroj GPIO-a za pin omogućavanja. Neobavezno, zadano je None.
intRSTbroj GPIO-a za pin resetiranja. Neobavezno, zadano je None.
intSLPBroj GPIO pinova za pin za spavanje. Neobavezno, zadano je None.
setStepsPerRotation(steps)returns None

Modulu govori koliko koraka čini jedno puno okretanje, kako bi mogao pratiti položaj unutar okretanja. Motor od 1,8 stupnjeva pri punom koraku ima 200 koraka. To ne mijenja način na koji se motor pogoni.

ReturnsNišta.

Parametri

TipNazivOpis
intstepsKoraci po punom okretu.
setStepPulseLength(length)returns None

Postavlja koliko dugo se STEP pin drži visok, a zatim nizak, unutar svakog poziva step(), u mikrosekundama. Ovo je donja granica brzine kojom se motor može koraknuti: pri 1000 mikrosekundi svaki step() zauzima najmanje 2 ms, prije bilo kakvog odgađanja koje dodate.

ReturnsNišta.

Parametri

TipNazivOpis
intlengthDuljina impulsa u mikrosekundama.
setDirection(direction)returns bool

Postavlja smjer pina. Koristite klase konstante DRV8825.CLOCK_WISE i DRV8825.COUNTER_CLOCK_WISE umjesto sirovih brojeva. Svaka druga vrijednost se odbacuje i pin ostaje nepromijenjen. Nazivi konstanti opisuju DIR razinu, a ne zajamčenu smjer osovine, koji ovisi o žičanju vaše zavojnice.

ReturnsIstinito ako je smjer valjan, inače netočno.

Parametri

TipNazivOpis
intsmjerDRV8825.PO SATU (1) ili DRV8825.PROTIV SATU (0).
enable()returns bool

Omogućuje izlaze upravljača povlačenjem ENABLE pina na nisku razinu. Vraća False ako begin() nije primio pin za omogućavanje.

ReturnsIstina ako je pin omogućen, lažno ako nije konfiguriran pin za omogućavanje.

Parametri

Ova funkcija nema parametara.

step()returns None

Pomakne motor za jedan korak: impulsi STEP visoki, zatim niski, čekajući konfiguriranu duljinu impulsa na svakoj razini. Pozivanje u petlji s sve manjom odgodom stvara rampu.

ReturnsNišta.

Parametri

Ova funkcija nema parametara.

getSteps()returns int

Broj koraka poduzetih otkako je brojač zadnji put resetiran. Korisno za provjeru koliko je rampu zapravo prešlo.

ReturnsUkupno prebrojanih koraka.

Parametri

Ova funkcija nema parametara.

resetSteps(s=0)returns int

Resetira brojač koraka i vraća ga u prethodno stanje, pa možete izmjeriti jedan korak bez gubitka prethodnog ukupnog broja.

ReturnsBroj koraka kao što je bio prije resetiranja.

Parametri

TipNazivOpis
intsNova vrijednost za brojač. Neobavezno, zadano je 0.

Sklapanje​

sleep(1 / accelerationFactor) je cijela krivulja ubrzanja. Na početku je faktor 1, pa motor čeka punu sekundu između koraka. Na kraju je 2000 i čekanje je pola milisekunde.

U tom trenutku odgoda više nije ono što određuje brzinu. setStepPulseLength(1000) drži STEP visok 1 ms i nizak 1 ms unutar svakog poziva step(), pa bez obzira na to koliko se vrijeme čekanja smanji, korak ne može trajati kraće od otprilike 2 ms. Posljednjih nekoliko stotina iteracija postupnog ubrzavanja jedva se razlikuju jedna od druge. Ako želite da krajnja brzina doista bude velika, skratite duljinu impulsa kao i vrijeme čekanja.

Naglo ubrzavanje je važno kod stepenastih motora. Ako od opterećenog motora zatražite da odjednom prijeđe na punu brzinu, on će preskakati korake, a preskočeni koraci znače da se ne nalazite na poziciji za koju mislite da jeste. Polako kretanje i postepeno ubrzavanje to sprječava.

Ako želite znati koliko je motor priješao, pozovite resetSteps() prije akceleracije i getSteps() nakon nje.