TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: SOLOZENER en 20 de Febrero de 2008, 06:24:54
-
Hola pues soy nuevo en el foro y con ganas de aprender,he estado trabajando en un posicionador como proyecto,y elproblema en mi proyecto es que no se komo hacerle para que cuando se acerque al punto deseado baya disminuyendo su velocidad y si esta muy lejos del punto deseado su velocidad sea mayor...espero alguien me pueda ayudar por que no tengo la menor idea de como resolver este problema :( ------- gracias y un saludo :-/
-
Bienvenido solozener:
Creo que necesitas aportar más información para que se te pueda ayudar. Con posicionador ¿te refieres a un brazo robot?
Si aportas más detalles será más fácil indicarte qué tipo de sensor o qué código necesitas.
Saludos
-
Bueno primeramente gracias :-/,si la idea mas o menos seria la de realizar un brazo posicionador para poner cds en un lector ...pero como base estoy utilizando el mecanismo de la impresora para desplazarle en un eje...el problema de ke kuando yega al punto deseado yega muy fuerte y todo se balancea :D ,Un saludo
-
Yo utilizaría un encoder óptico para conocer en todo momento la posición del brazo y actuar sobre su velocidad angular en consecuencia.
Aquí http://www.dte.upct.es/personal/jsuardiaz/docencia/Sensores/Downloads/Transparencias/Tema%206.pdf tiene un documento interesante sobre este asunto
-
agradeciendo tu ayuda jfmateos2,hasta ahorita posiciono el brazo komo lo comentas con encoder como los del mouse ..pero yo creo lo ke me faya es como hacer la subrutina en ensamblador o la teoria de como podria hacer la rampa para cuando se acerque al punto deseado no yegue tan rapido :(..
he intentado con pwm pero no he conseguido asemejar un poco a una rampa :D
y como no tengo ni idea de como saver que tan lejos o cerca esta del punto que valor deberia tener el pwm no me ha funcionado :lol:
el micro con el cual estoy implementando el control es un 877
Gracias jfmateos2 por tu ayuda
-
deberías implementar un controlador PID, su error en estado estable es poco (error con respecto a la posición), y hace precisamente lo que dices (cuando su comportamiento es de primer orden), acelera cuando está lejos, y disminuye la velocidad cuando está cerca.
Creo que en el foro hay rutinas que implentan el controlador.
Saludos
P.D: Si estoy equivocado en algo me lo hacen saber, gracias.
-
¿deduzco que estás usando un servo como motor, verdad?
-
estoy usando un motor de CD sin reductora para moverlo :-/
-
Empieza por un control proporcional (P), tu señal de control es Up(%)=(Error/Banda)*100 donde el Error=Set_Point - Valor_Actual y la Banda=(x%)*Set_Point, la Banda es la distancia a partir de la cual el control comienza a trabajar hasta llegar al Set Point, a medida que te vas acercando el Set Point el Error va disminuyendo y la accion Proporcional tambien de esta manera veras que llegaras al set point de "forma suave", el x% escógelo de un valor apropiado digamos x=20 por ejemplo y parte de ahi.
El Up(%) es el porcentaje de Duty Cycle de tu señal de PWM que enviaras desde el pic.
Espero te sirva de algo y repasa bastante sobre la teoria PID.
Javicho.
-
Pues muchas gracias por las ideas,y perdon por no haber podido conectarme pero kortaron mi fon... :D
Y regresando con lo del control gracias por sus respuestas
pero javicho no me quedan claros algunos detalles
aque te refieres con "banda",y la divicion de (error/banda) la tendria que implementar con el micro???
gracias
-
Hola SOLOZENER:
Si partes de que el brazo se encuentra muy alejado del punto deseado (en tu caso la lectora de cds) entonces podrias darle al motor el 100% de ciclo util, esto es porque se supone que te encuentras a una distancia muy lejana (por exagerar) de tu punto de destino o "Set Point". Pero debe haber un punto en el cual el ciclo util debe comenzar a bajar "proporcionalmente" a la distancia que existe entre el Set Point y la posición actual del brazo.
Entonces la distancia a partir de la cual quieres que tu brazo comienze a bajar la velocidad para no llegar muy rapido al Set Point se le llama Banda Proporcional y esta banda lo debes escoger de un valor adecuado dependiendo de las caracteristicas de tu propio sistema, que tan inercial es. Las formulas las coloqué en el post anterior.
Javicho.
-
gracias por las respuestas javicho..
pero por lo que entiendo yo debo de fijar un punto en el cual empieze a desacelerar conforme al error ,pero entonces siempre seria la desaceleracion en el mismo punto ..pero de donde toma los cds para ponerlos en el cd-rom puede tener 200 posiciones pocibles de donde tomar algun cd
pero el problema seria cuantas rampas diferentes tendria que programar..o solo para cada cd ajustaria el punto para detenerse
javicho otra pregunta abusando de tu gentileza :-),al empezar a trabajar sobre el pwm y mi motor ,me ha sucedido que el motor solo zumba y no se muebe..que estoy haciendo mal???
estoy usando el modulo ccp/pwm del 877 pero no se que pase o por que solo zumba ??
gracias javicho
-
Que tipo de motor usas? que frecuencia? tal vez estas configurando mal el mosfet o transistor que dispara tu motor, tal vez estas enviando un pequeño ciclo util por eso no se mueve, tal vez debido al motor a tu transistor o mosfet le está llegando tensiones positivas (cuando el pwm envia 1 logico para disparar) y tensiones negativas igual al negativo de tu fuente (cuando el pwm envia 0 logico). Seria mejor que lo veas con un osciloscopio.
error ,pero entonces siempre seria la desaceleracion en el mismo punto ..pero de donde toma los cds para ponerlos en el cd-rom puede tener 200 posiciones pocibles de donde tomar algun cd
No entendí lo de las 200 posiciones.
Javicho.
-
Pues uso un motor de c.d desos pequeños de juguete con una reductora,para su control y pwm uso un driver l293b a una frecuencia de 250 hz...cuando el ccpr1l=0 se escucha un sumbido asta ya despues de muchos incrementos del ccpr1l empieza a dejar de escucharse el zumbido y poco despues empieza a moverse el motor :-/
y con respecto a las 200 posiciones es porque tengo una torre de cd's de donde se ba a tomar el cd seleccionado,,,estoy tratando de hacer algo asi komo una rocola :D pero un poco estlizada con mecanica y cables :D
-
En principio, lo mas estandar seria que modelizaras el motor de CC, obtuvieses sus ecuaciones de estado y diseñases un controlador, junto con un observador de estado. Fijate que simple lo digo jajaj pero no lo es (aunque nosotros lo hemos hecho hace unas semanas).
Bien te comento... segun lo poco que se de controladores y PIDs, yo creo que lo mejor es que diseñes un PID digital en un PIC (analogicos ni de coña!!), y vayas cambiando ("sintonizando" en la jerga) los parametros Kp,Ki,Kd hasta que consigas lo que deseas.
La referencia del PID sería la posicion X donde quieres que este el posicionador, el error seria la medicion del encoder (digitalizada claro), y la salida seria una señal analogica (mediante un DAC) al L293B. Asi de simple. El diseño es muy simple (un PIC y un conversor D/A), y la programacion tambien, pues hay demasiados ejemplos en internet sobre PIDs en micros (incluidos los pics). Lo mas dificil y tedioso será ajustar esos 3 parametros, pero seguro que con un poco de paciencia y documentacion sobre sintonizacion de PIDs lo haces en una tarde.
La gran ventaja de diseñar el PID en soporte digital es que los 3 parametros no son 3 posiciones e-x-a-c-t-a-s de los potenciometros, sino 3 floats que programas comodamente en el PIC en un pimpampum. Si te pones mas elegante y para acelerar las cosas, puedes meterle una consola RS232 para cambiar los valores de sintonia "on the fly", y enviarle referencias de posicion para ver el comportamiento. Yo desdeluego lo haria.
Un saludo!
-
Hola manex 1987 gracias por tu respuesta...he estado leyendo algunos documentos sobre pid's pero no logor entender que hace cada señal de control...la proporcional mas o menos
creo que la proporcional es solo la resta del set point-valor actual y conforme a eso multiplicarlo pero en la integral y la diferencial no logro entender como influyen y pues me cuesta trabajo analizar algunos codigos de asm :-/
Gracias
-
Yo todavia no se demasiado de PIDs, pero a finales de junio espero saber algo(acabamos de empezar a darlo en la universidad). Hasta donde sé, un PID debe ser ajustado, ajustando tres constantes.
Kp: Constante proporcional, correspondiente al termino proporcional.
Ki: Constante integral, para el termino integral.
Kd: Constante derivativa, para el termino derivativo.
El termino integral lo que hace es, coger la señal e integrarla. Y el derivativo deriva la señal. Implementar eso en un PIC implica hacerlo numericamente. Obviamente se precisa del uso de coma flotante... asi que a lo mejor ASM no es la mejor eleccion...
Links que te sacaran de dudas (ingles necesario):
Controladores PID con PIC18 (http://ww1.microchip.com/downloads/en/AppNotes/00937a.pdf)
Control de un pendulo invertido usando PID (http://ww1.microchip.com/downloads/en/AppNotes/00964A.pdf)
-
¿por que razón para derivar e integrar hace falta las librerías en coma flotante? Si estamos en un sistema discreto eso no hace falta.
Un saludo
-
Seria una casualidad impresionante, que la integral y la derivada del error, dadas en un tiempo de muestreo T, fueran a dar numeros enteros sin ningun margen de error. Claro, puedes prescindir de la coma flotante para el calculo, pero el error que realizas en el calculo sera determinante en la estabilidad y el comportamiento en general del sistema de control. Aparte, el ajuste de los parametros Kp, Ki, Kd es mucho mas optimo si tenemos una resolucion digna.
La derivada, pensandolo mejor, si que puede ser entera en todos los casos. Pero la integral (pensando en ella como una superficie) no.
-
La integral en un sistema discreto se implementa como un sumatorio y la derivada como una resta, ¿de donde salen los decimales?
Un saludo
-
Espero que no estemos en un malentendido. Cuando dices sistema discreto, quiero creer que te refieres, a un sistema muestreado, es decir, para este proyecto mismo, seria leer el encoder y de ahi sacar la posicion absoluta. Eso se hace cada X tiempo, luego los calculos se hacen cada X tiempo por lo que la señal de control generada se refresca cada X tiempo, luego el sistema es discreto.
Todo depende del metodo de integracion que elijas. Si te decantas por forward o backward (la integral se hace cogiendo un rectangulo con la muestra en el instante N-1 o en el instante N , respectivamente), te saldran numeros enteros y si que la integral es un sumatorio de todas las sub-areas... pero dado que entre muestra y muestra hay un tiempo T, todo ese sumatorio debera estar multiplicado por ese factor.
En la derivada lo veo mas claro lo de la resta... pero claro, es entera solo si 1/T es entero. Porque la derivada discreta se computa como X(N)-X(N-1) / T
Explicame como lo ves tú...
-
Efectivamente si tomamos el tiempo de muestreo como unidad mínima de incremento, no es necesario dividir por T ya que este valor es la unidad. En caso contrario si que hay que dividir y se pueden obtener decimales. De todas formas al ser el tiempo de muestreo igual para todo el sistema, no hace falta dividir por el tiempo con lo cual el tiempo de computo se reduce ostensiblemente y con ello aumenta la velocidad de proceso.
Un saludo
-
El problema radica, en que calculando la señal de control cada segundo (T=1), no vas a conseguir nada bueno, dado que la dinamica del motor es (obviamente) mucho mas rapida que eso.
Pero bueno, una opcion razonable puede ser usar multiplos como 1/10, 1/100, 1/1000, y "escalar" todos los calculos, haciendo x10, x100, x1000. Pero me temo que luego a la hora de de-escalar, surgiria algun que otro error de redondeo. Claro, ese error sera menor a la unidad, y puede que el sistema funcione bien a pesar de ello... pero solo aviso.
-
Hola manex_1987, cuando jfh900 te dice que el tiempo de muestreo como unidad mínima de incremento no se refiere a que T=1segundo sino mas por el contrario se trata de que T=1 significa que T=1mS o T=100mS o T=10uS es decir es una unidad minima en la que se muestrea la señal y lo puedes hacer tan rapido como quieras.
Por ejemplo el control derivativo seria algo asi:
Accion_Derivativa = D * [(Xt) - (Xt-1)] / [1]
[1] : es la unidad minima de tiempo de muestreo que puede ser 10mS, 100mS, 1mS, 10uS, ... lo que mejor te convenga.
Ten en cuenta que D<0, esto parte del siguiente hecho:
La accion de control derivativa hablando con un poco mas de rigor seria:
Accion_Derivativa = Kd * dError/dt = Kd * d(Set_Point - Valor actual)/dt, pero sabemos que la derivada de una constante como lo es el Set_Point es cero, es decir d(Set_Point)/dt = 0, entonces la ecuación queda:
Accion_Derivativa = Kd * d( - Valor actual)/dt = - Kd * d(Valor actual)/dt
El termino " d(Valor actual)/dt " expresa la razón de cambio de la velocidad respecto del tiempo, entonces podemos escribir:
Accion_Derivativa = - Kd * [(Xt) - (Xt-1)]/[(t) - (t-1)] , pero (t) - (t-1) = " 1 " porque es nuestra minima unidad de tiempo, por lo tanto:
Accion_Derivativa = - Kd * [(Xt) - (Xt-1)]/[1]
La ecuación presenta el signo negativo porque tiene que contrarestar el hecho de que vaya llegando muy rapido al SetPoint.
Bueno, espero se haya entendido algo.
Javicho.
-
Esta perfectamente explicado.
El paso de un sistema continuo a uno discreto lo tienes expresado en:
Accion_Derivativa = Kd * d( - Valor actual)/dt = - Kd * d(Valor actual)/dt
Accion_Derivativa = - Kd * [(Xt) - (Xt-1)]/[(t) - (t-1)] , pero (t) - (t-1) = " 1 " porque es nuestra minima unidad de tiempo, por lo tanto:
Donde pasamos de funciones continuas y por tanto derivativas a valores muestreados y por lo tanto necesitamos tomar incrementos.
Un saludo
-
Sip, completamente de acuerdo, lo entiendo. Lo que me avispa es que en un sistema con sobreimpulso en su respuesta, eso vaya a funcionar bien, dado que habeis supuesto ValorActual<SetPoint siempre. Pero bueno, usado junto con la accion proporcional no deberia ser problema.
-
Hola como estan, por ejm en un motor de corriente continua controlado por un dspic no es necesario complicarse tanto con esas conversiones, de enteros, punto fijo, escalado aqui, escalado a ya. Tengo implementado un pid con un T=1mseg el pid solo dura menos de 200useg. un T=1mseg es un buen tiempo de muestreo para un motor dc, se consiguen buenos resultados, por ejm si se diseña para que el set point se establesca en 200mseg, 200 puntos de control esta bien.
A medida que Microchip vaya sacando micros más potentes como los dspic32, que no falta mucho para que lleguen, todos esas conversiones dejaran de usarse incluso para un control vectorial.
saludos.