@@ -105,6 +105,18 @@ static void update_stall_state(pbio_observer_t *obs, uint32_t time, pbio_dcmotor
105105 }
106106}
107107
108+ /**
109+ * Gets observer feedback torque to keep it close to measured value.
110+ *
111+ * @param [in] obs The observer instance.
112+ * @param [in] angle Measured angle used to correct the model.
113+ * @return Feedback torque in uNm.
114+ */
115+ int32_t pbio_observer_get_feedback_torque (pbio_observer_t * obs , const pbio_angle_t * angle ) {
116+ int32_t error = pbio_angle_diff_mdeg (angle , & obs -> angle );
117+ return pbio_control_settings_mul_by_gain (error , obs -> model -> gain );
118+ }
119+
108120/**
109121 * Predicts next system state and corrects the model using a measurement.
110122 *
@@ -125,10 +137,10 @@ void pbio_observer_update(pbio_observer_t *obs, uint32_t time, const pbio_angle_
125137 // Update numerical derivative as speed sanity check.
126138 obs -> speed_numeric = pbio_differentiator_get_speed (& obs -> differentiator , angle );
127139
128- int32_t error = pbio_angle_diff_mdeg (angle , & obs -> angle );
129-
130140 // Apply observer error feedback as voltage.
131- int32_t feedback_voltage = pbio_observer_torque_to_voltage (m , pbio_control_settings_mul_by_gain (error , m -> gain ));
141+ int32_t feedback_voltage = pbio_observer_torque_to_voltage (m ,
142+ pbio_observer_get_feedback_torque (obs , angle )
143+ );
132144
133145 // Check stall condition.
134146 update_stall_state (obs , time , actuation , voltage , feedback_voltage );
0 commit comments