Problema al sumar variables.

Buenas tardes, estoy desarrollando un PID para un cuadricoptero, me encuentro con un problema al sumar las constantes multiplicadas por su error. A continuación les adjunto el código;

///PID_1
float roll_prop_error, roll_int_error, roll_der_error, pitch_prop_error, pitch_int_error, pitch_der_error, yaw_prop_error, yaw_int_error, yaw_der_error;
float roll_prop_error_ant,pitch_prop_error_ant,yaw_prop_error_ant=0;
volatile float roll_salida,pitch_salida,yaw_salida;
float kp_roll_error,ki_roll_error,kd_roll_error;

float Ki=0.07;
float Kp=3;
float Kd=10;

dT2= micros()-last_t2;
last_t2=micros();

/////////////////////////////////////////////////////////////////////////////////////////
//****ROLL PID****

//Proporcional
roll_prop_error= angulo_roll - wRollConsigna;

//Integral

roll_int_error+= (roll_prop_error)/(dT2/1000); //NO se xq divivido 1000. Variar eso sino. 
roll_int_error= constrain(roll_int_error,-100,100);

//Derivativo

roll_der_error= (roll_prop_error - roll_prop_error_ant)/(dT2/1000);

//Resultado

kp_roll_error=(Kp * roll_prop_error);
ki_roll_error=(Ki * roll_int_error);
kd_roll_error=(Kd* roll_der_error);

roll_salida = kp_roll_error + ki_roll_error + kd_roll_error;
//roll_salida = constrain(roll_salida,-100,100);

roll_prop_error_ant=roll_prop_error;

Esa parte corresponde al Roll, no adjunto el resto del código porque el error es el mismo solo que con otras variables. El tema esta en la variable roll_salida. Al imprimirla en el monitor serial me da 0, pero al imprimir sus componentes como kp_roll_error, me dan un valor distinto a cero, inclusive al mover el giroscopio estos errores aumentan o disminuyen, llegando kp_roll_error a darme valores cercanos a 80, y al mismo tiempo lla variable roll_salida me da 0. No se que error estar cometiendo, nunca tuve problema con algo tan básico. desde ya muchas gracias.

Saludos, creo que el problema es el volatile, como indica el artículo

https://www.arduino.cc/reference/en/language/variables/variable-scope-qualifiers/volatile/

es posible que tenga imprecisión matemática al usarla

Gracias por tu aporte, pero el problema no es el volatile. Lo he modificado y el problema persiste, lo cual es raro porque en las sumas anteriores, por ejemplo, en el roll_int_error, las suma funciona correctamente. Adjunto una imagen de lo que imprime el monitor serial, para que veas como las variables dentro de roll_salida tienen valores muy lejanos al 0 que esta variable toma.

Imagen: https://ibb.co/8mJHvNt

Captura-de-Pantalla-2020-11-08-a-la-s-22-32-53.png

Captura-de-Pantalla-2020-11-08-a-la-s-22-32-53.png

Yo empezaría a poner serial.prints y ver valores paso a paso

Es justamente lo que he hecho, arranque imprimiendo todas las variables desde el inicio del PID hasta el final, y comprobé que al terminar los 3 ejes (Pitch, roll, yaw) en las variables de salida, me dan =0.. Es lo mismo que publique en la imagen anterior.
Lo que me da el monitor serial al mover el giroscopio es:

22:32:37.426 -> kp_roll_error: -172.49
22:32:37.460 -> ki_roll_error: -7.00
22:32:37.460 -> kd_roll_error: -0.45
22:32:37.494 -> roll_salida: 0.00
22:32:38.088 -> kp_roll_error: -214.46
22:32:38.088 -> ki_roll_error: -7.00
22:32:38.088 -> kd_roll_error: -0.26
22:32:38.122 -> roll_salida: 0.00
22:32:38.715 -> kp_roll_error: -154.36
22:32:38.715 -> ki_roll_error: -7.00
22:32:38.715 -> kd_roll_error: 0.23
22:32:38.750 -> roll_salida: 0.00

Y las formula:

roll_salida = kp_roll_error + ki_roll_error + kd_roll_error;

Si remplazase con los primeras 4 lineas, la lógica de la aritmética realizada por el microprocesador seria:

0 = (-172.49) + (-7) + (-0.45).

Lo cual claramente es equivoco. He probado colocarle paréntesis a cada variable también, pero nada. He querido igualar rol_salida a una sola de estas variables, sin sumar las demas, pero sigue dando 0. Hasta cambie el nombre de rol_salida pero no hubo chance. estoy en un punto muerto de algo que siempre me resulto mas que sencillo. Cualquier aporte es bien recibido, gracias.

Mira, el problema es que no puedo reproducir tus pruebas, porque están asociadas a un hardware que no poseo y un paradigma de resolución que desconozco, al no conocer el problema concreto.

Mira este código

#include <Arduino.h>


void setup() {

    Serial.begin(9600);



///PID_1
float roll_prop_error, roll_int_error, roll_der_error, pitch_prop_error, pitch_int_error, pitch_der_error, yaw_prop_error, yaw_int_error, yaw_der_error;
float roll_prop_error_ant,pitch_prop_error_ant,yaw_prop_error_ant=0;
volatile float roll_salida,pitch_salida,yaw_salida;
float kp_roll_error,ki_roll_error,kd_roll_error;

float Ki=0.07;
float Kp=3;
float Kd=10;


kp_roll_error = -172.49;
ki_roll_error = -7.00;
kd_roll_error = -0.45;


roll_salida = kp_roll_error + ki_roll_error + kd_roll_error;

Serial.println(roll_salida);



}

void loop() { }

Me produce esta salida: -179.94

No te puedo decir más

Gracias por tu aporte, justo acabo de resolverlo. En vez de pedirte la formula completa la hice en partes.

  kp_roll_error+= ki_roll_error;
  
  kp_roll_error+=kd_roll_error;
  Serial.print("kp_roll_error_FINAL: "); Serial.println(kp_roll_error);

Y ahi me funciono correctamente. Desconozco el problema la verdad, estaría bueno saber cual es el error del otro método, pero bueno mientras funcione no es tanto el drama.
Sobre el hardware que me consultaste, estoy utilizando un DUE con un MPU6050 conectado a travez de los puertos SDA y SCL del DUE. Pero dudo que sea un problema del hardware porque las sumas del error integral me las realizaba sin ningún inconveniente. Muchas gracias de todos modos.

EDIT: Probando y probando, me di cuenta que el problema no esta en la suma, sino en la igualación a otra variable, y cambiando el tipo float por tipo int (aunque no es lo mejor para este caso) de la variable roll_salida, la igualación resulta exitosa, dejando de generar valores =0. Desconozco el problema de esto, pero si alguien lo supiera estaría bueno para poder aprender. gracias.

Yo lo he probado en un UNO y no es el hardware

Moderador:
Por favor no repitas lo que otra persona te dice. Ya se lee en el post correspondiente.
Menciona a la persona por su nick y nada mas.
Usa quote o cita (traducción) para resaltar un párrafo, no todos y cada uno de los textos respondidos que corresponden a ese post.
Item 14 de las normas del foro, último párrafo, si quieres leer al respecto.

Además aunque no cometes ninguna falta con esto, a la larga toda imagen subida a un repositorio de imágnes se pierde en 1 o 2 meses. Asi que conviene que la subas como adjunto y luego la agregues como imagen a tu post tal como se explica en las normas.
Al hacerlo nos facilitas a todos las respuestas.

Gracias.