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

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

Desconectado Ruco

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


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

Alguna ayuda?.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
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

  • PIC12
  • **
  • Mensajes: 62
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

  • PIC24H
  • ******
  • Mensajes: 1004
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: 8242
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


 

anything