Autor Tema: Motores Paso a paso con PIC18F2550  (Leído 9427 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado el_yind

  • PIC10
  • *
  • Mensajes: 8
Motores Paso a paso con PIC18F2550
« en: 24 de Mayo de 2011, 09:56:25 »
Bueno para empezar quiero aclarar que yo no soy electronico, soy más informático y me mande con este proyecto que es para controlar unos motores paso a paso para unas cortinas electricas que me estoy armando.

Yo realmente mucho no entiendo de electronica pero mirando un par de ejemplos y cosas llegue a armar "el circuito que necesito"

Básicamente uni lo que me parecio y reze de que ande, pero como era de imaginar no anduvo xD, el problema básico es que lo conecto al puerto USB y no me aparece nada en la PC, tengo windows 7, pero creo que tendría que detectar el dispositivo por lo menos, (si no es asi porfavor diganme como hay que hacer para que detecte el pic y programarlo)

La cuestion es que arme el siguiente esquema en base a otro que habia visto para 1 motor paso a paso con un PIC18F4550 pero como no pude conseguir ese pic lo adapte como pude con un PIC18F2550 y me quedo una cosa asi:



Ahora si alguien me pudiese guiar un poco en esto y me ayudara a saber que es lo que está mal o pq no lo detecta lo agradeceria enormemente.

La función en sí del circuito es la siguiente:

El chip va a tener un soft para que desde la pc le envie unos comandos que activen los motores para las 2 cortinas, de modo que den x cantidad de vueltas para cumplir con el recorrido necesario para subirlas o bajarlas, o pararlas en el medio, cada cortina funciona de modo independiente.

Gracias!
« Última modificación: 24 de Mayo de 2011, 10:58:57 por el_yind »

Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
Re: Motores Paso a paso con PIC18F2550
« Respuesta #1 en: 24 de Mayo de 2011, 10:36:30 »
con un 16f876 tendrias de sobra.y es mas facil de estudiar.ademas no veo muy practico usar usb para controlar los motores.seria mas facil por rs232.y tendrias
una opcion facil de adaptar un modulo bluetooth.que salen por unos 12€.asi no tendrias que poner el PC junto con tu circuito.ya que el usb tiene un limite a la hora de poner un cable demasiado largo.
Montando mi primera impresora 3D (Raprep Prusa i3)

Desconectado el_yind

  • PIC10
  • *
  • Mensajes: 8
Re: Motores Paso a paso con PIC18F2550
« Respuesta #2 en: 24 de Mayo de 2011, 10:54:48 »
con un 16f876 tendrias de sobra.y es mas facil de estudiar.ademas no veo muy practico usar usb para controlar los motores.seria mas facil por rs232.y tendrias
una opcion facil de adaptar un modulo bluetooth.que salen por unos 12€.asi no tendrias que poner el PC junto con tu circuito.ya que el usb tiene un limite a la hora de poner un cable demasiado largo.

Que tal, gracias por tu respuesta, te comento que el PIC 18f2550 ya lo tengo, y no importaría usar un cable usb pq esta a 1 metro lo necesito manejar, si es mas facil con ese chip pues por ahi me convendría hacer pero mi problema reside principalmente en que yo no se electronica entonces no se armar un circuito de 0, el que publique en el post es en base a unos ejemplos q vi y los modifique como me parecio por eso no se si funciona o no :/ yo ya lo intente armar pero al conectarlo a la pc no pasa nada, no me detecta nada.

Asi que eso nomas, si hay una forma mas simple de controlar los 2 motorcitos seria buenisimo

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Motores Paso a paso con PIC18F2550
« Respuesta #3 en: 24 de Mayo de 2011, 12:29:50 »
Con que lenguaje estas programando? Tienes un programador? Porque leyendo esto "pero creo que tendría que detectar el dispositivo por lo menos, (si no es asi porfavor diganme como hay que hacer para que detecte el pic y programarlo)" da la sensación que no le has programado nada. O sea, necesitas un hardware adicional para programarlo.
Capaz que tu has visto la implementación de bootloader USB, pero igualmente se necesita programar un código especial en el microcontrolador para que sea detectado por la PC, con un programa especial enviar el Hex y que el mismo se programe.


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado el_yind

  • PIC10
  • *
  • Mensajes: 8
Re: Motores Paso a paso con PIC18F2550
« Respuesta #4 en: 24 de Mayo de 2011, 12:43:00 »
Con que lenguaje estas programando? Tienes un programador? Porque leyendo esto "pero creo que tendría que detectar el dispositivo por lo menos, (si no es asi porfavor diganme como hay que hacer para que detecte el pic y programarlo)" da la sensación que no le has programado nada. O sea, necesitas un hardware adicional para programarlo.
Capaz que tu has visto la implementación de bootloader USB, pero igualmente se necesita programar un código especial en el microcontrolador para que sea detectado por la PC, con un programa especial enviar el Hex y que el mismo se programe.


Saludos!

:o, me acaba de tirar un dato alentador, aunq me haga quedar como un perejil jaja, si, yo compre el PIC y esta virgen, pense que al conectarlo al USB lo detectaba y del mismo modo se podía enviar el firmware. Ahora averiguo donde consigo el aparatito para mandarle el firmware y veo que tal, si llega a funcionar puede ser un muy buen dia :).
Por cierto, el circuito te parece que esta bien??

Gracias!

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Motores Paso a paso con PIC18F2550
« Respuesta #5 en: 24 de Mayo de 2011, 13:05:10 »
Casi, GND debe estar unido con V- de la fuente de 7V. De esa manera el microcontrolador solo es alimentado mediante USB.


Busca programador JDM, es por puerto serial y bastante sencillo de armar.


Saludos!
« Última modificación: 24 de Mayo de 2011, 13:08:00 por Suky »
No contesto mensajes privados, las consultas en el foro

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Motores Paso a paso con PIC18F2550
« Respuesta #6 en: 24 de Mayo de 2011, 14:47:47 »
Hola.

Hace poco hice algo así con el siguiente esquema:



El motor que use es unipolar.

Para que el PC lo detecte hay que programar el uC y quitarle su "virginidad"  :D :D :D (no pude evitarlo)

Saludos
El papel lo aguanta todo

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Motores Paso a paso con PIC18F2550
« Respuesta #7 en: 24 de Mayo de 2011, 14:50:44 »
Para que el PC lo detecte hay que programar el uC y quitarle su "virginidad"  :D :D :D (no pude evitarlo)
:mrgreen: Para que pierda la virginidad no alcanza metiendo el conector USB!  :D :D :D
No contesto mensajes privados, las consultas en el foro

Desconectado el_yind

  • PIC10
  • *
  • Mensajes: 8
Re: Motores Paso a paso con PIC18F2550
« Respuesta #8 en: 24 de Mayo de 2011, 16:07:17 »
Tendrías ese esquema en más grande? porque no llego a leerlo bien.

Casi, GND debe estar unido con V- de la fuente de 7V. De esa manera el microcontrolador solo es alimentado mediante USB.


Busca programador JDM, es por puerto serial y bastante sencillo de armar.


Saludos!
Con respecto a lo que me decias del GND de la fuente de 7v, tiene que entrar al circuito con el GND del usb? pq esa fuente en teoria deberia alimentar solo a los motores.

Ahora estoy viendo como programarle todo, si bien se mucho de programacion, es dificil armar algo sin tener un modelo de pruebas xD


Otra duda que tenia es, esta bien usar los RB0 al RB7 para las salidas del circuito, osea la idea es usar del RB0 al RB3 para un motor y del RB4 al RB7 para el otro, y el chip haria la secuencia necesaria para que el motor gire, pero en mucho ejemplo que vi, usaban otros pines o no se como es que lo hacian.

Yo desde codigo puedo mandarle los pulsos a esos 8 pines tranquilamente?



Alguien que sepa un poco de la programacion de estos pics me podría dar una mano por chat? prometo no molestar demasiado :P, simplemente sacarme un par de dudas. Luego subire el codigo que arme, fotos del proyecto de las cortinas terminadas, un video en lo posible y cualquier información para que otro pueda armarse algo similar.
Porfa mandarme un mensaje privado con su mail y mensajeria que usa :).

Gracias a todos por la ayuda que me brindaron :)

Desconectado el_yind

  • PIC10
  • *
  • Mensajes: 8
Re: Motores Paso a paso con PIC18F2550
« Respuesta #9 en: 24 de Mayo de 2011, 16:13:54 »
Ya que estamos dejo un par de fotos del "circuito" que arme, quedo bastante desprolijo :( pero creo que todas las conexiones estan bien.

Ahora solo faltaría ponerle el firmware y rezar de que ande xD aunque me parece q a este paso es pedir demasiado.







Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Motores Paso a paso con PIC18F2550
« Respuesta #10 en: 24 de Mayo de 2011, 22:15:38 »
GND debes unirlos como comente anteriormente, es la referencia de 0V. Utilizar todo el puerto B para el control esta bien, no genera ningún problema.

Cualquier pregunta en el foro, yo personalmente no utilizo chat.



Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado el_yind

  • PIC10
  • *
  • Mensajes: 8
Re: Motores Paso a paso con PIC18F2550
« Respuesta #11 en: 25 de Mayo de 2011, 11:14:39 »
Bueno este es el code que pude armar para lo que quiero, lo raro es que cuando intento debuggearlo con el CCS me tira errores en cualquier cosa como por ejemplo:
Error 45 "cortinas.c" Line 59 (35,36) Subscript out of range
Error 43 "cortinas.c" Line 59 (36,37) Expecting a declaration
y varios asi..


APLICATION_HID.h
Código: [Seleccionar]
// Definición de constantes y funciones:

// Constantes varias:
#define USB_CONFIG_HID_TX_SIZE   32 // Definimos el tamaño del endpoint de salida.
#define USB_CONFIG_HID_RX_SIZE   32 // Definimos el tamaño del endpoint de entrada.

// Comandos de entrada.
#define SUBIR         0x0A
#define BAJAR         0x0B
#define PARAR         0x0C

#define MOTOR1        0x10
#define MOTOR2        0x20


// Definición de funciones:

void USB_debug();
void config_adcon2(void);

cortina.c
Código: [Seleccionar]
#include <18F2550.h> // Definición de registros internos del PIC18F2550.
//#DEVICE ADC=8 // CAD a 8 bits, justificación a a la derecha.
#DEVICE ADC=10 // CAD a 10 bits, justificación a a la derecha.
//#DEVICE ADC=16 // CAD a 10 bits, justificación a a la izquierda.

#fuses NOMCLR,HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN,NOPBADEN

// NOMCLR: No vamos ha usar el PIN MCLR, el reset se hará por software.
// HSPLL: Utilizaremos un cristal de alta velocidad en conjunto con el PLL.
// NOWDT: No vamos a usar el perro guardian.
// NOPROTECT: Memoria no protejida contra lecturas.
// NOLVP: No utilizamos el modo de programación con bajo voltaje.
// NODEBUG: No utilizamos código para debugear.
// USBDIV: signfica que el clock del usb se tomará del PLL/2 = 96Mhz/2 = 48Mhz.
// PLL1: significa que el PLL prescaler dividirá la frecuencia del cristal. para HS = 20Mhz, PLL = 5.
//       con esto se obtiene: 20Mhz/5 = 4Mhz.
// CPUDIV1: El PLL postscaler decide la división en 2 de la frecuencia de salida del PLL de 96MHZ, si queremos 48MHZ, lo dejamos como está.
// VREGEN: habilita el regulador de 3.3 volts que usa el módulo USB.
// NOPBADEN: Todo el Puerto B como I/O digitales.

// Usamos una frecuencia de trabajo de 48Mhz.
#use delay(clock=48000000)

//===========================================================================

//========================================================================================================

// Incluimos librerías utilizadas por la aplicación.
#include <pic18_usb.h>                   // Drivers's USB del PIC18F2550.
#include "C:\Users\Javier\Desktop\Cortina\Pro\APLICACION_HID.h"              // Definición de funciones y hardware utilizado en el programa.
#include "C:\Users\Javier\Desktop\Cortina\Pro\Descriptor_easyHID.h"          // Descriptores HID del proyecto.
#include <USB.c>                         // Funciones del USB.

// Usamos fast_io, en los puertos B
#use fast_io(b)

void USB_debug(){

    //No puse ningun led en el circuito para ver si inicio todo bien :/
    usb_wait_for_enumeration(); // Espera a ser enumerado por el host.

}

void config_adcon2(void) {
   #asm
   movlw 0b10111110
   iorwf 0xFC0,1   
   #endasm
}
   
//===========================================================================================================



void main(void)                                                         // Función Principal.
{
    // Variables globales.

    int8    recibe[USB_EP1_RX_SIZE];                                    // Declaramos la variable recibe de 32 bytes.
    int8    envia[USB_EP1_TX_SIZE];                                     // Declaramos la variable envía  de 32 bytes.
    int8    valorPWM1_H=0;                                              // Valor del semiperiodo alto del PWM1.
    int8    MotorR=0;
    int8    Estado[2];
    int16   Vueltas[2];
    int16   Recorrido[2];
    int8    Paso[2];
    const int8 PasosMotor[8] = {0, 3, 2, 1, 4, 7, 6, 5}; //Los pines que se deben activar con los pasos de los 2 motores
    // Configuraciones varias.

    set_tris_b(0xF0);                                                   // Nibble bajo salidas, el alto entradas.
    output_b(0x00);                                                     // Inicializamos las salidas a 0.


    setup_adc_ports(AN0_TO_AN2);                                        // Configura canales usados por el ADC.
    setup_adc(ADC_CLOCK_DIV_64);                                        // Asigna la velocidad: relog\64.
    config_ADCON2();                                                    // Configuramos el ADCON2.

    usb_init();                                                         // Inicializamos el stack USB.

    usb_task();                                                         // Habilita el periferico usb y las interrupciones.
    USB_debug();                                                        // Nos muestra el estado de conección del USB.                                                       

    Vueltas[0]=0;
    Vueltas[1]=0;
    Paso[0]=0;
    Paso[1]=1;

    while (TRUE)                                                        // Bucle infinito.
    {
        if(usb_enumerated())                                            // Si el dispositivo está configurado...
        {

            usb_put_packet(1, envia, USB_CONFIG_HID_TX_SIZE, USB_DTS_TOGGLE);      // Enviamos el paquete de datos por USB.

            if (usb_kbhit(1))                                           // Si hay un paquete de datos del host.. en el buffer lo tomamos y guardamos en la variable data.
            {
                usb_get_packet(1, recibe, USB_CONFIG_HID_RX_SIZE);      // En el buffer lo tomamos del EP1 y lo guardamos en la variable recibe....

                MotorR=(recibe[1]==MOTOR1 ? 0 : 1);

                if (recibe[0]==SUBIR) {  // Si recibe comando de control de salidas...
                  Estado[MotorR] = 1;
                  Recorrido[MotorR] = recibe[2] * 256 + recibe[3]; //Genero un int16
                } else if (recibe[0]==BAJAR) {
                  Estado[(MotorR] = 2;
                  Recorrido[MotorR] = recibe[2] * 256 + recibe[3]; //Genero un int16
                } else if (recibe[0]==PARAR) {
                  Estado[MotorR] = 0;
                }

            }

            for (MotorR=0; MotorR<2; MotorR++) {
               if (Estado[MotorR] > 0) { //Si no es 0 se tiene que mover
                  if (Estado[MotorR]==1) {
                     if (Vueltas[MotorR] >= Recorrido[MotorR]) {
                        Estado[MotorR]=0;
                     } else {
                        Vueltas[MotorR]++;
                     }
                  } else if (Estado[MotorR]==2) {
                     if (Vueltas[MotorR] <= 0) {
                        Estado[MotorR]=0;
                     } else {
                        Vueltas[MotorR]--;
                     }
                  }
                  Paso[MotorR]=Vueltas[MotorR] % 4;

                  switch(MotorPasos[MotorR * 4 + Paso[MotorR]]) {
                     case 0 : output_high(PIN_B0); break;
                     case 1 : output_high(PIN_B1); break;
                     case 2 : output_high(PIN_B2); break;
                     case 3 : output_high(PIN_B3); break;
                     case 4 : output_high(PIN_B4); break;
                     case 5 : output_high(PIN_B5); break;
                     case 6 : output_high(PIN_B6); break;
                     case 7 : output_high(PIN_B7); break;
                  }
               }

            }
            delay_ms(1); //Dejo una pausa mientras este activado
            for (MotorR=0; MotorR<2; MotorR++) { //Desactivo los pines
               if (Estado[MotorR] > 0) {
                  switch(MotorPasos[MotorR * 4 + Paso[MotorR]]) {
                     case 0 : output_low(PIN_B0); break;
                     case 1 : output_low(PIN_B1); break;
                     case 2 : output_low(PIN_B2); break;
                     case 3 : output_low(PIN_B3); break;
                     case 4 : output_low(PIN_B4); break;
                     case 5 : output_low(PIN_B5); break;
                     case 6 : output_low(PIN_B6); break;
                     case 7 : output_low(PIN_B7); break;
                  }
               }
            }

        }
    }
}



Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Motores Paso a paso con PIC18F2550
« Respuesta #12 en: 25 de Mayo de 2011, 11:33:33 »
Y a exactamente a que linea seria, o sea, que es lo que hay en esa linea....


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado el_yind

  • PIC10
  • *
  • Mensajes: 8
Re: Motores Paso a paso con PIC18F2550
« Respuesta #13 en: 25 de Mayo de 2011, 11:42:54 »
Y a exactamente a que linea seria, o sea, que es lo que hay en esa linea....


Saludos!

Por ejemplo en estas 2 lineas lo tira

    int8    recibe[USB_EP1_RX_SIZE];                                    // Declaramos la variable recibe de 32 bytes.
    int8    envia[USB_EP1_TX_SIZE];                                     // Declaramos la variable envía  de 32 bytes.


aca me tira Expecting identifier set_tris_b(0xF0);

Vueltas[0]=0; aca me tira Expecting a (

Son errores medio raros..

Desconectado el_yind

  • PIC10
  • *
  • Mensajes: 8
Re: Motores Paso a paso con PIC18F2550
« Respuesta #14 en: 25 de Mayo de 2011, 12:22:56 »
Bueno reemplaze el USB_EP1_RX_SIZE y USB_EP1_TX_SIZE por 32.. y magicamente se compilo todo bien, ya genero el .hex

Ahora estaría bueno ver si puedo simular el circuito en algun programa para ver si anda bien el .hex antes de enviarlo al pic.. igual tengo que conseguir el aparatito para mandarle el firmware.