void SONAR_MAXBOTIX12_IRQ_HANDLER(void)
{
  if (TIM_GetITStatus(SONAR_MAXBOTIX12_TIM, TIM_IT_CC1) == SET)
    {
      TIM_ClearITPendingBit(SONAR_MAXBOTIX12_TIM, TIM_IT_CC1);
      int32_t sonar_meas = TIM_GetCapture1(SONAR_MAXBOTIX12_TIM);
      /* pulse_cnts to actual pulse width in us:
       *   pulse width = pulse_cnts * (prescaler+1)/(actual clock)
       *   with 58us per centimeter, the alt in cm is:
       */
      //int32_t alt_mm = pulse_cnts * 10 * (69/72) / 58;
      //sonar_alt

      //if ((sonar_meas > (sonar_filter_val + 1500) || sonar_meas < (sonar_filter_val - 1500))
      if ((sonar_meas > (sonar_filter_val + 3000) || sonar_meas < (sonar_filter_val - 3000))
          && (sonar_spike_cnt < 5)) {
        sonar_spike_cnt++;
        sonar_meas = sonar_filter_val;
      }
      else {
          sonar_spike_cnt = 0;
      }

      //@TODO: check for angle > 10 deg ==> don't use value

      sonar_filter_val = SONAR_MAXBOTIX12_BUTTER_NUM_1*sonar_meas
      + SONAR_MAXBOTIX12_BUTTER_NUM_2*sonar_meas_prev
    //  + SONAR_MAXBOTIX12_BUTTER_NUM_3*sonar_meas_prev_prev
      - SONAR_MAXBOTIX12_BUTTER_DEN_2*sonar_filter_val_prev;
    //  - SONAR_MAXBOTIX12_BUTTER_DEN_3*sonar_filter_val_prev_prev;

      sonar_meas_prev_prev = sonar_meas_prev;
      sonar_meas_prev = sonar_meas;
      sonar_filter_val_prev_prev = sonar_filter_val_prev;
      sonar_filter_val_prev = sonar_filter_val;

      /** using float
      float factor_cm = 0.0165229885;
      float alt_cm_flt = sonar_meas * factor_cm * (1<<8);
      sonar_meas_real = alt_cm_flt;*/


      //((69 / 72) / 58) * (2^16) = 1082.85057
      //uint16_t conv_factor_cm = 1083;
      //sonar_alt_cm_bfp = conv_factor_cm*sonar_filter_val;
      //sonar_filtered = conv_factor_cm*sonar_filter_val;

      //((69 / 72) / 58) / 100 * (2^8) = 0.0422988506
      float conv_factor_m = 0.0422988506;
      float alt_m_bfp_fl = conv_factor_m*sonar_filter_val;
      sonar_filtered = alt_m_bfp_fl;
      //ins_sonar_initialised = TRUE;
      ins_update_sonar();
      //sonar_filtered = conv_factor_cm*sonar_filter_val;
      //DOWNLINK_SEND_VFF(DefaultChannel, &alt_mm_flt,0,0,0,0,0,0);
      DOWNLINK_SEND_INS_Z(DefaultChannel, &sonar_filtered,&sonar_spike_cnt,0, 0);
    }
}
Ejemplo n.º 2
0
static void send_ins_z(void) {
  DOWNLINK_SEND_INS_Z(DefaultChannel, DefaultDevice,
      &ins_impl.baro_z, &ins_impl.ltp_pos.z, &ins_impl.ltp_speed.z, &ins_impl.ltp_accel.z);
}
Ejemplo n.º 3
0
static void send_ins_z(void) {
    static const float fake_baro_z = 0.0;
    DOWNLINK_SEND_INS_Z(DefaultChannel, DefaultDevice,
                        &fake_baro_z, &ins_impl.ltp_pos.z, &ins_impl.ltp_speed.z, &ins_impl.ltp_accel.z);
}