Frecuencia de señal con contadores - Resetear

  • 1 Respuestas
  • 1764 Vistas

Jose Torres

  • Aprendiz
  • **
  • Mensajes: 61
Frecuencia de señal con contadores - Resetear
« : marzo 19, 2012, 01:51:53 am »
Estimado Boris, de nuevo necesito tu ayuda. Armé un lazo de control que ya se acerca bastante al sistema real. Difiere que en lugar de excitar una válvula proporcional setea un variador de un motor trifásico que tiene en su eje un piñón de 20 dientes que son leídos por una pickup inductiva.

El setpoint (sp) se fija con un pote de 5 V, el feedback (fb) se toma de la pickup, y la señal de control del variador (salida) sale por la salida analógica AO1. Las tres variables trabajan dentro del mismo rango. Para simular las perturbaciones del entorno coloqué un pote en serie con la señal de AO1.

Lo probé y anda fenómeno, simulando perturbaciones en más y en menos, la velocidad del motor se mantiene constante. Donde tengo problemas es al perder la señal de feedback desconectando la pickup.

En ese caso es imperativo que el valor de fb caiga a cero, sin embargo esa variable conserva el último valor leído y sólo vuelve a cero si se resetea el programa.

What can I do? Te envío el programita para ver si se puede hacer algo; probé por las mías pero sin suerte.

Muchas gracias.

José María

 

// Incluir libreria STX8081.

#include <stx8081.inc>

// Funcion principal.

main()
{

// Activar contador, cuenta por flanco ascendente.
Count1Enable(COUNT_EDGE_RISING)

// Crear variable para almacenar lectura de pulsos.
new fb = 0

// Crear variable para almacenar valor de salida.
new salida = 0

// Limpiar LCD.
LcdClear()


// Loop principal.
while(true)
{

   //Leer frecuencia de piñón de feedback
   fb = Count1GetEventFreq_I()

  //Leer pote para setpoint
  new Muestras[40]

  new i, sp

  for(i=0; i<40; i++)
  {
     Muestras = Vin1Read()
  }

  sp = 0

  for(i=0; i<40; i++)
  {
     sp += Muestras
  }

  sp = sp / 40

  //Afectar salida por señal de error (sp-fb)
  salida= (salida+sp-fb)

  //Presentar sp y fb
  LcdPrintf(0, 0, "Setp: %d", sp)
  LcdPrintf(0, 1, "Fback: %d", fb)

  //Enviar salda a AO1
  Vout1Write (salida)
 }
}

Boris Estudiez

  • Novato
  • *
  • Mensajes: 12
Re: Frecuencia de señal con contadores - Resetear
« Respuesta #1 : marzo 19, 2012, 01:53:24 am »
Buenas Jose,

Fijate colocar la funcion Count1Reset() luego de tomar "fb".

fb = Count1GetEventFreq_I()
Count1Reset()

Eso debería resetear los registros del contador,
que en este caso devuelve la frecuencia de los
dos últimos pulsos contados. Al resetear el contador
en cada lectura, cuando no hay pulsos, el retorno
es cero.

Otra cosa, para optimizar memoria y velocidad,
podes hacer lo siguiente para filtrar las muestras:

new i, sp   // declarar antes del while(true)

// ... codigo ...

// Filtro
sp = 0
for(i=0; i<40; i++)
{
   // Obtener 40 muestras
   sp += Vin1Read()
}

// Promediar.
sp = sp / 40


Saludos, Boris.-

--

Slicetex Electronics
www.slicetex.com.ar