diff --git a/conf/airframes/examples/quadrotor_lisa_m_2_pwm_spektrum.xml b/conf/airframes/examples/quadrotor_lisa_m_2_pwm_spektrum.xml index 253ba6a66d..85cc9eb08b 100644 --- a/conf/airframes/examples/quadrotor_lisa_m_2_pwm_spektrum.xml +++ b/conf/airframes/examples/quadrotor_lisa_m_2_pwm_spektrum.xml @@ -216,6 +216,7 @@ + diff --git a/conf/telemetry/default_rotorcraft.xml b/conf/telemetry/default_rotorcraft.xml index 0d6b1979df..4fe4699ec6 100644 --- a/conf/telemetry/default_rotorcraft.xml +++ b/conf/telemetry/default_rotorcraft.xml @@ -19,6 +19,7 @@ + diff --git a/sw/airborne/firmwares/fixedwing/autopilot.h b/sw/airborne/firmwares/fixedwing/autopilot.h index c5b651f7b9..035755af5d 100644 --- a/sw/airborne/firmwares/fixedwing/autopilot.h +++ b/sw/airborne/firmwares/fixedwing/autopilot.h @@ -93,8 +93,8 @@ extern uint16_t vsupply; */ extern int32_t current; // milliAmpere -/** Fuel consumption (mAh) - * TODO: move to electrical subsystem +/** Energy consumption (mAh) + * This is the ap copy of the measurement from fbw */ extern float energy; diff --git a/sw/airborne/firmwares/fixedwing/main_ap.c b/sw/airborne/firmwares/fixedwing/main_ap.c index 60b0c2d776..fc79f5ee11 100644 --- a/sw/airborne/firmwares/fixedwing/main_ap.c +++ b/sw/airborne/firmwares/fixedwing/main_ap.c @@ -420,6 +420,7 @@ static inline void telecommand_task( void ) { vsupply = fbw_state->vsupply; current = fbw_state->current; + energy = fbw_state->energy; #ifdef RADIO_CONTROL if (!autopilot_flight_time) { @@ -517,7 +518,6 @@ void navigation_task( void ) { // climb_loop(); //4Hz } - energy += ((float)current) / 3600.0f * 0.25f; // mAh = mA * dt (4Hz -> hours) } diff --git a/sw/airborne/firmwares/rotorcraft/autopilot.c b/sw/airborne/firmwares/rotorcraft/autopilot.c index 82f2bd050b..2672c82fb2 100644 --- a/sw/airborne/firmwares/rotorcraft/autopilot.c +++ b/sw/airborne/firmwares/rotorcraft/autopilot.c @@ -132,6 +132,14 @@ static void send_status(void) { &electrical.vsupply, &time_sec); } +static void send_energy(void) { + const int16_t e = electrical.energy; + const float vsup = ((float)electrical.vsupply) / 10.0f; + const float curs = ((float)electrical.current) / 1000.0f; + const float power = vsup * curs; + DOWNLINK_SEND_ENERGY(DefaultChannel, DefaultDevice, &vsup, &curs, &e, &power); +} + static void send_fp(void) { int32_t carrot_up = -guidance_v_z_sp; DOWNLINK_SEND_ROTORCRAFT_FP(DefaultChannel, DefaultDevice, @@ -222,6 +230,7 @@ void autopilot_init(void) { register_periodic_telemetry(DefaultPeriodic, "ALIVE", send_alive); register_periodic_telemetry(DefaultPeriodic, "ROTORCRAFT_STATUS", send_status); + register_periodic_telemetry(DefaultPeriodic, "ENERGY", send_energy); register_periodic_telemetry(DefaultPeriodic, "ROTORCRAFT_FP", send_fp); register_periodic_telemetry(DefaultPeriodic, "ROTORCRAFT_CMD", send_rotorcraft_cmd); register_periodic_telemetry(DefaultPeriodic, "DL_VALUE", send_dl_value); diff --git a/sw/airborne/inter_mcu.h b/sw/airborne/inter_mcu.h index 789bb4dfba..f8f2eb0452 100644 --- a/sw/airborne/inter_mcu.h +++ b/sw/airborne/inter_mcu.h @@ -60,6 +60,7 @@ struct fbw_state { uint8_t nb_err; uint16_t vsupply; ///< 1e-1 V int32_t current; ///< milliAmps + float energy; ///< mAh }; struct ap_state { @@ -123,6 +124,7 @@ static inline void inter_mcu_fill_fbw_state (void) { fbw_state->vsupply = electrical.vsupply; fbw_state->current = electrical.current; + fbw_state->energy = electrical.energy; #if defined SINGLE_MCU /**Directly set the flag indicating to AP that shared buffer is available*/ inter_mcu_received_fbw = TRUE; diff --git a/sw/airborne/subsystems/electrical.c b/sw/airborne/subsystems/electrical.c index e7103e8075..20b9552518 100644 --- a/sw/airborne/subsystems/electrical.c +++ b/sw/airborne/subsystems/electrical.c @@ -85,6 +85,7 @@ static struct { void electrical_init(void) { electrical.vsupply = 0; electrical.current = 0; + electrical.energy = 0; electrical.bat_low = FALSE; electrical.bat_critical = FALSE; @@ -135,6 +136,8 @@ void electrical_periodic(void) { electrical.current = b - pow((pow(b,electrical_priv.nonlin_factor)-pow((b*x),electrical_priv.nonlin_factor)), (1./electrical_priv.nonlin_factor)); #endif /* ADC_CHANNEL_CURRENT */ + // mAh = mA * dt (10Hz -> hours) + electrical.energy += ((float)electrical.current) / 3600.0f / ELECTRICAL_PERIODIC_FREQ; if (electrical.vsupply < LOW_BAT_LEVEL * 10) { if (bat_low_counter > 0) diff --git a/sw/airborne/subsystems/electrical.h b/sw/airborne/subsystems/electrical.h index 81d70fbda2..b805949fb8 100644 --- a/sw/airborne/subsystems/electrical.h +++ b/sw/airborne/subsystems/electrical.h @@ -48,6 +48,7 @@ struct Electrical { uint16_t vsupply; ///< supply voltage in decivolts int32_t current; ///< current in milliamps int32_t consumed; ///< consumption in mAh + float energy; ///< consumed energy in mAh bool_t bat_low; ///< battery low status bool_t bat_critical; ///< battery critical status