Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 09-07-2007
emeceuy emeceuy is offline
Miembro
 
Registrado: jun 2003
Ubicación: Uruguay
Posts: 122
Poder: 21
emeceuy Va por buen camino
PWM con puerto paralelo...

Hola a todos, les cuento un poco el tema... he hecho hace unos años un control para un motor utilizando Delphi, y modulando PWM através del puerto paralelo del PC, pero en ese entonces hice algo que funcionaba pero es "desprolijo" y me gustaría mejorarlo pero no se como...

Lo que hice fue un timer de 50ms (que creo que es lo minimo que funciona), que lanzaba un evento con un bucle de 5 o 6 mil vueltas en el que modulaba y tomaba el dato de velocidad del motor... cuando el bucle terminaba el timer volvía a hacer que el programa entre nuevamente en el... porque de esta manera? porque fue la unica forma que encontré de poder variar parametros, por ejemplo el Dutty Cycle del PWM, o detener el motor... ya que si hubiera optado por simplemente hacer un bucle más grande (sin el timer), mientras se ejecuta no puedo cambiar nada, en cambio, de la forma como lo hice (con el timer que ejecuta el bucle) si puedo variar parametros, o detener el motor si quiero.

Esto funciona, no es muy prolijo porque se sienten vibraciones o golpecitos en el motor (no es un giro parejo), creo que es producto de la salida del bucle, timer y entrada nuevamente al bucle... No se me ocurre nada para hacerlo más elegantemente, y que se pueda ver la salida de la PC en un osciloscopio, ya que de esta manera es imposible...

PD: probé hacer un bucle enorme, y la salida es preciosa, pero no me sirve no poder variar parametros...

a alguien se le ocurre algo???

muchisimas gracias a todos desde ya
__________________
Marcelo C.
Responder Con Cita
  #2  
Antiguo 09-07-2007
Avatar de cHackAll
[cHackAll] cHackAll is offline
Baneado?
 
Registrado: oct 2006
Posts: 2.159
Poder: 20
cHackAll Va por buen camino
Cita:
Empezado por emeceuy
...un control para un motor... ...modulando PWM através del puerto paralelo del PC... ...lanzaba un evento con un bucle de 5 o 6 mil vueltas en el que modulaba y tomaba el dato de velocidad del motor... cuando el bucle terminaba el timer volvía a hacer que el programa entre nuevamente en el... ...por ejemplo el Dutty Cycle del PWM, o detener el motor...
Creo que no tengo los suficientes conocimientos en electronica ni de motores paso a paso para entender el asunto, sin duda que no es nada del "otro mundo", pero para hacerlo mas facil para ti y para nosotros, te aconsejaría que nos comentes que quisieras concretamente y que nos cueles en un post un trozo del código que quieres optimizar...

Saludos!
Responder Con Cita
  #3  
Antiguo 09-07-2007
emeceuy emeceuy is offline
Miembro
 
Registrado: jun 2003
Ubicación: Uruguay
Posts: 122
Poder: 21
emeceuy Va por buen camino
es cierto, porque supongo que quedó entreverado y no expliqué mucho el tema electronico...

PWM es PULSE WIDTH MODULATION, que consta en un ciclo de por ejemplo 1000 (pulsos de reloj, por ejemplo) de los cuales se define el tiempo de encendido y el tiempo de apagado. Si por ejemplo lo conecto al motor con un ciclo de trabajo de 50%, la salida estará 500 pulsos encendida y 500 pulsos apagado, y así sucesivamente... de ésta manera se puede variar la velocidad del motor, ya que como todo esto es muy rapido, no se nota que es discreto, sino que por la propia inercia del motor (y porque además el motor es un filtro) se ve como continuo...

Acá dejo un esquema del codigo, donde pro_MOTORMARCHA es el procedimiento que cuenta los pulsos y manda la salida a 1 o 0 segun el ancho de pulso que yo elija...

Otra manera fácil de explicar lo que quiero hacer, es poder sacar por una patita del puerto paralelo una frecuencia que yo pueda definir el ciclo de trabajo...

Código Delphi [-]
procedure Tfrm_principal.tmr_timerTimer(Sender: TObject);
begin
   if rgp_actitud.ItemIndex=1 then
      begin
         // procedimiento que envia datos al paralelo para detener el motor
         pro_MOTORDETENIDO;
      end
   else
       begin
          for var_loop:=1 to 8000 do
             begin
                // procedimiento que envia datos al paralelo para que funcione
                pro_MOTORMARCHA(ancho_de_pulso)
             end;
       end;
end;
__________________
Marcelo C.
Responder Con Cita
  #4  
Antiguo 09-07-2007
Avatar de cHackAll
[cHackAll] cHackAll is offline
Baneado?
 
Registrado: oct 2006
Posts: 2.159
Poder: 20
cHackAll Va por buen camino
Cool Entiendo?

Creo que el problema (como dijiste), es simplemente la estética de tu código, y la imposibilidad de agregar funcionalidades al programa o me equivoco?

En tal caso te aconsejo usar Hilos, y Mutex... los hilos te permitiran realizar operaciones que no afectaran a la GUI y serán algo mas controlables que el Timer. el Mutex te permitirá sincronizar los comandos que usas.

Por ejemplo:

Código Delphi [-]
function MoverMotor(ancho_de_pulso: Cardinal): Cardinal; stdcall;
begin
 Result := 8000;
 repeat Dec(Result);
  pro_MOTORMARCHA(ancho_de_pulso)
 until (Result = 0) or Application.Terminated;
end;
 
...
 
procedure TForm1.Button1Click(Sender: TObject);
var Dummy: Cardinal;
begin
 CreateThread(nil, 0, @MoverMotor,  Pointer(StrToInt(Edit1.Text)), 0, Dummy); // Donde Edit1 contiene el "ancho de los pulsos"
end;

Continuo?
Responder Con Cita
  #5  
Antiguo 10-07-2007
emeceuy emeceuy is offline
Miembro
 
Registrado: jun 2003
Ubicación: Uruguay
Posts: 122
Poder: 21
emeceuy Va por buen camino
ahh me habían hablado de algo así, de hilos... que eso podía ser más prolijo... no se si eso soluciona el tema que emita una frecuencia constante y que se pueda analizar en el osciloscopio...

ya me tengo que ir, el miercoles lo pruebo y aviso que tal funciono !

saludos y muchas gracias
__________________
Marcelo C.
Responder Con Cita
  #6  
Antiguo 19-07-2007
emeceuy emeceuy is offline
Miembro
 
Registrado: jun 2003
Ubicación: Uruguay
Posts: 122
Poder: 21
emeceuy Va por buen camino
voy a poner un hilo que se llama "bucle infinito" porque creo que es por ahi que viene el asunto...
__________________
Marcelo C.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Puerto paralelo bactering Varios 8 15-09-2011 07:55:09
Puerto paralelo en C Chase C++ Builder 0 04-07-2005 12:29:37
Puerto Paralelo jorge Lazarus, FreePascal, Kylix, etc. 1 20-04-2005 03:25:42
Puerto Paralelo solovaer Impresión 0 08-03-2005 02:54:54


La franja horaria es GMT +2. Ahora son las 02:47:26.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi