adrc.c 949 B

12345678910111213141516171819202122232425262728293031323334353637383940
  1. #include "adrc.h"
  2. void ladrc_init(ladrc_t* adrc, float ts, float wo, float wc, float b0) {
  3. adrc->z1 = adrc->z2 = adrc->out = 0;
  4. adrc->ts = ts;
  5. adrc->b0 = b0;
  6. adrc->wcv = wc;
  7. adrc->p1 = 2 * wo;
  8. adrc->p2 = wo * wo;
  9. }
  10. float ladrc_run(ladrc_t *adrc, float in, float feedback) {
  11. float y = feedback;
  12. float u = adrc->out;
  13. //do eso
  14. float error = y - adrc->z1;
  15. adrc->z2 = adrc->z2 + adrc->ts * (error * adrc->p2);
  16. adrc->z1 = adrc->z1 + adrc->ts * (error * adrc->p1 + adrc->z2 + u * adrc->b0);
  17. //do error compestion
  18. float ref = in;
  19. float out = ((ref - adrc->z1) * adrc->wcv - adrc->z2) / adrc->b0;
  20. adrc->out = MATH_sat(out, adrc->out_min, adrc->out_max);
  21. return adrc->out;
  22. }
  23. void ladrc_reset(ladrc_t* adrc, float feedback, float out_init) {
  24. adrc->z1 = feedback;
  25. adrc->z2 = -out_init * adrc->b0;
  26. adrc->out = out_init;
  27. }
  28. void ladrc_copy(ladrc_t *dst, ladrc_t *src) {
  29. dst->z1 = src->z1;
  30. dst->z2 = src->z2;
  31. dst->out = src->out;
  32. }