Autor Tema: Contador de pulsos y PWM  (Leído 8619 veces)

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

Desconectado JebusITO

  • PIC10
  • *
  • Mensajes: 15
Re:Contador de pulsos y PWM
« Respuesta #15 en: 07 de Junio de 2017, 13:05:16 »
Bueno, les comento que ya he hecho pruebas con el carro funcional con el montaje y todo anda casi, casi bien, a excepción de que al introducir la misma frecuencia por los contadores T0CKI y T2CKI por decir 100Hz la lectura de T0CKI1  y su impresión muestra entre 98 y 103 Hz, nada mal, el problema es que T1CKI me muestra 3 veces la frecuencia cosa que no entiendo el porque, entonces, podría hacer una simple corrección matemática pero me gustaría saber el porqué sucede esto.

Gracias por su ayuda.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Contador de pulsos y PWM
« Respuesta #16 en: 07 de Junio de 2017, 14:34:06 »
Podrias poner como quedo el codigo finalmente?

Desconectado JebusITO

  • PIC10
  • *
  • Mensajes: 15
Re:Contador de pulsos y PWM
« Respuesta #17 en: 09 de Junio de 2017, 12:14:52 »
Hola de nuevo, ya estuve revisando el código y es porque tengo lo siguiente:

 setup_timer_1(T1_EXTERNAL|T1_DIV_BY_1);

aqui el timer 1 esta dividido por 1 es por eso que me toma una "frecuencia" más alta, como no se puede dividir por tres entonces al recibir el conteo con get_timer simplemente lo divido por 3 y obtengo la frecuencia real de los pulsos. Adjunto parte dle codigo ya que no esta terminado.

Código: [Seleccionar]

#INT_RDA
void  RDA_isr(void)
{
   k = getc();   
   if(k != 0x0D)
      {
      // Aca todavia no esta completo y siguen llegando valores
      RX_Buffer[i] = k;
      i++;
      // Proteccion de que no supere los 5 lugares que posee el array RX_Buffer (Recordando de dejar uno al ultimo siempre, por eso 4)
      if(i >= 4)
         {
            i=0;
         }
      }
      else
      {
      // Aca se completo, por que recibimos el 0x00
      RX_Buffer[i] = '\0'; //Termino el string ya se habia pre-incrementado antes la i
 
      // Aca convierto a entero
      numero = atol(RX_Buffer);     
      if(numero >=255)
         {
         // Termino de hacer lo que necesite
         //if(numero==255
         numero = numero-255;
         set_pwm1_duty(numero);       
         }
      else
         // Termino de hacer lo que necesite
         set_pwm2_duty(numero);     
      }
}

#INT_TIMER2
void  TIMER2_isr(void)
   {     
      if (contador >=500)
         {       
         a=get_timer0();
         b=(get_timer1())/3;                    //CONT Pulsos       
         set_timer0(0); 
         set_timer1(0);     
         contador=0;
         }
         contador++;
   }

void main()
{   
   //    Configuracioin de los temporizadores y contadores
   setup_timer_0(RTCC_EXT_L_TO_H|RTCC_DIV_1|RTCC_8_bit);      //65,5 ms overflow
   setup_timer_1(T1_EXTERNAL|T1_DIV_BY_1);      //65,5 ms overflow
   setup_timer_2(T2_DIV_BY_16,255,16);      //50,0 ms overflow
   //setup_timer_2(T2_DIV_BY_16,195,16);      //50,0 ms overflow
   
   //    Inicializamos los timers en 0
   set_timer0(0);
   set_timer1(0);
   set_TIMER2(0);
   
   //    Habilitamos las interrupciones
   enable_interrupts(INT_RDA);
   enable_interrupts(INT_TIMER2);
   enable_interrupts(GLOBAL);
   
   //    Habilitamos los PWM
   setup_ccp1(CCP_PWM);
   setup_ccp2(CCP_PWM);
   set_pwm1_duty(pwm1);
   set_pwm2_duty(pwm2);

   lcd_init();


   while(TRUE)
   { 
      printf(lcd_putc,"\f%lu Hz Freq 1",a);       //Muestra f
      printf(lcd_putc,"\n%lu Hz Freq 2",b);     
      printf("\f%lu y %lu"a,b);
      delay_ms(250);     
   }
}


ahora en la prueba con el carro tengo problemas con Visual Basic :( uso el siguiente codigo pero no me inicia ningun motor :(

Código: [Seleccionar]
    Dim enviar As String
    Dim port_a As String

Public Sub escribir()
        'se declara este boton como public para poder acceder a él desde otros formularios.
        If Button3.Enabled = True Then
            enviar = TextBox1.Text
            SerialPort1.Write(enviar)
            TextBox1.Text = ""
        Else
            SerialPort1.Write(porta)
        End If
    End Sub
End Class

Pero no me reacciona el pic, tendre que buscar ayuda en visual,  :( y si no ha hacer un switch case de 500 opciones! jajajajaaj
« Última modificación: 09 de Junio de 2017, 12:46:01 por JebusITO »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Contador de pulsos y PWM
« Respuesta #18 en: 09 de Junio de 2017, 14:28:26 »
Ahh pero encontraste cual era el problema, enviaselo y que la PC sea quien lo divida

Respeto a VB no te podria ayudar. Seguramente espera que lo que le envies este en ASCII.
« Última modificación: 09 de Junio de 2017, 15:10:25 por KILLERJC »

Desconectado JebusITO

  • PIC10
  • *
  • Mensajes: 15
Re:Contador de pulsos y PWM
« Respuesta #19 en: 09 de Junio de 2017, 19:36:58 »
hola de nuevo, implementando ya las correcciones mencionadas y una que otra mejora, tengo el siguiente problema que es como de electrónica como tal

si envío un PWM de 40 a ambos motores en teoria debería obtener una frecuencia similar en ambos pero no es asi, resulta que me muestra  lo siguiente:

70 Freq 1
182 Freq 2

bueno, dije depronto es porque falle en algun calculo pero al enviar 250 de PWM a ambos o al de la frequiencia 2 obtengo:

107 Freq 1
293 Freq 2

hasta ahi uno dice Funciona! pero si dejo el PWM del motor 2 al max y el de el motor 1 a 0 obtengo:

113 Freq 1
7 Freq 2  :shock: :shock: :shock: :shock:

Intente colocar una resistencia pull-up y pull down  :D pero  ninguno de los dos funcionó :(

parece que interfieren las frecuencias entre las entradas :( no se que pueda ser :(

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Q
« Respuesta #20 en: 09 de Junio de 2017, 22:23:06 »
Puede ser un mal pulso que lo cuente doble pero no creo que ese sea el problema.

El que vos pongas el mismo PWM en ambos motores no significa que los motores vayan a la misma velocidad. La velocidad del motor va a depender de la carga que poseen estos.
Por eso mismo al comienzo te dije que seria "ideal" que proveas un PID para el motor y que se autoregule solo para que la velocidad (pulsos de entrada) sea igual en ambos. Y que tu PC solo envie el porcentaje de velocidad.
Vos me disjiste que eso lo iba a hacer la PC. Entonces Si la PC ve que los pulsos de entrada son altos entonces debera disminuir el PWM de ese motor para igualarlos, asi ambos poseen la misma velocidad.

Ahora si ambos estan a la misma velocidad y aun asi son distintos, algun problema hay.
« Última modificación: 09 de Junio de 2017, 22:46:00 por KILLERJC »


 

anything