CONTROL DE MOTOR PASO A PASO USANDO MATLAB
Resumen.- El presente artículo contiene una breve introducción sobre los motores paso a paso así como el código de un programa desarrollado en Matlab 7.1 para controlar su velocidad y dirección de giro. El programa es una función y una GUI, donde se puede controlar los pasos del motor, velocidad y dirección de giro.
INTRODUCCIÓN
Los motores paso a paso son ideales para la construcción de mecanismos en donde se requieren movimientos muy precisos. La característica de estos motores es poder moverlos un paso a la vez por cada pulso que se le aplique.
DESARROLLO DEL PROGRAMA
Matlab posee comandos sencillos para el control del puerto paralelo. Basta con crear la entrada digital del puerto y asignar que pines son de entrada y cuales de salida.
ent= digitalio('parallel','LPT1'); dato= addline(ent,0:4,'out'); putvalue(dato,2); |
El código anterior crea la entrada digital del puerto paralelo, asigna los pines 2 a 5 como salidas y escribe el valor decimal 2 (Matlab realiza automáticamente la conversión a binario) en el puerto.
Las condiciones iniciales del programa colocan a cero los pines de puerto paralelo:
diego= digitalio('parallel','LPT1'); dato= addline(diego,0:3,'out'); putvalue(dato,0); |
Como se puede ver en la figura 1, lo único que se debe programar en la interfaz gráfica es la captura del retardo, la dirección de giro y el encendido-apagado del motor.
Fig. 1. Entorno del programa motor. |
La mayor parte del código se programa en el toggle button ON-OFF, cuyo campo Tag es state. Sin embargo, es necesario un código adicional para el texto del botón-interruptor de la dirección:
f=get(handles.direction,'Value'); if f==1 set(handles.direction,'String','DIRECTION ''L'''); else set(handles.direction,'String','DIRECTION ''R'''); end |
La secuencia que se envía al motor es:
La programación del botón de encendido es:
d=get(hObject,'Value'); if d==1 set(handles.state,'String','ON'); diego=digitalio('parallel','LPT1'); dato=addline(diego,0:3,'out'); g=1; while g e=get(handles.direction,'Value'); if e==0 mov=[3 6 12 9]; else mov=[9 12 6 3]; end delay=str2double(get(handles.speed,'String'))*1e-3; if delay<0 ||isnan(delay) errordlg('Time out of range','ERROR'); delay=500; set(handles.speed,'String',500); set(handles.state,'String','OFF'); set(handles.state,'Value',0); break; end if get(hObject,'Value')==0 break end putvalue(dato,mov(1)); pause(delay); if get(hObject,'Value')==0 break end putvalue(dato,mov(2)); pause(delay); if get(hObject,'Value')==0 break end putvalue(dato,mov(3)); pause(delay); if get(hObject,'Value')==0 break end putvalue(dato,mov(4)); pause(delay); end
else set(handles.state,'String','OFF'); end |
Para la conexión del motor se puede usar el siguiente esquema:
![]() |
Fig. 2. Esquema para conexión del motor. |
La siguiente figura muestra el modelo ensayado y funcionando:
Fig.3. Circuito final. |
Asimismo, la siguiente función controla el número de pasos del motor, velocidad y dirección de giro:
function motor(step,delay,direction) %Controlling a stepper motor %step must be integer. %delay is in seconds. %direction: 1 or 2. %Author: Diego Orlando Barragán Guerrero %diegokillemall@yahoo.com warning off if nargin==1 delay=1;direction=1; elseif nargin==2 direction=1; end if isnan(step)||step<0 error('Step value must be positive integer'); elseif direction~=1 && direction~=2 error('Direction options: 1 or 2') elseif isnan(delay)||delay<0 error('Delay value must be positive integer') end step=ceil(step); inout=digitalio('parallel','LPT1'); dato=addline(inout,0:3,'out'); if direction ==1 sent=[3 6 12 9]; else sent=[9 12 6 3]; end m=1; for n=1:step putvalue(dato,sent(m)); pause(delay); m=m+1; if m>4 m=1; end end |

