Está en la página 1de 7

UNIVERSIDAD TECNOLOGICA DE SANTIAGO

DEPARTAMENTO DE INGENIERIA ELECTRONICA

MICROPROCESADORES II
IET-800-002

El siguiente tutorial pretende brindar los conocimientos básicos para manejar un servo
motor. Al final se realizara una práctica que será completada y entregada sobre proteus, el
desarrollo de su software en µ-keil lenguaje C.

INTRODUCCION

El servo motor ha sido por mucho tiempo utilizado en muchas aplicaciones de control, son
compactos en tamaño y torque, relativamente más eficiente en el consumo de energía, por
estas y otras razones adicionales, pueden ser utilizados en aplicaciones industriales, robots,
radiocontroles y otros.

La circuitería interna del servo motor, dispone de los siguientes elementos, motor,
potenciómetro, circuito de control y engranajes de posicionamiento. Este dispositivo es
controlado mediante una señal con determinado ancho de pulso (PWM) el cual alimenta al
circuito de control. Las señales que conectan al servo motor (GND, +5V, señal PWM). En la
figura 1, 2 y 3 se pueden apreciar los componentes que les acompañan y el dispositivo
ensamblado para utilizar.

Figura 1 Figura 2

Figura 3

Todos los derechos reservados a las fuentes bibliográficas utilizadas.©


Ing. Raúl Toribio
UNIVERSIDAD TECNOLOGICA DE SANTIAGO
DEPARTAMENTO DE INGENIERIA ELECTRONICA

MICROPROCESADORES II
IET-800-002

El servo es controlado mediante una variación de ancho de pulso o PWM sobre el cable
destinado para control. El servo se puede girar 90º en cualquier dirección hasta los 180º. La
posición neutra 0o se define como la posición en la que el servo tiene la misma cantidad de
rotación potencial en sentido horario o anti horario. El servo espera recibir un pulso de señal
cada 20milisegundos (ms) y el ancho del pulso determina que tanto el motor pueda girar.
Por ejemplo un duty cycle = 1.5ms hará que el motor gire hacia la posición de 90º, por
debajo de 1.5ms hará que el motor gire hacia 0o y cualquier modulación del pulso por
encima de 1.5ms hará que gire hacia 180º según muestra la figura 4.

Figura 4

Cuando un servo ejecuta una acción de movimiento mantendrá la posición indicada siempre
y cuando se mantenga la señal de estado. Todo el tiempo debe haber una señal de pulsos
presente en ese cable.

Los pulsos que ocurren frecuentemente en el tiempo de OFF pueden interferir con el
sincronismo interno del servo y podría escucharse un sonido de zumbido o alguna vibración
en el eje. Si el espacio del pulso es mayor de 50ms (depende del fabricante), entonces el
servo podría estar en modo SLEEP entre los pulsos. Entraría a funcionar en pasos
pequeños y el rendimiento no sería el óptimo. Para el desarrollo de la aplicación deberán ser
utilizados timers e interrupciones.

Todos los derechos reservados a las fuentes bibliográficas utilizadas.©


Ing. Raúl Toribio
UNIVERSIDAD TECNOLOGICA DE SANTIAGO
DEPARTAMENTO DE INGENIERIA ELECTRONICA
DEPARTAMENTO

MICROPROCESADORES II
IET-800-002

LAB07: MANEJO DE SERVO MOTOR, TIMERS E INTERRUPCIONES.

PRE-LAB EJERCICIOS

IN-LAB EJERCICIOS

(1-1) Se deberá diseñar un circuito con el 8051 de Intel que permita interconectar un ADC
al puerto (P1) del micro,
micro sobre el pin P0.0 conectar un servo motor,
motor conectar al P3.0
una señal de sincronismo para la automatización de las conversiones,
conversiones Al ADC
deberá conectarse un potenciómetro a la entrada de señal VI+ que al variar el voltaje
de entrada variara la señal de control (PWM) sobre P0.0.
P0.0. El programa desarrollado
sobre keil C deberá tener la capacidad de variar el PWM en función del voltaje VI+
sobre el resistor variable de entrada, utilice como referencia la figura 1 igual tienen
disponible el código desarrollado en keil.
keil. El rango es como se presenta a
continuación:
010=>ADC <=5910 Ton= 1 ms
6110=>ADC <=15010 Ton= 1.5 ms
15310=>ADC <=25510 Ton= 2 ms
Responda las siguientes preguntas

Qué ocurre si la en declaración de esta variable unsigned char ADC quitamos la palabra
unsigned explique y justifique su respuesta?

Elimine el potenciómetro Vi+ y conecte una señal analógica AC con los valores
correspondientes explique lo acontecido?

Varíe los valores Ton de cada señal PWM de control P0.0 y explique el
comportamiento en el servo?
Ton= 1 ms------ 1.2ms
ms Ton= 1.5 ms------ 1.7ms Ton= 2 ms------ 2.2ms

Todos los derechos reservados a las fuentes bibliográficas utilizadas.©


Ing. Raúl Toribio
UNIVERSIDAD TECNOLOGICA DE SANTIAGO
DEPARTAMENTO DE INGENIERIA ELECTRONICA

MICROPROCESADORES II
IET-800-002

Figura 1

/*----------------------------------------------------------------
| Autor: Matricula: |
| Fecha: Versión: 1.0 |
|-----------------------------------------------------------------|
| Descripción del Programa: |
| |
| ----------------------------------------------------------------*/

// Incluir E/S y Librerías Standard


#include <reg51.h>
#include <intrins.h>

// Zona de Declaración de Constantes

// Zona de Declaración de variables globales


sbit CLK_ADC=P3^0;
sbitpuerto_test=P3^7;
sbitPWM_out=P0^0;
bitPWM_flag=0;

Todos los derechos reservados a las fuentes bibliográficas utilizadas.©


Ing. Raúl Toribio
UNIVERSIDAD TECNOLOGICA DE SANTIAGO
DEPARTAMENTO DE INGENIERIA ELECTRONICA

MICROPROCESADORES II
IET-800-002

// Zona de Cabeceras de Procedimientos y Funciones


void delay(unsigned int );
voidsetup_register();

// Programa Principal

void main(){

setup_register();

TH0=0xB5; //SENAL DE 19ms.


TL0=0xC7; //SENAL DE 19ms.

TR0=1;
while(1){

CLK_ADC=!CLK_ADC;
delay(200);

// Implementación de Procedimientos y Funciones


voidsetup_register(){
//REGISTROS
//GATE:C/T:M1:M0:GATE:C/T:M1:M0
TMOD=0x01; //MODO 1 a 16 bits

//REGISTROS
//TF1:TR1:TF0:TR0:IE1:IT1:IE0:IT0
TCON=0x00;

//REGISTRO
//EA:-:ET2:ES:ET1:EX1:ET0:EX0
IE=0x83;
}

void interrupcion_0() interrupt 0 //externa 0


{
puerto_test=!puerto_test;
delay(200);
}

void interrupcion_1() interrupt 1 //timers 0


{

Todos los derechos reservados a las fuentes bibliográficas utilizadas.©


Ing. Raúl Toribio
UNIVERSIDAD TECNOLOGICA DE SANTIAGO
DEPARTAMENTO DE INGENIERIA ELECTRONICA

MICROPROCESADORES II
IET-800-002

unsigned char ADC=0;


ADC=P1;
ADC=P1;
if(ADC>=0&&ADC<=60){ //para valores desde 0 hasta 60
if(PWM_flag){

PWM_out=1;
PWM_flag=0;
TR0=0;
TH0=0xFC; //SENAL DE 1ms.
TL0=0x17; //SENAL DE 1ms.
TR0=1;

}
else{

PWM_out=0;
PWM_flag=1;
TR0=0;
TH0=0xB5; //SENAL DE 19ms.
TL0=0xC7; //SENAL DE 19ms.
TR0=1;
}
}

if(ADC>=61&&ADC<=150){ //para valores desde 61 hasta 150


if(PWM_flag){

PWM_out=1;
PWM_flag=0;
TR0=0;
TH0=0xFA; //SENAL DE 1.5ms.
TL0=0x23; //SENAL DE 1.5ms.
TR0=1;

}
else{

PWM_out=0;
PWM_flag=1;
TR0=0;
TH0=0xB7; //SENAL DE 18.5ms.
TL0=0xBB; //SENAL DE 18.5ms.
TR0=1;
}
}

if(ADC>=151&&ADC<=255){ //para valores desde 151 hasta 255

Todos los derechos reservados a las fuentes bibliográficas utilizadas.©


Ing. Raúl Toribio
UNIVERSIDAD TECNOLOGICA DE SANTIAGO
DEPARTAMENTO DE INGENIERIA ELECTRONICA

MICROPROCESADORES II
IET-800-002

if(PWM_flag){

PWM_out=1;
PWM_flag=0;
TR0=0;
TH0=0xF8; //SENAL DE 2ms.
TL0=0x2F; //SENAL DE 2ms.
TR0=1;

}
else{

PWM_out=0;
PWM_flag=1;
TR0=0;
TH0=0xB9; //SENAL DE 18ms.
TL0=0xAF; //SENAL DE 18ms.
TR0=1;
}
}

void delay(unsigned int a){


unsignedint x;
for(x=0;a<=x;x++);
for(x=0;x<=1500;x++);
}

Todos los derechos reservados a las fuentes bibliográficas utilizadas.©


Ing. Raúl Toribio

También podría gustarte