@@ -105,6 +105,18 @@ static void update_stall_state(pbio_observer_t *obs, uint32_t time, pbio_dcmotor
105
105
}
106
106
}
107
107
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
+
108
120
/**
109
121
* Predicts next system state and corrects the model using a measurement.
110
122
*
@@ -125,10 +137,10 @@ void pbio_observer_update(pbio_observer_t *obs, uint32_t time, const pbio_angle_
125
137
// Update numerical derivative as speed sanity check.
126
138
obs -> speed_numeric = pbio_differentiator_get_speed (& obs -> differentiator , angle );
127
139
128
- int32_t error = pbio_angle_diff_mdeg (angle , & obs -> angle );
129
-
130
140
// 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
+ );
132
144
133
145
// Check stall condition.
134
146
update_stall_state (obs , time , actuation , voltage , feedback_voltage );
0 commit comments