Control de Velocidad (PWM) utilizando el Pic184550 y puente H

Hola Buenas tardes! tengo una duda! Estoy haciendo un control de velocidad, para un carrito, y para ello estoy utilizando optoacopaldores, lo cuales manda pulsos al PIC, y el pic manda señales al puente H.
La duda es que al conectar todo fisicamente, solo me gira un motor! :unsure:
Mi profesor me ha dicho, que esta mal mi porgrmacion.
ESPERO ME PUEDAN AYUDAR, de antemano GRACIAS!

Código:
//// HEADER
#Include <18F4550.h>
#fuses Hs,noprotect,NOWDT
#use delay (Crystal= 20 MHz)
#use rs232(baud=9600,xmit=pin_c6,rcv=pin_c7,uart1)


////DEFINICIONES
int16 izq,der;
float v_izq,d_izq,v_der,d_der,d_izq_ant,d_der_ant,vel_izq,vel_der,error_izq,error_der;
float vel_deseada=30.5;
  
#INT_EXT
void int_ext_isr()
   {
   izq++;
   }
#INT_EXT1
void int_ext1_isr()
   {
   der++;
   }



////CUERPO
void main()
{
   output_d(0x50);
   
   ext_int_edge(0,H_to_l);
   ext_int_edge(1,h_to_l);
   enable_interrupts(INT_EXT);
   enable_interrupts(INT_EXT1);
   enable_interrupts(global); 
   izq=0;
   der=0;
   
   setup_timer_2(t2_div_by_4,249,1);
   setup_ccp1(ccp_PWM);
   setup_ccp2(ccp_PWM);
   set_pwm1_duty(0);
   set_pwm2_duty(0);//1023 lo maximo que acepta el PWM y el valor minimo es de 0 
   
   while(true)
   {
      v_izq=izq*0.05;
      d_izq=19.47*v_izq;
      v_der=der*0.05;
      d_der=19.47*v_der;
      
      vel_izq=(d_izq-d_izq_ant)*5.0;
      vel_der=(d_der-d_der_ant)*5.0;
      error_izq=vel_deseada-vel_izq;
      error_der=vel_deseada-vel_der;
   
      if(error_izq>=1023)
      {
         error_izq=1023;
      }
      if(error_izq<=0)
      {
         error_izq=0;
      }   
      if(error_der>=1023)
      {
         error_der=1023;
      }
       if(error_der<=0)
      {
         error_der=0;
      }   
      set_pwm1_duty(error_izq);
      set_pwm2_duty(error_der);
       
      PRINTF ("IZQ=%LU   DER=%LU\n\r",izq,der);
      PRINTF("Vuelta_IZQ=%2.2F Vuelta _DER=%2.2F\n\r",v_izq,v_der);
      PRINTF ("Distancia_IZQ=%2.2F Distancia_DER=%2.2F\n\r",d_izq,d_der);
      PRINTF ("Velocidad_IZQ=%2.2F Velocidad_DER=%2.2F\n\r",vel_izq,vel_der);
      PRINTF ("Error_DER=%2.2F Error_IZQ=%2.2F\n\r",error_izq,error_der);
      
      d_izq_ant=d_izq;
      d_der_ant=d_der;
     
              
      delay_ms(200);

   }
}
 

Adjuntos

  • Control de Velocidad.txt
    1.9 KB · Visitas: 7
Última edición por un moderador:
Hola Buenas tardes! tengo una duda! Estoy haciendo un control de velocidad, para un carrito, y para ello estoy utilizando optoacopaldores, lo cuales manda pulsos al PIC, y el pic manda señales al puente H.
La duda es que al conectar todo fisicamente, solo me gira un motor! :unsure:
Mi profesor me ha dicho, que esta mal mi porgrmacion.
ESPERO ME PUEDAN AYUDAR, de antemano GRACIAS!


:confused: :confused: :confused:

¿ Que opinas sobre describir que se supone que haga tu programa ? :rolleyes:

Reglas generales de uso del foro

05) Escribe de manera correcta y legible para todos. Estás en un Foro no en un Chat. Esto incluye emplear signos de puntuación e interrogación, (Por ejemplo "Punto y Aparte, signos de interrogación, Etc"), comenzar un renglón nuevo con mayúscula, Etc. No nos gusta la escritura "En Bloque"
 
Última edición:
Los 200ms son necesarios por que definen el periodo de muestreo del controlador proporcional discreto que ha codificado el chico.
El inconveniente es el bloqueo de las interrupciones durante el delay pero no se si eso la causa del problema, por que fallaria para ambos lados y no solo uno...
Para empezar, que le quite los chotocientos printf que le ha puesto.... se supone que es un sistema Real Time...

De todas formas, si tiene que mandar info por la puerta serie mas le vale que rediseñe el algoritmo de muestreo para basarlo en la interrupcion de un timer y no hacer la cochinada esa del delay.

Me embola que intenten enseñar programación de algoritmos de tiempo real y no tengan NPI como gestionar las restricciones temporales del sistema.... claro... total, programar es fácil... hasta un tonto programa... y estos son los resultados...
Y ya engrané de nuevo...
 
Última edición:
tampoco insulten al compañero aunque aveces hay motivos

pero hay otra alternativa a la que si soy partidario del delay

hay una manera de usar delay para hacer un printf cada no se digamos medio segundo 500ms
ejemplo:

while(1)
{

//todo lo que tengo que hacer
//codigo


if(contador>=500)
{

// todos mis printf que tengo que hacer
//codigo que debo ejecutar cada 500ms
contador=0;
}

contador++;
delay_ms(1);
}


y asi se evita uno de escribir un delay de 500us

claro que podemos usar un delay de 20us solo que hay que hacer un if que pregunte la convercion

es muy facil ;)
 
Estoy de acuerdo con Fogonazo, podrías ser más claro en la explicación del programa, sería conveniente escribir más comentarios en las líneas de código para saber exactamente que pretendes hacer y que estás haciendo en realidad. Podrías también agregar un esquemático del circuito que tienes armado para comprender mejor el funcionamiento :):).
 
tampoco exageren no es un programa hiper complejo, es muy simple, el 18f4550 solo tiene 2 CCP

algo que si le falta es administrar el DELAY

y usar 4 bits para manejar izq ,der de motor 1 e izq y der de motor 2


al compañero se le olvido que el l293 , sn75441one o l298 tienen 4 bits para manejar los motores y 2 enable donde va el PWM
 
Yo me la agarré con el docente, no con el chico!!!
El problema con los printf es que normalmente dehabilitan las interrupciones y son lentos en formatear la info. Si hay 200ms para desperdiciar, es ahi donde hay que aprovechar para llamarlos, si fuera necesario.
Eso de mezclar los printf con los delay es peor aun, por hay que medir el tiempo de cada instruccion y ajustar los delay para que toda la bola cumpla con los 200ms... y eso varia con la fcia de reloj... hummmmm... en verdad es MUY MALA idea...

Los sistemas RT requieren DISEÑO y no funciona escribirlos haciendo experimentos raros.
 
Corolario: interrupciones y más interrupciones
Ni un delay más.

Se pone una interrupción cada 200ms y ahí dentro se hace lo que sea necesario. En el cuerpo principal una carretilla de printf etc despreocupadamente.
 
Última edición:
Al de software es evidente que le afecta. Bueno, con una técnica muy muy fina de programación se podría hacer de forma que según que printf o que se haga en cada caso se recalcule el dalay adecuado que contrareste cada vez para que sea constante. Factible pero una innecesaria complicación
Al de hardware no debería.

Parece que por encabezonarse en no querer aprender a programar el hardware que lleva el microprocesador, que para algo está, somos capaces de complicarnos mil veces mas la programación.
El uso de interrupciones, timers, pwm, spi etc por hardware NO COMPLICA la programación, LA SIMPLIFICA Y MUCHO.
 
Atrás
Arriba