lunedì 17 giugno 2013

PIC12F683 and ULN2003A unipolar motor controller


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 = 0001
    DEFINE 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 = 001000
    IOC = 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:

  DISABLE
  int_checker:
  if (PB=0)THEN
        MODE=MODE+1
        if (mode>3)THEN
            MODE=0
        endif
    endif

    INTCON.0 = 0
    RESUME
    ENABLE
    END
 
Infine le procedure STOP_M, e GO_FORWARD e GO_BACKWARD.
 
STOP_M:
     low in1
     low 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 IN1
    LOW 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:

READ_POT_AND_PAUSE:
  ADCIN 0, T_DELAY ' Read channel 0             
  T_DELAY=T_DELAY/2
  IF (T_DELAY<1 br="" then="">    T_DELAY=1
  ENDIF
  pause(T_DELAY)
RETURN

Legge 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.