Exemple #1
0
// *************************************************************************************************
// @fn          do_altitude_measurement
// @brief       Perform single altitude measurement
// @param       u8 filter       Filter option   
// @return      none
// *************************************************************************************************
void do_altitude_measurement(u8 filter)
{
   volatile u32 pressure;

   // If sensor is not ready, skip data read       
   if ((PS_INT_IN & PS_INT_PIN) == 0)
      return;

   // Get temperature (format is *10 K) from sensor
   sAlt.temperature_K = ps_get_temp();
   sAlt.temperature_C = sAlt.temperature_K - 2721 + sAlt.temperature_C_offset;

   // Get pressure (format is 1Pa) from sensor
   pressure = ps_get_pa();

   // Store measured pressure value
   if (filter == FILTER_OFF)
   {
      sAlt.pressure = pressure;
   }
   else
   {
      // Filter current pressure
      pressure = (u32) ((pressure * 0.2) + (sAlt.pressure * 0.8));

      // Store average pressure
      sAlt.pressure = pressure;
   }

   // Convert pressure (Pa) and temperature ( K) to altitude (m)
   sAlt.altitude = conv_pa_to_meter(sAlt.pressure, sAlt.temperature_K);
}
// *************************************************************************************************
// @fn          start_altitude_measurement
// @brief       Start altitude measurement
// @param       none
// @return      none
// *************************************************************************************************
void start_altitude_measurement(void)
{
    // Show warning if pressure sensor was not initialised properly
    if (!ps_ok)
    {
        display_chars(LCD_SEG_L1_2_0, (u8 *) "ERR", SEG_ON);
        return;
    }

    // Start altitude measurement if timeout has elapsed
    if (sAlt.timeout == 0)
    {
        // Enable DRDY IRQ on rising edge
        PS_INT_IFG &= ~PS_INT_PIN;
        PS_INT_IE |= PS_INT_PIN;

        // Start pressure sensor
        ps_start();

        // Set timeout counter only if sensor status was OK
        sAlt.timeout = ALTITUDE_MEASUREMENT_TIMEOUT;
        

        sAlt.pressure_sum = 0;
        sAlt.pressure_delta = 0;
        sAlt.pressure_counter = 0;        
          
        // Get pressure (format is 1Pa) from sensor
        while ((PS_INT_IN & PS_INT_PIN) == 0) ;
        sAlt.pressure_old = ps_get_pa();
        while ((PS_INT_IN & PS_INT_PIN) == 0) ;
        do_altitude_measurement(FILTER_OFF);
    }
}
// *************************************************************************************************
// @fn          do_altitude_measurement
// @brief       Perform single altitude measurement
// @param       none
// @return      none
// *************************************************************************************************
void do_altitude_measurement(u8 filter)
{
    volatile u32 pressure;

    // If sensor is not ready, skip data read   
    if ((PS_INT_IN & PS_INT_PIN) == 0) return;
        
    // Get temperature (format is *10°K) from sensor
    sAlt.temperature = ps_get_temp();

    // Get pressure (format is 1Pa) from sensor
    pressure = ps_get_pa(); 
        
    // Store measured pressure value
    if (filter == FILTER_OFF) //sAlt.pressure == 0) 
    {
        sAlt.pressure = pressure;
    }
    else
    {
        // Filter current pressure
        pressure = (u32)((pressure * 0.2) + (sAlt.pressure * 0.8));
    
        // Store average pressure
        sAlt.pressure = pressure;
    }
    
    // Convert pressure (Pa) and temperature (°K) to altitude (m)
    sAlt.altitude = conv_pa_to_meter(sAlt.pressure, sAlt.temperature);
    
    // Calculate Ambient pressure, unit: milliBar = hectoPascal
    AmbientPressure = sAlt.pressure/100 + AmbientPressureOffset;
}
Exemple #4
0
// *************************************************************************************************
// @fn          do_altitude_measurement
// @brief       Perform single altitude measurement
// @param       none
// @return      none
// *************************************************************************************************
void do_altitude_measurement(u8 filter)
{
    volatile u32 pressure;

    // If sensor is not ready, skip data read
    if ((PS_INT_IN & PS_INT_PIN) == 0) return;

    // Get temperature (format is *10?K) from sensor
    sAlt.temperature = ps_get_temp();

    // Get pressure (format is 1Pa) from sensor
    pressure = ps_get_pa();

    // Store measured pressure value
    if (filter == FILTER_OFF) //sAlt.pressure == 0)
    {
        sAlt.pressure = pressure;
    }
    else
    {
        // Filter current pressure
#ifdef FIXEDPOINT
        pressure = (u32)(((pressure * 2) + (sAlt.pressure * 8))/10);
#else
        pressure = (u32)((pressure * 0.2) + (sAlt.pressure * 0.8));
#endif
        // Store average pressure
        sAlt.pressure = pressure;
    }

    // Convert pressure (Pa) and temperature (?K) to altitude (m).
#ifdef FIXEDPOINT
    sAlt.altitude = conv_pa_to_altitude(sAlt.pressure, sAlt.temperature);
#else
    sAlt.altitude = conv_pa_to_meter(sAlt.pressure, sAlt.temperature);
#endif

#ifdef CONFIG_VARIO
    // Stash a copy to the vario after filtering. If doing so before, there
    // is just too much unnecessary fluctuation, up to +/- 7Pa seen.
    vario_p_write( pressure );
#endif
}
// *************************************************************************************************
// @fn          do_altitude_measurement
// @brief       Perform single altitude measurement
// @param       u8 filter       Filter option
// @return      none
// *************************************************************************************************
void do_altitude_measurement(u8 filter)
{
    volatile u32 pressure;

    // If sensor is not ready, skip data read
    if ((PS_INT_IN & PS_INT_PIN) == 0)
        return;

    // Get temperature (format is *10 K) from sensor
    sAlt.temperature = ps_get_temp();

    // Get pressure (format is 1Pa) from sensor
    pressure = ps_get_pa();
//    sAlt.pressure_unfilt = pressure;

    // Store measured pressure value
    if (filter == FILTER_OFF)   //sAlt.pressure == 0)
    {
        sAlt.pressure = pressure;
    }
    else
    {
        // Filter current pressure
        pressure = (u32) ((pressure * 0.2) + (sAlt.pressure * 0.8));

        // Store average pressure
        sAlt.pressure = pressure;
    }
    sAlt.pressure_sum += sAlt.pressure;
    sAlt.pressure_counter++;
    u32 Temp;
    if (sAlt.pressure_counter == 900) 
    {
      Temp = (u32)((float) sAlt.pressure_sum / 900.0 + 0.5);
      sAlt.pressure_delta = (s16) (4*(Temp - sAlt.pressure_old));
      sAlt.pressure_old = Temp;
      sAlt.pressure_counter = 0;
      sAlt.pressure_sum = 0;
    };
    
    // Convert pressure (Pa) and temperature (K) to altitude (m)
    sAlt.altitude = conv_pa_to_meter(sAlt.pressure, sAlt.temperature);
}