Autor Tema: Ayuda programa en C para controlar velocidad de 2 motores CC  (Leído 6448 veces)

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

Desconectado pnej

  • PIC10
  • *
  • Mensajes: 4
Ayuda programa en C para controlar velocidad de 2 motores CC
« en: 26 de Mayo de 2009, 13:17:04 »
Hola,
Tengo el siguiente programa para controlar mediante sensores dos motores CC y estaba interesado en realizar los giros de otra forma, me explico en la actualidad los giros lo hace parando un motor y haciendo funcionar el opuesto, o sea para girar a la izquierda paro el motor izq, y dejo activo el derecho, lo que busco (creo que se hace con el PWM) es poder hacer el giro de la siguiente manera motor izquierdo al 75% y el derecho al 100%. He estado mirando y ensayando lo que he ido encontrando por el foro pero el resultado ha sido negativo. La verdad es que mis conocimientos son muy limitados tanto en programación como en funcionamiento de los PIC.

El codigo que tengo es:

#include "16f722.h"
#use delay(clock=16000000)

//Motores
#bit MotIzqEnable = PORTC.1
#bit MotIzqIn1 = PORTC.0
#bit MotIzqIn2 = PORTC.3
#bit MotDerEnable = PORTC.2
#bit MotDerIn1 = PORTC.5
#bit MotDerIn2 = PORTC.4

//Sensores

#bit SnsCentIzq = PORTA.2 //sensor central izquierdo
#bit SnsCentDcho = PORTA.1 //sensor central derecho


//Colores
#define Fondo 0
#define Pista 1

//Configura el microcontrolador
inline void Config() {
   ANSELA=0; //desactiva entradas analogicas
   TRISA = 0xFF; //todos los bits del PORTA como entradas
   TRISC = 0b11000000;
   OSCCON = 0b00110000; //oscilador interno a 16MHz
}
//Movimiento en linea recta hacia delante
void Avanzar(){
   ...........
.........
}



//Girar hacia la derecha
void GirarDcha(){
MotDerEnable=1; // deteccion total del motor derecho
   MotDerIn1=0;
   MotDerIn2=0;
//motor izquierdo al 100%
   MotIzqEnable=1;
   MotIzqIn1=1;
   MotIzqIn2=0;
}

//Girar hacia la izquierda
void GirarIzq(){
   MotIzqEnable=1; //deteccion total del motor izquierdo
   MotIzqIn1=0;
   MotIzqIn2=0;
//motor derecho al 100%
   MotDerEnable=1;
   MotDerIn1=1;
   MotDerIn2=0;
}



//Se detiene completamente
void Detener(){
   .......
.........
}

void main(){
   Config();

   while(1){
      if(SnsCentIzq==Pista && SnsCentDcho==Pista) Avanzar();
      //else if(SnsCentIzq==Fondo && SnsCentDcho==Fondo) Detener();
      else if(SnsCentIzq==Fondo) GirarDcha();
      else if(SnsCentDcho==Fondo) GirarIzq();
   }
}


Os agradezco de antemano la ayuda.
Saludos.

Desconectado pnej

  • PIC10
  • *
  • Mensajes: 4
Re: Ayuda programa en C para controlar velocidad de 2 motores CC
« Respuesta #1 en: 01 de Junio de 2009, 14:50:21 »
SOCOOOOOOOOOOOORRRO!!!

Nadie me puede ayudar???.

Desconectado J_jOsE

  • PIC12
  • **
  • Mensajes: 57
Re: Ayuda programa en C para controlar velocidad de 2 motores CC
« Respuesta #2 en: 01 de Junio de 2009, 16:31:18 »
hola pnej

como que no se entiende :?:
quieres controlar dos motores cc (controlar la velocidad), según a que giran los motores, con que sensores piensas controlarlos :?:

explicalo con mas claridad y vamos a solucionarlo :)

salu_2 a to_2
No Pain No Gain

Desconectado pnej

  • PIC10
  • *
  • Mensajes: 4
Re: Ayuda programa en C para controlar velocidad de 2 motores CC
« Respuesta #3 en: 01 de Junio de 2009, 17:33:09 »
El tema es el siguiente:
Con el programa segun está hace lo siguiente en funcion de los dos sensores.
Si el sensor SnsCentIzq=1 y el SnsCentDcho=1)  Avanzan los dos motores con la misma velocidad (en este caso no me interesaria hacer PWM ya que sería una salida a 1 de los pines MotDerEnable y MotIzqEnable, pines del driver L293).
Si el SnsCentIzq=0  y el  SnsCentDcho=0) Detengo los dos motores o lo que es lo mismo salida a 0 para los pines  MotDerEnable y MotIzqEnable
       Si el SnsCentIzq=0 (el otro es un 1) GirarDcha() y si SnsCentDcho==Fondo) GirarIzq(), en estos dos casos lo que hago es parar uno de los motores y dejar el otro girando, lo que busco es poder hacer este giro sin necesidad de parar el motor sino pudiendo controlar la velocidad del mismo, si uno gira al 100% y el otro al 75% pues se produce un giro.

ESpero haberme expresado bien.
Saludos y gracias.

Desconectado J_jOsE

  • PIC12
  • **
  • Mensajes: 57
Re: Ayuda programa en C para controlar velocidad de 2 motores CC
« Respuesta #4 en: 02 de Junio de 2009, 11:29:11 »
hola

aca tengo un ejemplo en CCS

para el PWM revisa:

http://www.micro-examples.com/public/microex-navig/doc/097-pwm-calculator

es una calculadora para pwm

espero que el ejemplo te sirva

salu_2  a to_2

PD: que simulador estas usando, porque quise simular en ISIS proteus 7.4 y no hay el pic
No Pain No Gain

Desconectado jhonjz

  • PIC10
  • *
  • Mensajes: 19
Re: Ayuda programa en C para controlar velocidad de 2 motores CC
« Respuesta #5 en: 03 de Noviembre de 2013, 18:03:42 »
Hola, aprovecho este tema del compañero para generar una nueva duda.

 Me encuentro realizando un proyecto en lenguaje C como hobbie, se trata de realizar un carrito a control remoto, ya realicé uno pero ese fué solo secuencial; ahora me encuentro realizando otro que se mueva cada vez que mantenga presionado un botón, ya tengo una parte programada y funciona a la perfección, solo tengo problema en lo siguiente, pero primero les comentaré que llevo para que tengan una idea: dispongo de 4 pulsadores, A, B, C y D. Cuando mantenga presionado el pulsador A, el carrito debe avanzar, de lo contrario no, Cuano mantenga pulsado B, el carrito debe retroceder, de lo contrario no, para esta parte utilizo el integrado de un puente H L293d que me permite invertir el giro de los motores, Ah, lo olividaba, estoy usando dos motores. Ahora sí paso a contarles el problema: cuando quiera presionar C, uno de los motores debe activarse mientras que el otro no, pero cuando voy a simular esta parte las anteriores acciones se bloquean, no sé a qué se debe. Paso a continuación el código en C para que le hechen un vistazo. Por si quieren ver también la simulación les envío el archivo DSN y el .C del código, solo denle descomprimir.


#include "F:\Users\Home\Desktop\Prueba Pulsador\Pulsador.h"
#byte LEDS=0x07//CONFIGURO TODO EL BYTE PARA LOS LEDS EN EL PUERTO C
#byte MOTORES=0x08//CONFIGURO TODO EL BYTE PARA LOS MOTORES EN EL PUERTO D

#bit led_amarillo_1=0x07.0//PARA CONECTAR UN SOLO LED EN EL PIN RC7.0
#bit led_amarillo_2=0x07.1//PARA CONECTAR UN SOLO LED EN EL PIN RC7.1
#bit led_rojo_1=0x07.2//PARA CONECTAR UN SOLO LED EN EL PIN RC7.2
#bit led_rojo_2=0x07.3//PARA CONECTAR UN SOLO LED EN EL PIN RC7.3
#bit pulsador_A=0x05.0//PARA CONECTAR EL PULSADOR A EN EL PIN RA0
#bit pulsador_B=0x05.1//PARA CONECTAR EL PULSADOR B EN EL PIN RA1
#bit pulsador_C=0x05.2//PARA CONECTAR EL PULSADOR C EN EL PIN RA2
#bit pulsador_D=0x05.3//PARA CONECTAR EL PULSADOR D EN EL PIN RA3
#bit MOTOR1_DER=0x08.0//PARA CONECTAR UN MOTOR DE GIRO DERECHA EN EL PIN RD0
#bit MOTOR1_IZQ=0x08.1//PARA CONECTAR UN MOTOR DE GIRO IZQUIERDA EN EL PIN RD1

#bit MOTOR2_DER=0x08.2//PARA CONECTAR UN MOTOR DE GIRO DERECHA EN EL PIN RD2
#bit MOTOR2_IZQ=0x08.3//PARA CONECTAR UN MOTOR DE GIRO IZQUIERDA EN EL PIN RD3

#byte tris_led=0x87//PARA DECIRLE SI VA A HACER ENTRADA O SALIDA LOS LED
#byte tris_pulsador=0x85//PARA DECIRLE SI VA A HACER ENTRADA O SALIDA LOS PULSADORES
#byte tris_motores=0x88//PARA DECIRLE SI VA A HACER ENTRADA O SALIDA LOS MOTORES
#byte tris_pulsadorc=0X86

void main()
{
tris_pulsador=0b11111111;//CONFIGURO LOS PULSADORES COMO ENTRADAS
tris_led=0b11110000;//CONFIGURO LOS LED COMO SALIDAS
tris_motores=0b11110000;//CONFIGURO LOS MOTORES COMO SALIDAS
leds=0x00;//COMIENZAN LOS LEDS APAGADOS
motores=0x00;//COMIENZAN LOS MOTORES APAGADOS

while(1)
{
if(pulsador_A==1)//SI PULSADOR A SE MANTIENE PRESIONADO
{
 led_amarillo_1=1;//SE ENCIENDEN LOS LEDS, AUNQUE SE ENCIENDEN REALMENTE DESDE QUE SE ALIMENTA EL PIC
 led_amarillo_2=1;
 MOTOR1_DER=1;//LOS MOTORES 1 Y 2 DERECHA SE ACTIVAN
 MOTOR2_DER=1;
}
else//DE LO CONTRARIO, SI NO SE MANTIENE PRESIONADO A
{
 led_amarillo_1=1;//LOS LEDS IGUAL CONTINUAN PRENDIDOS
 led_amarillo_2=1;
 MOTOR1_DER=0;//LOS MOTORES EN CAMBIO DEBEN DESACTIVARSE
 MOTOR2_DER=0;
}
if(pulsador_B==1)//SI SE MANTIENE PRESIONADO B
{
 led_rojo_1=1;//CONTINUAN LOS LEDS ENCENDIDOS
 led_rojo_2=1;//LOS MOTORES  Y 2 IZQUIERDA SE ACTIVAN PARA QUE EL CARRITO RETROCEDA
 MOTOR1_IZQ=1;
 MOTOR2_IZQ=1;
}
else//DE LO CONTRARIO, SI NO SE MANTIENE PRESIONADO B
{
 led_rojo_1=1;
 led_rojo_2=1;
 MOTOR1_IZQ=0;//LOS MOTORES 1 Y 2 IZQUIERDA SE DESACTIVAN
 MOTOR2_IZQ=0;
 
}
if(pulsador_C==1)//AQUÍ ES DONDE QUIERO QUE AL PRESIONAR C, EL MOTOR 1 DERECHA SE ACTIVE SOLAMENTE
{

}
else
{

}
}
}







Desconectado ajrob

  • PIC10
  • *
  • Mensajes: 8
Re: Ayuda programa en C para controlar velocidad de 2 motores CC
« Respuesta #6 en: 09 de Noviembre de 2013, 08:47:38 »
Hola,te adjunto parte de un programilla que hice hace tiempo con rs232 para controlar la velocidad y el sentido de un motor dc,al 50% y 100% de velocidad y seleccionar giro izq o dcha.


 printf(" Parada   \n\r"); // pulsar "s" para parada del motor
   printf("- - - - - - - - - - - - - - -\n\r");
   printf("[1] Velocidad 1 \n\r");//pulsar 1 para 1a velocidad
   printf("[2] Velocidad 2\n\r"); // pulsar 2 para 2a velocidad
   printf("- - - - - - - - - - - - - - -\n\r");
   printf("[3] giro izquierda \n\r"); //pulsa 3 para cambio de sentido
   printf("[4] giro derecha \n\r\r"); //pulsa 4 para derecha
   
   do
   {
       
      d = getchar();  //Adquiere un caracter mediante rs232
      switch(d) // Ajuste de velocidad
      {
        case 's':  //Parada
        {
          output_bit(PIN_C0,0);
          output_bit(PIN_C1,0);
          set_pwm1_duty(0);
         
           
        }
           break;
         
        case '1':  // 50%
        {
          set_pwm1_duty(128);
         
        }
               break;
             
             
         case '2':  //100%
         {   
          set_pwm1_duty(255);
         
         }
                     
           break;
                         
          case '3':  // cambio sentido izquierda
         { 
          output_bit(PIN_C0,0);
          output_bit(PIN_C1,1);     
         
         }
          break;
                               
          case '4':  // cambio sentido derecha
           {
            output_bit(PIN_C1,0);
            output_bit(PIN_C0,1);
       
            }
             break;



en el caso que quieras solo un sentido pones x ejemplo,para la derecha y 50%-->

output_bit(PIN_C1,0);
output_bit(PIN_C0,1);
set_pwm1_duty(128);


y para 100% lo mismo pero "set_pwm1_duty(255);"

Espero que te sirva de algo.Un saludo


 

anything