TODOPIC
Otros Microcontroladores / Dispositivos programables => Arduino => Mensaje iniciado por: Fer_TACA en 10 de Febrero de 2025, 12:37:30
-
Hola a todos,
De nuevo por aquí con un problema en un proyecto:
Resulta que tengo un fichero para el control de un motor a través de un puente en H con el correspondiente encoder. Este fichero funciona perfecto y dentro la configuración de los parámetros de kp, ki y kd tiene unos valores fijos ya ajustados previamente para el correcto funcionamiento del motor.
Como quiero utilizar el mismo sistema con otro tipo de motores para no tener distintos ficheros con distintos valores, se me ha ocurrido el añadirle unos potenciómetros para poder realizar el ajuste de kp,ki y kd. Además he colocado una pantalla Oled de 128x64 pixeles para poder ver en todo momento, además de los valores ajustados algún que otro mensaje como el numero de pulsos por ejemplo. También he colocado el pertinente guardado de los valores ajustados y leídos en la EEprom.
El problema:
Bueno si pruebo por una parte la sección solo del motor, todo sigue funcionando perfecto. Si pruebo, por otra parte, solo (sin el control del motor) la lectura de los ajustes, la presentación de los valores en la Oled y la lectura y grabado en la EEprom también funciona todo perfecto.
El problema se da cuando junto todo: ni el motor funciona y la presentación ed datos en la pantalla Oled también salen valores que no debieran.
Adjunto el fichero solo de la parte del motor (original) y el fichero con el resto de añadidos para ver si alguno me puede indicar donde puede estar el fallo.
F.
P.D.: Ya se que la parte de las funciones de ajuste y de trabajo continuo debo mejorarlas para no duplicar código, pero eso vendrá después una vez que consiga obtener que todo el conjunto funciona adecuadamente.
-
Se me olvido indicar que el problema que se aprecia es como que cuando se ajustan los valores, es como si no se actualizasen los mismos dentro del PID.
La pantalla oscila entre varios valores que no se corresponden con nada.
F.
-
Hola Fermín, te cuento cosas que veo, aunque no sé si eso solucionará algo:
- tu programa usa interrupciones para leer los dos canales del encoder. En la versión completa, activas estas interrupciones antes de leer la EEPROM y de establecer el PID. No sé qué ocurre si salta una interrupción durante la lectura de la eeprom o el cálculo del PID, pero seguramente nada bueno. Yo no activaría las interrupciones hasta terminar con todo el setup()
- ¿la comunicación I2C la haces por hardware o por software?. En el código no puedo ver qué pines se utilizan por lo que no he podido saberlo. Si fuera por software, actualizar la pantalla oled te consumirá bastantes ciclos de reloj, tiempo durante el que es muy probable que salten esas interrupciones del encoder. Nueva fuente de problemas
- y esto no sé si tendrá algo que ver pero yo lo probaría: veo que en tu loop() llamas continuamente a pwmOut. ¿Eso tiene sentido?, si no lo entiendo mal sólo deberías llamarlo cuando haya un cambio en los ajustes del PID o en la posición del motor. Yo creo que debería llamar a esa función al final de la función "doEncoderMotor0".
Prueba y me cuentas
-
Manolo gracias por la respuesta y por la molestia en ver los códigos adjuntados.
Respecto a tus comentarios:
Lo de la lectura de la EEprom en el setup, evidentemente tienes razón. Ya lo cambio para las próximas pruebas.
No obstante, dentro de la función de ajuste también se accede a la eeprom, en este caso para guardar los valores. Entiendo que sería bueno antes de empezar a grabar el deshabilitar las interrupciones y después del guardado pues volverlas a activar.
Respecto a llamar de forma continua a la función pwmout dentro del loop, la he dejado de este modo porque asi se encuentra en el fichero original el cual está funcionando correctamente.
Y para finalizar la comunicación I2C. Se están utilizando los pines A4(SDA) y A5(SCL) y está claro que consume tiempo el presentar los datos en la pantalla y que seguro que hay interrupciones en ese proceso. De ahí el problema que creo que no se actualiza correctamente el PID con los valores ajustados.
Lo que pienso es que dentro de la parte de la inicialización, después de dar unos valores fijos para kp,ki y kd se crea el objeto del PID con la linea: PID myPID(&input, &output, &setpoint, kp, ki, kd, DIRECT);
Asi que entiendo que es ahí donde se establecen los valores del pid y aunque después en el loop dentro de la función de ajuste se creen nuevos valores de acuerdo a lo leído de los potenciómetros pues ya no se actualiza el pid con lo nuevos valores.
¿Cómo se podrían actualizar esos valores? ¿Alguna idea?
Desde el punto de vista de casi novato que soy con Arduino, ¿Cómo puedo realizar esa labor de presentar los datos en la pantalla sin que interfiera en los valores del PID?
F.
-
Pues no te puedo ayudar mucho, tendría que trastearlo yo mismo para ir probando cosas.
Lo que sí te aconsejo es que vayas acotando cosas hasta encontrar la causa del problema. Por ejemplo, ¿si en tu código no activas las interrupciones del encoder todo funciona bien?
Quizás deberías ver si existe la posibilidad de manejar la prioridad de las interrupciones.
-
Muchas gracias por la respuesta.
Eso de acotar es lo que estoy realizando a ver si encuentro el porque sede eso.
F.
-
Como te dicen, revisa bien lo de las interrupciones y los tiempos que requiere cada cosa que hace tu programa y de paso ve si te sirve algo el código que adjunto, lo hice hace ya tiempo, y no esperes encontrar algo bastante lujoso y bien comentado porque lo hice en una tarde, pero de algo te podría servir.
- Carga y guarda la configuración de la eeprom
- Usa también una pantallita OLED, donde se muestra, en este caso la temperatura y te permite navegar por medio de unos botones en un menú para cambiar los parámetros.
- También tiene una línea de comandos que permite interactuar por medio de la PC.
- Controla dos Ventiladores por PWM.
-
Como te dicen, revisa bien lo de las interrupciones y los tiempos que requiere cada cosa que hace tu programa y de paso ve si te sirve algo el código que adjunto, lo hice hace ya tiempo, y no esperes encontrar algo bastante lujoso y bien comentado porque lo hice en una tarde, pero de algo te podría servir.
- Carga y guarda la configuración de la eeprom
- Usa también una pantallita OLED, donde se muestra, en este caso la temperatura y te permite navegar por medio de unos botones en un menú para cambiar los parámetros.
- También tiene una línea de comandos que permite interactuar por medio de la PC.
- Controla dos Ventiladores por PWM.
Gracias la echaré un vistazo.
F.
-
Puedes ayudarte de ChatGPT, que es bastante potente a la hora de manejar código y conoce bien el entorno Arduino.