// ************************************************************************************************* // @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; }
// ************************************************************************************************* // @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); }