.::MATLAB - CONTROL DE MOTORES SERVOS USANDO MATLAB Y UN PIC16F628A::.

MATPIC.COM

MATLAB - CONTROL DE MOTORES SERVOS USANDO MATLAB Y UN PIC16F628A

CONTROL DE MOTORES SERVOS USANDO MATLAB Y UN PIC16F628A

 

 

INTRODUCCIÓN

 

Teoría sobre motor servo

Los servos son un tipo especial de motor de c.c. que se caracterizan por su capacidad para posicionarse de forma inmediata en cualquier posición dentro de su intervalo de operación. Para ello, el servomotor espera un tren de pulsos que se corresponde con el movimiento a realizar. Están generalmente formados por un amplificador, un motor, un sistema reductor formado por ruedas dentadas y un circuito de realimentación, todo en una misma caja de pequeñas dimensiones. El resultado es un servo de posición con un margen de operación de 180° aproximadamente.

servo

 

Funcionamiento del servo. Control PWM

La modulación por anchura de pulso, PWM (Pulse Width Modulation), es una de los sistemas más empleados para el control de servos. Este sistema consiste en generar una onda cuadrada en la que se varía el tiempo que el pulso está a nivel alto, manteniendo el mismo período (normalmente), con el objetivo de modificar la posición del servo según se desee.

El sistema de control de un servo se limita a indicar en que posición se debe situar. Esto se lleva a cabo mediante una serie de pulsos tal que la duración del pulso indica el ángulo de giro del motor. Cada servo tiene sus márgenes de operación, que se corresponden con el ancho del pulso máximo y mínimo que el servo entiende. Los valores más generales se corresponden con pulsos de entre 1 ms y 2 ms de anchura, que dejarían al motor en ambos extremos (0º y 180º). El valor 1.5 ms indicaría la posición central o neutra (90º), mientras que otros valores del pulso lo dejan en posiciones intermedias. Estos valores suelen ser los recomendados, sin embargo, es posible emplear pulsos menores de 1 ms o mayores de 2 ms, pudiéndose conseguir ángulos mayores de 180°. Si se sobrepasan los límites de movimiento del servo, éste comenzará a emitir un zumbido, indicando que se debe cambiar la longitud del pulso. El factor limitante es el tope del potenciómetro y los límites mecánicos constructivos.

servo2

 

PROGRAMAS

 

Microcontrolador

El programa del micro 16F628A se muestra a continuación:

include "modedefs.bas"motor var byte
'Declaración de variables
pos var byte
cont var byte

'Seteo de puertos
trisb =%00000001
portb =%00000000

'Programa principal
inicio:
serin portb.0,T2400,motor,pos
for cont= 1 to 20 step 1
pulsout motor,pos
pause 25 '10
next
goto inicio

Como es bien sabido, cuando deseamos establecer una comunicación serial es necesario incluir la librería "modedefs.bas" . Para el control de los motores servos usando la función pulsout, es indispensable establecer el valor de los pines de salida como 0, ya que esta función lo que hace es invertir el valor que se encuentra el pin.

La función serin detiene el programa hasta recibir los datos vía comunicación serial. En nuestro programa espera hasta que llegue desde MATLAB el número del motor y la posición. Con estos datos la función pulsout genera el ancho de pulso necesario en el pin del motor que elegimos, enviando estos pulsos a la frecuencia establecida por el ciclo for y el retardo (función pause) .

Matlab

Desde Matlab es necesario establecer en el puerto serial los mismos valores que se establecieron el el micro.

%Programa de ensayo de movimiento de

%los motores servos HS-311

%ABRIR el puerto COM1

clc; disp('BEGIN')

SerPIC = serial('COM1');

set(SerPIC,'BaudRate',2400);

set(SerPIC,'DataBits',8);

set(SerPIC,'Parity','none');

set(SerPIC,'StopBits',1);

set(SerPIC,'FlowControl','none');

fopen(SerPIC);

%*-*-*-*-*-*-

Una vez seteados los valores con los que va a trabajar el puerto serial, es momento de enviar los datos al microcontrolador.

%*-*-*-Posición inicial

fprintf(SerPIC,'%c',[char(1) char(180)]);pause(0.8)

fprintf(SerPIC,'%c',[char(2) char(135)]);pause(0.8)

fprintf(SerPIC,'%c',[char(3) char(150)]);pause(0.8)

%*-*-*-FIN Posición inicial

 

for s=1:1:4

%*-*-*-Posición inicial

fprintf(SerPIC,'%c',[char(3) char(190)]);pause(0.8)

fprintf(SerPIC,'%c',[char(1) char(214)]);pause(0.8)

fprintf(SerPIC,'%c',[char(2) char(135)]);pause(0.8)

%*-*-*-FIN Posición inicial

fprintf(SerPIC,'%c',[char(1) char(180)]);pause(0.8)

%*-*-*-Posición final

fprintf(SerPIC,'%c',[char(3) char(70)]);pause(0.8)

fprintf(SerPIC,'%c',[char(1) char(208)]);pause(0.8)

fprintf(SerPIC,'%c',[char(2) char(154)]);pause(0.8)

%*-*-*-FIN Posición final

fprintf(SerPIC,'%c',[char(1) char(180)]);pause(0.8)

end

 

%*-*-*-Posición final

fprintf(SerPIC,'%c',[char(1) char(180)]);pause(0.8)

fprintf(SerPIC,'%c',[char(2) char(135)]);pause(0.8)

fprintf(SerPIC,'%c',[char(3) char(150)]);pause(0.8)

%*-*-*-FIN Posición final

Este script se vale de la función fprintf para enviar los datos y de la función char para convertir tanto el número del motor como la posición del mismo a código ASCII, que es lo que entiende el micro. (Por esta razón esta en la función fprintf '%c', lo que significa que se envía un caracter.)

La lógica como envia los datos fprintf es:

fprintf(SerPIC,'%c',[char(motor) char(posicion)]);pause(0.8)

Aquí debajo les dejo dos fotos del proyecto:

proyecto1

 

proyecto2

Clic en el botón de descarga para bajar el programa:

 

©2015 MATPIC

Prohibida cualquier copia parcial o total del contenido de esta web