PDA

Ver la Versión Completa : PWM con puerto paralelo...


emeceuy
09-07-2007, 18:46:41
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 :)

cHackAll
09-07-2007, 19:11:38
...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, :o 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!

emeceuy
09-07-2007, 19:22:55
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...

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;

cHackAll
09-07-2007, 20:19:55
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:


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?

emeceuy
10-07-2007, 00:52:41
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

emeceuy
19-07-2007, 20:30:23
voy a poner un hilo que se llama "bucle infinito" porque creo que es por ahi que viene el asunto...