Autor Tema: Reducir expresión para leer sensores  (Leído 152 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Ruco

  • PIC10
  • *
  • Mensajes: 6
Reducir expresión para leer sensores
« en: 01 de Julio de 2020, 19:45:26 »

Saludos amigos de este foro.

Necesito ayuda para reducir una expresión de código en ccs c. El caso es el siguiente:

Estoy leyendo 5 sensores a los cuales les aplico un filtro de kalman para ellos, la cosa es que mi código se vuelve un poco largo y me gustaría saber si se puede reducir con algún ciclo For por ejemplo. Nota: el código así como lo tengo funciona solo quiero reducirlo para no hacerlo tan largo

La expresión de código que quiero reducir es el siguiente:

Código: C++
  1.  
  2. float Xe[5];
  3.  
  4.  
  5. // kalman process
  6.          Pc = P + varProcess;
  7.          G = Pc/(Pc + varVolt);    // kalman gain
  8.          P = (1-G)*Pc;
  9.          Xp = Xe[0];
  10.          Zp = Xp;
  11.          Xe[0] = G*(((float) ADC_Read[0] * ADC_Coef[0])-Zp)+Xp;   // valor de salida kalman
  12.          
  13.          // kalman process
  14.          Pc = P + varProcess;
  15.          G = Pc/(Pc + varVolt);    
  16.          P = (1-G)*Pc;
  17.          Xp = Xe[1];
  18.          Zp = Xp;
  19.          Xe[1] = G*(((float) ADC_Read[1] * ADC_Coef[1])-Zp)+Xp;   // valor de salida kalman
  20.          
  21.          // kalman process
  22.          Pc = P + varProcess;
  23.          G = Pc/(Pc + varVolt);    
  24.          P = (1-G)*Pc;
  25.          Xp = Xe[2];
  26.          Zp = Xp;
  27.          Xe[2] = G*(((float) ADC_Read[2] * ADC_Coef[2])-Zp)+Xp;   // valor de salida kalman
  28.          
  29.          // kalman process
  30.          Pc = P + varProcess;
  31.          G = Pc/(Pc + varVolt);    
  32.          P = (1-G)*Pc;
  33.          Xp = Xe[3];
  34.          Zp = Xp;
  35.          Xe[3] = G*(((float) ADC_Read[3] * ADC_Coef[3])-Zp)+Xp;   // valor de salida kalman
  36.          
  37.          // kalman process
  38.          Pc = P + varProcess;
  39.          G = Pc/(Pc + varVolt);    
  40.          P = (1-G)*Pc;
  41.          Xp = Xe[4];
  42.          Zp = Xp;
  43.          Xe[4] = G*(((float) ADC_Read[4] * ADC_Coef[4])-Zp)+Xp;   // valor de salida kalman
  44.  
  45.  


Lo e intentado así pero no funciona, ya que los valores de lectura están muy por debajo de los reales.

Código: C++
  1.  
  2. for(int i=0; i<5;i++)
  3. {
  4.          // kalman process
  5.          Pc = P + varProcess;
  6.          G = Pc/(Pc + varVolt);    
  7.          P = (1-G)*Pc;
  8.          Xp = Xe[i];
  9.          Zp = Xp;
  10. }
  11. Xe[0] = G*(((float) ADC_Read[0] * ADC_Coef[0])-Zp)+Xp;   // valor de salida kalman
  12. Xe[1] = G*(((float) ADC_Read[1] * ADC_Coef[1])-Zp)+Xp;   // valor de salida kalman
  13.  Xe[2] = G*(((float) ADC_Read[2] * ADC_Coef[2])-Zp)+Xp;   // valor de salida kalman
  14. Xe[3] = G*(((float) ADC_Read[3] * ADC_Coef[3])-Zp)+Xp;   // valor de salida kalman
  15. Xe[4] = G*(((float) ADC_Read[4] * ADC_Coef[4])-Zp)+Xp;   // valor de salida kalman
  16.  
  17.  

Alguna ayuda?.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 7802
Re:Reducir expresión para leer sensores
« Respuesta #1 en: 01 de Julio de 2020, 20:37:01 »
Esto es lo que queres hacer?

Código: C
  1. for(int i=0; i<5;i++)
  2. {
  3.          Pc = P + varProcess;
  4.          G = Pc/(Pc + varVolt);    
  5.          P = (1-G)*Pc;
  6.          Xp = Xe[i];
  7.          Zp = Xp;
  8.          Xe[i] = G*(((float) ADC_Read[i] * ADC_Coef[i])-Zp)+Xp;
  9. }

Aunque podrias simplificarlo un poquito mas:

Código: C
  1. for(int i=0; i<5;i++)
  2. {
  3.          Pc = P + varProcess;
  4.          G = Pc/(Pc + varVolt);    
  5.          P = (1-G)*Pc;
  6.          Xe[i] = G*(((float) ADC_Read[i] * ADC_Coef[i])-Xe[i])+Xe[i];
  7. }

Ya que Zp=Xp=Xe
« Última modificación: 01 de Julio de 2020, 20:41:50 por KILLERJC »

Desconectado Ruco

  • PIC10
  • *
  • Mensajes: 6
Re:Reducir expresión para leer sensores
« Respuesta #2 en: 01 de Julio de 2020, 21:34:16 »
 :o Funciona  :) :) :)

Gracias, ahora funciona todo bien. Y todo simplificado KILLERJC.

Desconectado Eduardo2

  • PIC18
  • ****
  • Mensajes: 361
Re:Reducir expresión para leer sensores
« Respuesta #3 en: 01 de Julio de 2020, 23:21:11 »

Código: [Seleccionar]
P = (1-G)*Pc;
¿Qué sentido tiene esto si no se lo usa?

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 7802
Re:Reducir expresión para leer sensores
« Respuesta #4 en: 02 de Julio de 2020, 00:21:01 »
Lo usa en la próxima vuelta