Ecco un altro circuito di controllo per motore unipolare dotato di moto riduttore a 4.096 passi/giro.
Il motore è pilotato da un controller ULN2003A (500mA per canale) è stato acquistato su ebay per 9 euro al link: http://www.ebay.it/itm/Motore-passo-passo-con-driver-ULN2003A-stepper-shield-arduino-pic-/261172401404
Il motore è un motore passo-passo unipolare dotato di motoriduttore con le seguenti caratteristiche:
Tensione: 5V
Passi motore: 64 passi/giro
Rapporto riduttore 1:64
Passi sull'albero di uscita: 4096 passi/giro
Massima frequenza di partenza: 500 Hz
Massima frequenza: 900 Hz
Il circuito di controllo è invece stato realizzato con un 12F683; viene utilizzato un convertitore ADC per leggere il valore in tensione al pin centrale del potenziometro collegato appunto al pin GPIO.0.
Il valore letto a 10bit (valore da 0 a 1024) viene utilizzato come ritardo per la funzione DELAY(pause) tra l'accensione di un canale (D1, D2, D3 o D4) e l'altro dell'interfaccia ULN2003A.
Il potenziometro è collegato con gli altri due pin tra la massa e la tensione a 5V di alimentazione.
La programmazione del pic12F683 è stata fatta in PICBASIC PRO, configurato per funzionare a 8 Mhz (oscillatore interno) e il convertitore ADC a 10 bit (e comparatore CMCON0 spento).
DEFINE OSC 8
ANSEL = 0001DEFINE ADC_BITS 10 'Set number of bits in result
DEFINE ADC_CLOCK 3 'Set clock source
DEFINE ADC_SAMPLEUS 50 'Set sampling time in us
CMCON0 = 000000
ADCON0.7 = 1 '(right justifies)
I pin GPIO.1, GPIO.2, GPIO.4 e GPIO.5 sono collegati con i pin di controllo del motore (D1, D2, D3 e D4).
Il pin GPIO.3 è invece collegato ai 5V tramite resistenza da 10Kohm e a massa tramite un pulsante.
Il programma principale esegue ripetutamente la sezione 'main' testando il valore della variabile MODE, che all'accensione è impostata al valore 0:
main:
BRANCH MODE,[STOP_M, GO_FORWARD, STOP_M, GO_BACKWARD]GOTO main
Le procedure STOP_M, GO_FORWARD e GO_BACKWARD si occupano rispettivamente di fermare, fare avanzare in senso orario e muovere in senso antiorario il motore.
La variabile MODE cambia alla pressione del pulsante dai valori 0, 1, 0, 2, 0 e poi di nuovo ripete la sequenza. Alla pressione del pulsante viene generato un interrupt sul pin GPIO.3 che rimanda alla sezione di codice int_checker definito in fondo.
ON INTERRUPT GOTO int_checker
TRISIO = 001000IOC = 001000
per attivare gli interrupt sul cambio stato del pin (GPIO.3).
Nel codice, nella parte finale, ho inserito la clausola per il controllo del pulsante:
int_checker:
if (PB=0)THEN
MODE=MODE+1if (mode>3)THEN
MODE=0
endif
endif
RESUME
ENABLE
END
Infine le procedure STOP_M, e GO_FORWARD e GO_BACKWARD.
STOP_M:
low in1low in2
low in3
low in4
GOTO MAIN
GO_FORWARD:
HIGH IN1
LOW IN2
LOW IN3
LOW IN4
gosub READ_POT_AND_PAUSE
LOW IN1
HIGH IN2
LOW IN3
LOW IN4
gosub READ_POT_AND_PAUSE
LOW IN1
LOW IN2
HIGH IN3
LOW IN4
gosub READ_POT_AND_PAUSE
LOW IN1
LOW IN2
LOW IN3
HIGH IN4
gosub READ_POT_AND_PAUSE
GOTO MAIN
GO_BACKWARD:
LOW IN1LOW IN2
LOW IN3
HIGH IN4
gosub READ_POT_AND_PAUSE
LOW IN1
LOW IN2
HIGH IN3
LOW IN4
gosub READ_POT_AND_PAUSE
LOW IN1
HIGH IN2
LOW IN3
LOW IN4
gosub READ_POT_AND_PAUSE
HIGH IN1
LOW IN2
LOW IN3
LOW IN4
gosub READ_POT_AND_PAUSE
GOTO MAIN
La soubroutine READ_POT_AND_PAUSE è definita come segue:
ADCIN 0, T_DELAY ' Read channel 0
T_DELAY=T_DELAY/2
IF (T_DELAY<1 br="" then=""> T_DELAY=1
ENDIF1>
pause(T_DELAY)
RETURNLegge il valore di tensione al pin centrale del potenziometro e valorizzata la variabile T_DELAY.
Dopo di che ne viene dimezzato il valore e effettuato un controllo per impostare il valore minimo a 1.
L'argomento passato alla funzione PAUSE potrà assumere valori da 1ms a 512ms.
Di seguito lo schema del circuito.