1 Escuela Politécnica Superior Universidad Autónoma de Madrid Juan González PIC 16F87X Curso de microcontroladores PIC. Semana del 25-29 Mayo 2009. Andrés.

Slides:



Advertisements
Presentaciones similares
Telecomunicaciones.
Advertisements

Comparador de iluminación Sensor de puerta Potencia Iluminación Generador Alarma.
INFORMATICA I Funciones CLASE 13.
El lenguaje de programación C - Identificadores y variables – Isidro González Caballero ( Introducción.
Estructuras de Control.
Símbolos de Programación Estructurada
Javier Mauricio Galvis Moreno
TIPOS DE DATOS Estructuras de control y repetición PARCIAL III.
Programación de microcontroladores PIC16f877a en linux
Programación de Algoritmos Autor: Luis Eduardo Villavicencio Prof.: Ing. Danilo Jaramillo.
Entrada y Salida en C++, Estructuras de Control Prof. Manuel B. Sánchez.
Estructuras Repetitivas Consideraciones. Estructuras Repetitivas  Son aquellas que van a ejecutar un número determinado de veces una instrucción o un.
Análisis de los algoritmos Unidad 7. Análisis La resolución práctica de un problema – algoritmo o método de resolución – y por otra un programa o codificación.
1º BAC Estudio del movimiento U.1 Cinemática Descripción del movimiento circular con magnitudes angulares.
1 Escuela Politécnica Superior Universidad Autónoma de Madrid Juan González PIC 16F87X Curso de microcontroladores PIC. Semana del Mayo Andrés.
1 Escuela Politécnica Superior Universidad Autónoma de Madrid Juan González PIC 16F87X Curso de microcontroladores PIC. Semana del Mayo Andrés.
1 Escuela Politécnica Superior Universidad Autónoma de Madrid Juan González PIC 16F87X Curso de microcontroladores PIC. Semana del Mayo Andrés.
Escuela Politécnica Superior Universidad Autónoma de Madrid Juan González Gómez Robótica Modular y Locomoción MADRIDBOT 2007.
Cambia de lugar 1 de los 12 palillos para que la igualdad sea verdadera. (Porque 4+3 no son 5) 8 DE 8 Colocar 8 fichas en el tablero de ajedrez de forma.
Programación Lineal SOLUCIÓN MEDIANTE SOFTWARE POM FOR WINDOWS.
Funciones Polinomicas
INTRODUCCIÓN A ARDUINO
PIC 16F87X Agradecimientos: Jesús Ernesto Zavala Ana Cecilia Ruiz
PIC 16F87X Agradecimientos: Jesús Ernesto Zavala Ana Cecilia Ruiz
PIC 16F87X Agradecimientos: Jesús Ernesto Zavala Ana Cecilia Ruiz
Estructuras de Control en Visual Basic.net
Estructuras de Control.
Introducción al lenguaje C Instrucción IF – ELSE y el bucle WHILE
Programacion I Curso: 5 I (TT)
2. Programación de Robots
Programación de PLCs: conversión normalizada y control del programa
Estructuras de Control en Visual Basic.net
PROGRAMACIÓN DE SERVOS CON ARDUINO
Servomotor La modulación por ancho de pulso permite un ciclo de trabajo ( el porcentaje de tiempo en alto contra el tiempo en bajo) que es de 0 al 100.
DISEÑO E IMPLEMENTACIÓN DE UN ROBOT AUTOBALANCEADO
Robótica M.C. Fco. Javier de la Garza S.
CLASE IV.
INICIO ESQUEMA 1 El movimiento PARA EMPEZAR ESQUEMA ANTERIOR SALIR.
Programación en Java..
UNIVERSIDAD NACIONAL AUTÓNOMA DE MÉXICO FACULTAD DE INGENIERÍA
CAPACIDAD DE DETECCION Y CORRECCION DE ERRORES
ESTRUCTURAS DE CONTROL EN VISUAL BASIC.NET Prof.: Rafael Mourglia.
TEMPORALIZADOR, GENERADOR DE SEÑALES, MEDIDOR DE INTERVALOS, DECODIFICADOR DE PULSOS DE CUADRATURA (QEP) Y PWM RANGEL YAÑEZ ROBERTO LOPEZ CONTRERAS ANDRES.
Estructuras de control Resolución de problemas y algoritmos
y pensamiento algebraico
EL MOVIMIENTO CRICULAR
SERVOMOTORES EMAN HENNESY MARIN JOSE MAYO,2018. SERVOMOTOR son dispositivos de accionamiento para el control de precisión de velocidad, par motor y posición.
Manejo de video y teclado
Capítulo 23 Potencial eléctrico.
Estructuras Repetitivas
Estudio del movimiento
Luis Brito Nelson Quizhpe
UNIDAD I: MORFOLOGIA DEL ROBOT
partículas cuánticas ó paquetes de onda
TOMA DE MEDIDAS CON EL POLÍMETRO
TOMA DE MEDIDAS CON EL POLÍMETRO
TOMA DE MEDIDAS CON EL POLÍMETRO
CÁLCULO DIFERENCIAL EN FUNCIONES DE VARIAS VARIABLES
Fundamentos de Informática Especialidad de Electrónica –
Javascript.
Estudio del movimiento
SENTENCIAS CONTROL DE FLUJO EN C I.E. Mario Jiménez.
PROPIEDADES DE LAS FUNCIONES CONTINUAS MATEMÁTICAS II.
Curso de Excel #Intermedio Guillermo Díaz Sanhueza Mail: Web: Team Work Versión:
CAPACIDAD DE DETECCION Y CORRECCION DE ERRORES
UNIDAD 11: CONTROL DE SERVOMOTORES
Vamos a estudiar un movimiento llamado MAS, Movimiento Armónico Simple. Para ello, empezaremos viendo una serie de definiciones sencillas: Movimiento.
 Valiéndose de transductores, utilizan circuitos electrónicos para convertir en números las pequeñas variaciones de tensión obtenidas, mostrando finalmente.
TEMPORIZADOR DIGITAL PIC 16F84 Alberto Simón González
UNIVERSIDAD DE LAS FUERZAS ARMADAS ESPE-L UGT INTEGRANTES: NAULA DAMIAN SALAZAR ANDERSON ASIGNATURA: ELECTRÓNICA APLICADO AL AUTOMOVIL I TEMA: MOTOR PASO.
Transcripción de la presentación:

1 Escuela Politécnica Superior Universidad Autónoma de Madrid Juan González PIC 16F87X Curso de microcontroladores PIC. Semana del Mayo Andrés Prieto-Moreno Ricardo Gómez Flir Networked Systems

2 PIC 16F87X MÓDULO 8: Control de servos

3 Servos

4 Introducción ● Los servos que usaremos son los Futaba 3003 ● Tienen un rango de giro de 180 grados ● Control de la posición mediante señales PWM ● Se conectan directamente a los pines del PIC sin necesidad de ningún circuito de potencia ● Nosotros los conectaremos al PUERTO B ● Usaremos el Timer 0 para generar el PWM Conector ● Cable negro: GND ● Cable Rojo: +5v ● Cable blanco: señal de control

5 Señal de control ● Señal PWM de 50 Hz ● El ancho del pulso varía entre 0.3ms y 2.3ms ● Cada anchura se corresponde con una posición angular del eje de salida del servo ● Trabajaremos con ángulos comprendidos en el rango de -90 a 90 grados

6 PWM y Timer 0 ● Con el Timer 0 el tiempo máximo que medidos es de 13.1ms ● ¿Cómo hacemos para medir los 20 – 0.3 = 19.7ms que la seña tiene que estar a nivel bajo (0) en el caso peor? ● Una solución es dividir los 20ms en ventanas temporales de 2.5ms ● Denominaremos T a la anchura en ticks de estas ventanas de 2.5ms ● Su valor es: Divisor=64, T=195 ticks.

7 Conversión entre grados y tiempo en ticks ● El ángulo del servo lo expresamos en grados, en el rango [-90,90] ● La anchura del pulso está comprendida entre 0.3ms y 2.3ms ● La anchura en ticks (con divisor a 64) está comprendida entre 24 y 180 ticks ● Establecemos una relación lineal entre el ángulo y la anchura (Ton) Posición del servo (en grados) Ancho del pulso (en ticks)

8 Ejemplo 1: Moviendo un servo (I) Secuencia de movimiento. Llevar el servo a las posiciones -90, 0 y 90 #include #define T 195 #define T0INI_2_5ms void timer0_delay() {...} void servo_pos(int pos) { unsigned int ciclos; unsigned int i; char Ton; Ton = (78*pos)/ ; for (ciclos=0; ciclos<100; ciclos++) { PORTB=0xFF; timer0_delay(255-Ton); PORTB=0x00; timer0_delay(255-T+Ton); for (i=0; i<7; i++) timer0_delay(T0INI_2_5ms); } T es la anchura en ticks de la ventana (2.5ms) Valor del timer para conseguir pausa de 2.5ms Función de pausa. Usada en los ejemplos del timer 0 Función para llevar el servo a la posición indicada (en grados) Calcular el tiempo Ton que debe estar activa la señal PWM para alcanzar esa posición Poner señal a 1 Esperar tiempo igual a Ton Poner señal a 0 Esperar tiempo igual a Toff Esperar un tiempo igual a 2.5ms para cada una de las 7 ventanas restantes servo1.c (parte I)

9 Ejemplo 1: Moviendo un servo (II) void main(void) { TRISB=0; T0CS=0; PSA=0; PS2=1; PS1=0; PS0=1; while(1) { servo_pos(-90); servo_pos(0); servo_pos(90); } Configurar timer 0 servo1.c (parte II) Prescaler a 64 Llevar servo a un extremo Llevar servo al centro Llevar servo al otro extremo

10 Moviendo 8 servos con el timer 0 Servo 1 Servo 2 Servo 3 Servo 4 Servo 5 Servo 6 Servo 7 Servo 8 ● En cada ventana de 2.5ms actuamos sobre un servo ● Al terminar con la ventana 8, comenzamos de nuevo con la 1 ● En cada instante hay como mucho un único servo activo

11 Ejemplo: Moviendo 8 servos (I) #include #define T 195 int pos[]={0,0,0,0,0,0,0,0}; unsigned char mask[]={0x01,0x02,0x04, 0x08,0x10,0x20,0x40,0x80}; void servo_pos() { unsigned int ciclos; unsigned int i; char Ton; for (ciclos=0; ciclos<100; ciclos++) { for (i=0; i<8; i++) { Ton = (78*pos[i])/ ; PORTB=mask[i]; timer0_delay(255-Ton); PORTB=0x00; timer0_delay(255-T+Ton); } servo8.c (parte I) T es la anchura en ticks de la ventana (2.5ms) Tabla con las posiciones para cada servo Máscaras para activar cada uno de los pines donde están los servos Función para posicionar los 8 servos Bucle para recorrer las 8 ventanas Obtener la anchura del pulso del servo de la ventana i, en ticks, a partir de la posición en grados Activar la señal del servo i Esperar tiempo igual a Ton Poner a 0 la señal del servo i Esperar un tiempo igual a Toff

12 Ejemplo: Moviendo 8 servos (II) void main(void) { TRISB=0; T0CS=0; PSA=0; PS2=1; PS1=0; PS0=1; while(1) { pos[0]=90; pos[1]=-90; servo_pos(); pos[0]=-90; pos[1]=90; servo_pos(); } servo8.c (parte II) Configurar el timer 0 (prescaler a 64) Llevar los servos 0 y 1 a sus posiciones de los extremos (el resto permanecerán en el centro) Llevar los servos 0 y 1 a sus otros extremos

13 Moviendo 8 servos mediante interrupciones ● Vamos a mover los 8 servos mediante interrupciones para poder realizar otras tareas desde el bucle principal ● Usamos un autómata de estados para cada ventana: ● ESTADO ON: la señal del servo i está activa ● ESTADO OFF: la señal del servo i está desactivada ● Al salir del estado OFF se pasa al estado ON pero de la siguiente ventana

14 Ejemplo 3: Mover 8 servos mediante int. (I) #include #define T 195 #define ESTADO_ON 0 #define ESTADO_OFF 1 int pos[]={0,0,0,0,0,0,0,0}; unsigned char mask[]={..}; unsigned char estado=0; unsigned char servo=0; char Ton; void isr() interrupt 0 { if (estado==ESTADO_ON) Ton = (78*pos[servo])/ ; PORTB=mask[servo]; TMR0=255-Ton; estado=ESTADO_OFF; } else { PORTB=0x00; TMR0=255-T+Ton; servo=(servo + 1)%8; estado=ESTADO_ON; } T0IF=0; } servo8-int.c (parte I) Definición de los estados para el autómata Máscara para activar los servos (igual que en el ejemplo anterior) Posiciones para los servos (grados) Estado del autómata Apunta al servo actual Rutina de atención a la interrupción del Timer 0 Cuando estamos en el estado ON Calcular el tiempo Ton en ticks para el servo actual Activar la señal del servo actual Configurar timer para esperar tiempo Ton Pasar al siguiente estado Cuando estamos en el estado OFF Poner señal del servo a 0 Configurar timer para esperar tiempo Toff Pasar a la siguiente ventana Pasar al estado ON Poner el flag a 0

15 Ejemplo 3: Mover 8 servos mediante int. (II) void main(void) { TRISB=0; T0CS=0; PSA=0; PS2=1; PS1=0; PS0=1; TMR0IE=1; GIE=1; while(1) { pos[0]=90; pos[1]=-90; pausa(14); pos[0]=-90; pos[1]=90; pausa(14); } servo8-int.c (parte II) Configurar temporizador (prescaler 64) Activar las interrupciones Llevar los servos 0 y 1 a sus posiciones de los extremos (el resto permanecerán en el centro) Llevar los servos 0 y 1 a sus otros extremos Pausa

16 Ejemplo 4: Servos y puerto serie (I) ● Como los servos se mueven mediante interrupciones, podemos realizar otras tareas ● Por ejemplo atender el puerto serie para mover los servos según las opciones seleccionadas por el usuario ● Mediante las teclas 1-8 el usuario selecciona el servo activo ● Con las teclas 'o' y 'p' se incrementa o decrementa la posición del servo activo en 5 grados ● Con las teclas 'q' y 'a' se lleva el servo activo a sus extremos ● Con la tecla espacio se posiciona en el centro

17 Ejemplo 4: Servos y puerto serie (II) #include #include "sci.h" (...) void main(void) { unsigned char c; unsigned char i=0; sci_conf(); (...) while(1) { c=sci_read(); switch(c) { case ' ': pos[i]=0; break; case 'q': pos[i]=90; break; case 'a': pos[i]=-90; break; servo-sci.c Igual que en ejemplo anterior case 'p': pos[i]+=5; if (pos[i]>90) pos[i]=90; break; case 'o': pos[i]-=5; if (pos[i]<-90) pos[i]=-90; break; default: if (c>='1' && c<='8') { i = c - '1'; sci_cad("Servo "); sci_write(c); sci_write('\n'); } Igual que en ejemplo anterior Con las teclas del 1-8 se cambia el servo activo Incrementar la posicion en 5 grados y comprobar que no se rebasan los 90 grados decrementar la posicion en 5 grados y comprobar que no se rebasan los -90 grados

18 Ejercicio: ● Reproducir una secuencia de movimiento en un servo MEJORA ● Seleccionar entre varias secuencias de movimiento a través de un menú por el puerto serie