Motor Es

24
Control de velocidad Motor Paso a Paso PIC 16f877a CIENCIA Y EDUCACIÓN | HACE MÁS DE 1 AÑO 0 4 Programa utilizado: CCS Compiler Control de velocidad para un Motor Paso a Paso para el PIC 16f877a #include <16F877A.h> #device adc=8 #FUSES NOWDT, RC, PUT, NOPROTECT,NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT #use delay(clock=20000000) #org 0x1f00,0x1fff{} #build (reset=0x04) #use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8) #define t1 delay_ms(200); #include <lcd.c> //#device ICD=TRUE //#fuses HS,NOWDT,NOPROTECT,NOLVP //#use delay(clock=20000000) //#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8) #use FAST_IO(B) #use FAST_IO(C) #byte FASES= 0x06 int velocidad=300; void GiroDerecha(){ output_b (0x30); //paso 1 delay_ms(velocidad); output_b (0x60); //paso 2 delay_ms(velocidad); output_b (0xc0); //paso 3 delay_ms(velocidad); output_b (0x90); // paso 4 delay_ms(velocidad); } void GiroIzquierda(){ FASES=0b001100; //paso 1 delay_ms(velocidad);

description

motores

Transcript of Motor Es

Control de velocidad Motor Paso a Paso PIC 16f877aCIENCIA Y EDUCACIÓN | HACE MÁS DE 1 AÑO

 

0

 

4

 

Programa utilizado: CCS Compiler Control de velocidad para un Motor Paso a Paso para el PIC 16f877a 

#include <16F877A.h> #device adc=8 #FUSES NOWDT, RC, PUT, NOPROTECT,NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT #use delay(clock=20000000) #org 0x1f00,0x1fff{} #build (reset=0x04) #use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8) #define t1 delay_ms(200); #include <lcd.c> //#device ICD=TRUE //#fuses HS,NOWDT,NOPROTECT,NOLVP //#use delay(clock=20000000) //#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8) #use FAST_IO(B) #use FAST_IO(C) #byte FASES= 0x06 int velocidad=300; void GiroDerecha(){ output_b (0x30); //paso 1 delay_ms(velocidad); output_b (0x60); //paso 2 delay_ms(velocidad); output_b (0xc0); //paso 3 delay_ms(velocidad); output_b (0x90); // paso 4 delay_ms(velocidad); } void GiroIzquierda(){ FASES=0b001100; //paso 1 delay_ms(velocidad); FASES=0b001001; //paso 2 

delay_ms(velocidad); FASES=0b000011; //paso 3 delay_ms(velocidad); FASES=0b001100; // paso 4 delay_ms(velocidad); } void main(void) { char valor=0; SET_TRIS_B(0x00); while(TRUE){ if(kbhit()) valor=getc(); switch (valor){ case 'a'://motor parado FASES=0b000000; break; 

case 'b': //Marcha Manual Lenta Izquierda velocidad=10; GiroIzquierda(); break; 

case 'c': //Motor parado FASES=0b000000; break; 

case 'd': //Marcha manual rápida izquierda velocidad=3; GiroIzquierda(); break; 

case 'e': //Motor parado FASES=0b000000; break; 

case 'f': //Marcha manual lenta derecha velocidad=10; GiroDerecha(); break; 

case 'g': //Motor parado FASES=0b000000; break; 

case 'h': //Marcha manual rápida derecha velocidad=3; GiroDerecha(); 

break; 

case 'A': //Marcha Automática lenta izquierda velocidad=10; GiroIzquierda(); break; 

case 'B': //Marcha Automática lenta izquierda velocidad=10; GiroIzquierda(); break; 

case 'C': //Marcha Automática rápida izquierda velocidad=3; GiroIzquierda(); break; 

case 'D': //Marcha Automática rápida izquierda velocidad=3; GiroIzquierda(); break; 

case 'E': //Marcha automática lenta derecha velocidad=10; GiroDerecha(); break; case 'F': //Marcha automática lenta derecha velocidad=10; GiroDerecha(); break; 

case 'G': //Marcha automática rápida derecha velocidad=3; GiroDerecha(); break; 

case 'H': //Marcha automática rápida derecha velocidad=3; GiroDerecha(); break; case 'n': break; 

default: velocidad=15; break; } 

} }

Fuentes de InformaciónEl contenido del post es de mi autoría, y/o, es un recopilación de distintas fuentes.

Tagsmotor   pic   paso a paso   ccs   compiler   16f877a.

Compartir

0

4

 

 

1

Dar puntos 1 2 3 4 5 6 7 8 9

+10

39 PuntosVotos: 6 - T! score: 6.5 / 10

SeguirA favoritos 1

Seguidores 6.795

Visitas 5

Favoritos

HAZLO TU MISMOProyectar una plataforma móvil con un motor step

HAZLO TU MISMOComo hacer funcionar tu motor Paso a Paso (de 4 cables)

HAZLO TU MISMOMover motor con la pc (sin integrados)

CIENCIA Y EDUCACIÓNControlador para motores paso a paso

7 comentarios

@Roco_caba hace 1 año

Muy buen trabajo. Me sirvió. 

@markitosb hace 1 año

hola muy buen post pero tengo una duda no se mucho de programacion yo deseo controlar un motor de paso por pwm con pic16f877a por pwm velocidad variable de 60 a 600 rpm pero con salidas step y dir ya que tengo un driver de motor de paso que trabaja con esas señales http://www.esteca55.com.ar/proye-dvb20a.htmlno se si me podrian ayudar grasias

@hell_sun hace 1 año

hola tienes el proteus, simulación del proyecto ??

@pepe_manuel1234 hace 8 meses

tendras la simulacion de proteus?

@Lanmar hace 7 meses

te dejo 5 y si subes la simulación en proteus prometo otros 5 

@jukaceledon hace 3 meses

podrias orientarme como poderlo hacer en ccs

@cacuy66 hace 1 día

amigo me puedes pasar el circuito te dejo mi correo [email protected]

http://www.tutoelectro.com/introduccion-a-motores-paso-a-paso/

Autor Tema: Control de Motor paso a paso a través de un PIC  (Leído 4809 veces)

 anfedres

Colaborador MicroPIC

Mensajes: 54

Control de Motor paso a paso a través de un PIC« en: Julio 30, 2008, 03:41 »

Compañeros, Picmanianos, mis estimados ratones de programación... vengo por aca con mis

dudas, sugerencias y flores para todos los usuarios del foro.

Actualmente me encuentro desarrollando un programita para lo que posiblemente puede ser en

el futuro un brazo robotico, esperemos que si, pondré aca el código que he implementado y

explicaré mis dudas, espero que os entiendan.

Pienso controlar mi brazo robótico a través de motores paso a paso, en este momento, he hecho

el control de un solo motor, a través de 2 pulsadores, que cuando lo mantengo pulsado, el motor

gira para un lado y cuando lo suelto, se queda en el paso en el cual se encuentra en ese

instante, y si pulso el otro pulsador, pasa exacatamente lo mismo, salvo que gira en el otro

sentido; sin embargo, he tenido problema con el manejo del retardo, pues, en mucha parte

influye esto, pues, o no alcanza a energizar bien la bobina, o salta a otro paso, espero que me

puedan ayudar a mejorar mi programa, para ver como puedo implementarlo de una mejor forma.

Para la salida del pic al motor, tengo un arreglo de transistores DARLINGTON, en un encapsulado,

el ULN2803, por ahora no tengo ningún montaje hecho, solo lo he simulado en proteus., y mi

código lo estoy haciendo en CCS C.

También he visto que lo puedo hacer a través de Servo motores, o motores paso a paso pero

controlados por PWM, sin embargo, considero un poco mas complicado esta parte.

Así mis estimados, os dejo mi código aca abajo, y el circuto hecho en PROTEUS. Acepto

sugerencias y reclamos, ah y muchisimas gracias a todos y muchos Exitos con sus proyectos y

circuitos.

Código: [Seleccionar]

#include <16F877.h>

#use delay(clock=1000000)

#fuses NOWDT,NOPROTECT,NOLVP,NODEBUG,PUT

int retardo; 

void main() 

{ retardo=300; //CON ESTE VALOR SE CAMBIA LA VELOCIDAD DE GIRO DEL MOTOR 

WHILE(input(PIN_C0))  // INICIALIZO LOS PINES EN VALOR BAJO, PARA QUE EL MOTOR

NO SE MUEVA

 {

   OUTPUT_LOW(PIN_B0);

   OUTPUT_LOW(PIN_B1);

   OUTPUT_LOW(PIN_B2);

   OUTPUT_LOW(PIN_B3);

 

 }

do{

if(!input(pin_C0)&&(input(pin_c1)))     // GIRO EN UN SENTIDO (GIRO 1) 

   OUTPUT_LOW(PIN_B0);

   OUTPUT_HIGH(PIN_B1);

   OUTPUT_LOW(PIN_B2);

   OUTPUT_LOW(PIN_B3);

   delay_ms(retardo); }if(!input(pin_C0)&&(input(pin_c1)))  // GIRO EN UN SENTIDO

(GIRO 1) 

   OUTPUT_LOW(PIN_B0);

   OUTPUT_LOW(PIN_B1);

   OUTPUT_HIGH(PIN_B2);

   OUTPUT_LOW(PIN_B3);

   delay_ms(retardo); }if(!input(pin_C0)&&(input(pin_c1)))   // GIRO EN UN SENTIDO

(GIRO 1) 

   OUTPUT_LOW(PIN_B0);

   OUTPUT_LOW(PIN_B1);

   OUTPUT_LOW(PIN_B2);

   OUTPUT_HIGH(PIN_B3);

   delay_ms(retardo); }if(!input(pin_C0)&&(input(pin_c1))) // GIRO EN UN SENTIDO

(GIRO 1) 

   OUTPUT_HIGH(PIN_B0);

   OUTPUT_LOW(PIN_B1);

   OUTPUT_LOW(PIN_B2);

   OUTPUT_LOW(PIN_B3);

   delay_ms(retardo); }if(input(pin_C0)&&(!input(pin_c1)))// GIRO EN UN SENTIDO

(GIRO 2) 

   OUTPUT_HIGH(PIN_B0);

   OUTPUT_LOW(PIN_B1);

   OUTPUT_LOW(PIN_B2);

   OUTPUT_LOW(PIN_B3);

   delay_ms(retardo); }if(input(pin_C0)&&(!input(pin_c1)))  // GIRO EN UN SENTIDO

(GIRO 2) 

   OUTPUT_LOW(PIN_B0);

   OUTPUT_LOW(PIN_B1);

   OUTPUT_LOW(PIN_B2);

   OUTPUT_HIGH(PIN_B3);

   delay_ms(retardo); }if(input(pin_C0)&&(!input(pin_c1)))   // GIRO EN UN SENTIDO

(GIRO 2) 

   OUTPUT_LOW(PIN_B0);

   OUTPUT_LOW(PIN_B1);

   OUTPUT_HIGH(PIN_B2);

   OUTPUT_LOW(PIN_B3);

   delay_ms(retardo); }if(input(pin_C0)&&(!input(pin_c1))) // GIRO EN UN SENTIDO

(GIRO 2) 

   OUTPUT_LOW(PIN_B0);

   OUTPUT_HIGH(PIN_B1);

   OUTPUT_LOW(PIN_B2);

   OUTPUT_LOW(PIN_B3);

   delay_ms(retardo); }}while(true); 

}

 En línea

Everything that has begining... has an end

 nocturno

Administrator

MicroPIC Gurú

Mensajes: 1828

o

Re: Control de Motor paso a paso a través de un PIC« Respuesta #1 en: Julio 30, 2008, 07:51 »

Muchas gracias por compartirlo.

Te propongo que lo hagas con un Timer, en lugar de con "delay" para dejar al micro libre

mientras espera al siguiente paso.

Suerte.

 En línea

Un saludo desde Sevilla, España

 anfedres

Colaborador MicroPIC

Mensajes: 54

Re: Control de Motor paso a paso a través de un PIC« Respuesta #2 en: Julio 30, 2008, 15:46 »

Espero pues que mi código sea fuente de aprendizaje, cabe destacar que no es muy complejo,

pero sin embargo lo deseo mejorar.

Citar

Te propongo que lo hagas con un Timer, en lugar de con "delay" para dejar al micro

libre mientras espera al siguiente paso.

Nocturno, estaría muy agradecido si me enseñas como hacerlo por este método (Timer), pues no

estoy muy familiarizado con su uso, o si alguien mas desea hacerlo, sera bienvenido a la

discusión.

Un saludo a todos los Foreros y Picmanianos.

 En línea

Everything that has begining... has an end

 ernesto50

Amigo MicroPIC

Mensajes: 24

Re: Control de Motor paso a paso a través de un PIC« Respuesta #3 en: Agosto 04, 2008, 05:53 »

hola a todos, 

anexo un programa que practicamente hace lo mismo pero seria util probar los dos programas

con el mismo hardware.

para la parte del retardo anexo la libreria retardos que debe tener extencion .inc

 En línea

IMPRIMIRPáginas: [1]   Ir Arriba

« anterior próximo »

MicroPIC  »

Foro  »

Contenidos de MicroPIC  »

Proyectos  (Moderador: HJ.0x00) »

Control de Motor paso a paso a través de un PIC

PIC12F

 Desconectado

Sexo: Mensajes: 283

PIC16F84A+Motor Bipolar« : Febrero 23, 2009, 12:45:28 »

hola que tal colegas,me gusta mucho la robotica,y hace poco desarme un escaner que tenia tirado desde hace tiempo,y al desarmarlo me encontre con una sorpresa dentro, un motor paso a paso bipolar,entonces me puse a crear un programa sencillo que moviera el motor bipolar hasta completar una vuelta.aca les dejo el codigo en lenguaje c.

#include <16f84a.h> //pic a utilizar#fuses XT,NOWDT,NOPROTECT,PUT //ordenes para el programador#use delay (clock=4000000) //Fosc=4Mhz

#byte port_a=5 //declaramos el puerto a en su

localidad#byte port_b=6 //declaramos el puerto b en su localidad

void main(void){set_tris_a(0b00000001); //programamos el puerto a para que RA0 sea entradaset_tris_b(0b00000000); //programamos el puerto b para q sea salidaport_b=0x00; //inicialmente todo el puerto b estara apagadowhile (true) //bucle infinito,o que el programa se ejecutara infinitamente{if (port_a==0x00) //preguntamos si RA0 es cero{///////////////////////////////////////////////////////////cuando se cierra el pulsador ejecuta esta tarea////la cual es mover un motor paso a paso bipolar  //////////////////////////////////////////////////////////

port_b=0b00000101; //primer paso (45 grados)delay_ms(500);

port_b=0b00000100; //segundo paso (90 grados)delay_ms(500);

port_b=0b00000110; //tercer paso (135 grados)delay_ms(500);

port_b=0b00000010; //cuarto paso (180 grados)delay_ms(500);

port_b=0b00001010; //quinto paso (225 grados)delay_ms(500);

port_b=0b00001000; //sexto paso (270 grados)delay_ms(500);

port_b=0b00001001; //septimo paso (315 grados)delay_ms(500);

port_b=0b00000001; //octavo paso (360 grados = 0 grados)delay_ms(500);

}}}

y les dejo una imagen adjunta del circuito en proteus.espero que esto sirva de iniciativa para que alguien arme algo bueno jeje

 pap.jpg (70.99 KB - descargado 2044 veces.) motor paso a paso bipolar.rar (13.41 KB - descargado 1395

veces.)

« Última modificación: Agosto 18, 2009, 09:11:40 por ronny22 »

 En línea

Bruno10ModeradorPIC16F

 Desconectado

Sexo: Mensajes: 931

texto personal

Re: PIC16F84A+Motor Bipolar« Respuesta #1 : Febrero 26, 2009, 10:50:48 »

Aca un video de un motor paso a paso bipolar de una lectora de cd controlado por el puerto paralelo y con una interfaz hecha con transistores bc548, si encuentro el programa lo subo.saludos

http://www.youtube.com/watch?v=pWfdsbuN3sE

 En línea

Bruno Pasquini

ronny22PIC12F

 Desconectado

Sexo: Mensajes: 283

Re: PIC16F84A+Motor Bipolar« Respuesta #2 : Febrero 26, 2009, 11:00:06 »

hola bruno,esta muy bueno tu aporte,si encuentras el programa subelo que a alguno de nosotros nos servira,chau y suerte

 En línea

cocolizopPIC10F

 Desconectado

Mensajes: 6

Re: PIC16F84A+Motor Bipolar« Respuesta #3 : Mayo 07, 2012, 09:22:40 »

hola ronny22,

De casualidad sabes cómo manipular los grados de giro? yo tengo un motor bipolar Mitsumi M42SP-6TG DE 10Ω y no encuentro el datasheet. Lo saque de una impresora Lexmark.

Estuve manipulando los archivos que subiste y logre dar con la simulacion de proteus y al componente MOTOR_BISTEPPER le di click derecho en Edit Properties y luego en la casilla step angle la cambie por 1,8°.

Corrí la misma secuencia que esta en tu programa con la única diferencia que el pic que yo ocupo es el 16f628A.

El programa parece funcionar y los pasos bajaron de angulo.

Mi pregunta es: Como funciona esto en físico, cuantas secuencias se pueden hacer y como manipular los grados de giro en físico.

Estaba pensando en hacer un ciclo for para repetir la

secuencia hasta llegar al angulo deseado.

(1/2) > >>

Cryn:Hola saludos he conseguido un motor paso a paso de 1.8º por paso, creo que esta excelente, ahoar he leido ya uno de los tutoriales que habia por aca y en muchos lados encontre el mismo, entiendo todo lo que ahi dice: http://www.frino.com.ar/tut_motores.htm mi motor es muy parecido a eso (por no decir que esta igualito), que voltaje aguanta?? y con que voltaje trabaja óptimamente?? yta que no encontre nada de especificaciones en el papelito que llevaba pegado, no lo compre de la tienda, lo compre de un lugar donde venden todo tipo de repuestos, me costo barato, jeje, cuando cuesta normalmente uno de ese tipo?? ahh, se me olivda decir que es de 6 cables por tanto es unipolar; mi pregunta es la siguiente (no encontre respuesta ni aca, ni en los tutoriales): como hago para que el motor de una vuelta completa?? le doy las primeras 8 configuraciones en ABCD?? despues vuelvo a repetir las 8?? hasta completar los 200 pasos??; si quisiera media vuelta; 100 pasos repitiendo de 8 en 8?? un ejemplito porfavor con ccs, se que se debe usar un driver como el L293, que otros driver se puede usar, de qeu puede depender el uso de un driver u otro??muchas gracias, chao.

5GTT:1 - Lo del voltaje dependera del motor, prueba a introducir el codigo que aparezca en la pegatina en google y en ultimo caso ve a preguntar a la tienda.

2 - En lo de dar una vuelta completa estas en lo cierto, debes hacer que de 200 pasos, haciendo continuamente los ciclos hasta llegar al numero de pasos que necesites. Los ciclos que comentas de 8 pasos se usan cuando estas usando la funcion de medio paso, es decir cada movimiento del motor es de 0.9º, para dar una vuelta completa ira mas rapido si a la misma frecuencia das pasos completos de 1.8º

3 - Ejemplos en CCS debe haber por aqui seguro, no dispongo ahora mismo de ninguno, de todas formas no es complicado simplemente es mandar el pulso por la bobina que quieras exitar en cada momento, para ello la salida del PWM la conectas a la patilla "enable" del driver si usas el L293 o alguno similar.

4 - Al ser un motor unipolar lo mas sencillo es que lo controles con un array darlingon como el ULN2003 como el del tutorial, el problema es que segun el

consumo de corriente del motor en cuestion puede ser incapaz de mover las bobinas y necesitaras recurrir a otro integrado que aguante mas corriente o hacer el array con transistores tu mismo. Tambien se puede hacer con el L293 que agunata mas corriente. 

Saludos.

Cryn:saludos de vuelta por aca en el tema, he hecho esto:

/*-----------------------------------------------------------------------------------------------*//* Programa para manipulacion de un motor paso a paso usando el ULN2003 como   *//* driver; el angulo por paso se lo da en la definicioón de ciclos en el                    *//* do-while; RA0 a RA3 salidas para el motor; pulsadores en RB0 y RB1 que      *//* definirán en que sentido girará el motor paso a paso                                          *//* Programado por Cryn 13/sep/2006                                                                   *//*-----------------------------------------------------------------------------------------------*/

#include<16f84a.h>#fuses XT,NOWDT,PUT,NOPROTECT#use delay(clock=4000000)

int x=0;void delay(){   delay_ms(50);                 // retardo entre paso}void derecha()                   // giro a la derecha{   x=0;   do                            // 4 pasos por ciclo; 50 ciclos, total pasos=50x4=200   {      output_bit(pin_a0,1);      output_bit(pin_a1,1);      output_bit(pin_a2,0);

      output_bit(pin_a3,0);      delay();      output_bit(pin_a0,0);      output_bit(pin_a1,1);      output_bit(pin_a2,1);      output_bit(pin_a3,0);      delay();      output_bit(pin_a0,0);      output_bit(pin_a1,0);      output_bit(pin_a2,1);      output_bit(pin_a3,1);      delay();      output_bit(pin_a0,1);      output_bit(pin_a1,0);      output_bit(pin_a2,0);      output_bit(pin_a3,1);      delay();      x=x+1;   } while (x!=50);              // estableciendo cantidad de pasos}void izquierda()                 // giro a la izquierda{   x=0;   do   {      output_bit(pin_a0,0);      output_bit(pin_a1,1);      output_bit(pin_a2,1);      output_bit(pin_a3,0);      delay();      output_bit(pin_a0,1);      output_bit(pin_a1,1);      output_bit(pin_a2,0);      output_bit(pin_a3,0);      delay();      output_bit(pin_a0,1);      output_bit(pin_a1,0);      output_bit(pin_a2,0);      output_bit(pin_a3,1);      delay();      output_bit(pin_a0,0);

      output_bit(pin_a1,0);      output_bit(pin_a2,1);      output_bit(pin_a3,1);      delay();      x=x+1;   } while (x!=50);}void main(){   while(true)   {      if(input(PIN_B0))          // si presiono pulsador en B0, motor gira a la derecha      derecha();      else      {         if(input(PIN_B1))       // si se presiono el otro pulsador, motor gira a la izquierda         izquierda();      }   }}

que dicen esta bien?? aca les dejo la simulación que hice en proteus 6.9 sp4

he usado en simulacion un Stepper de 1.8º/paso, ya que poseo uno de esas características; tengo algunas preguntas:

1. la velocidad de giro esta lentísima, eso es debido a que es de 1.8º por paso, porque si modifico a 90º por paso, va mas rápido; parece muy logico.2. hay alguna forma de incrementar la velocidad de giro, para este mi motor?, ya que la función delay que cree, hace un retardo de 50ms por paso, si se hace menor cantidad de tiempo el Motor no responde, si se hace mayor tardará mas.3. en la simulación, si se fijaron, el giro a la derecha lo hace hasta 355º, faltan 5, el giro a la izquierda esta perfecto, algun motivo, o es por causa del simulador.

gracias, chao.

Cryn:Hola saludos, lo he montado en protoboard, funciona muy bien, no como en proteus, comenzare a dudar del proteus :x osea da la vuelta completa en los dos sentidos, bueno algo raro del proteus, para muchas cosas ese software creo que va

muy bien, para otras  :5] un desastre, bueno el unico detalle es que esta algo lento (como en la simulacion,jeje), es eso normal? seguramente por la cantidad de grados por paso, es de 1.8º por paso, se podra incrementar la velocidad??

Nocturno:Como bien dices, el Proteus está bien para unas cosas, pero es una porquería para otras. Hace tiempo que dejé de usarlo porque no te puedes fiar de él.

Con respecto a la velocidad de giro de tus motores, podrías aumentarla reduciendo el delay_ms(50) por valores más pequeños.

Navegación

[0] Índice de Mensajes

[#] Página Siguiente