Line data Source code
1 : #pragma once 2 : 3 : /* slew rate limiting filter. This is used to prevent oscillation of a 4 : * controller by modifying the controllers output based on a maximum 5 : * slew rate 6 : */ 7 : 8 : #include <stdint.h> 9 : #include "LowPassFilter.h" 10 : 11 : #define SLEWLIMITER_N_EVENTS 2 // number of positive and negative consecutive slew rate exceedance events recorded where a value of 2 corresponds to a complete cycle 12 : 13 : class SlewLimiter { 14 : public: 15 : SlewLimiter(const float &slew_rate_max, const float &slew_rate_tau); 16 : 17 : CLASS_NO_COPY(SlewLimiter); 18 : 19 : /* 20 : apply filter to sample, returning multiplier between 0 and 1 to keep 21 : output within slew rate 22 : */ 23 : float modifier(float sample, float dt); 24 : 25 : /* 26 : get last oscillation slew rate 27 : */ 28 144423234 : float get_slew_rate(void) const { 29 144423234 : return _output_slew_rate; 30 : } 31 : 32 : private: 33 : const float &slew_rate_max; 34 : const float &slew_rate_tau; 35 : LowPassFilterFloat slew_filter; 36 : float _output_slew_rate; 37 : float _modifier_slew_rate; 38 : float last_sample; 39 : float _max_pos_slew_rate; 40 : float _max_neg_slew_rate; 41 : uint32_t _max_pos_slew_event_ms; 42 : uint32_t _max_neg_slew_event_ms; 43 : uint8_t _pos_event_index; 44 : uint8_t _neg_event_index; 45 : uint32_t _pos_event_ms[SLEWLIMITER_N_EVENTS]; 46 : uint32_t _neg_event_ms[SLEWLIMITER_N_EVENTS]; 47 : bool _pos_event_stored; 48 : bool _neg_event_stored; 49 : };