adrc.c 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  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->last_z1 = adrc->last_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->last_z1;
  15. adrc->z2 = adrc->last_z2 + adrc->ts * (error * adrc->p2);
  16. adrc->z1 = adrc->last_z1 + adrc->ts * (error * adrc->p1 + adrc->z2 + u * adrc->b0);
  17. adrc->last_z2 = adrc->z2;
  18. adrc->last_z1 = adrc->z1;
  19. //do error compestion
  20. float ref = in;
  21. float out = ((ref - adrc->z1) * adrc->wcv - adrc->z2) / adrc->b0;
  22. adrc->out = MATH_sat(out, adrc->out_min, adrc->out_max);
  23. return adrc->out;
  24. }
  25. void ladrc_reset(ladrc_t* adrc, float feedback, float out_init) {
  26. adrc->last_z1 = feedback;
  27. adrc->last_z2 = -out_init * adrc->b0;
  28. adrc->out = adrc->last_z2;
  29. }
  30. void ladrc_copy(ladrc_t *dst, ladrc_t *src) {
  31. dst->z1 = src->z1;
  32. dst->z2 = src->z2;
  33. dst->last_z1 = src->last_z1;
  34. dst->last_z2 = src->last_z2;
  35. dst->out = src->out;
  36. }