1+ #include " PIDRegulator.h"
2+
3+ #include < array>
4+ #include < chrono>
5+ #include < cmath>
6+ #include < iostream>
7+ #include < vector>
8+
9+ void PIDRegulator::Init (std::array<float , 3 > _coeficients, int _loopsTicks, int _maxRPM) {
10+ kp_ = _coeficients[0 ];
11+ ki_ = _coeficients[1 ];
12+ kd_ = _coeficients[2 ];
13+
14+ loopsTicks_ = _loopsTicks;
15+ maxRPM_ = _maxRPM;
16+ lastTimePoint_ = std::chrono::high_resolution_clock::now ();
17+ // cout << "PID regulator initialized" << '\n';
18+ }
19+
20+ int PIDRegulator::Run (int setpoint, int ticks_value) {
21+ const auto kCurrentTimePoint = std::chrono::high_resolution_clock::now ();
22+ const std::chrono::duration<double , std::milli> kElapsedMilliseconds =
23+ kCurrentTimePoint - lastTimePoint_;
24+ lastTimePoint_ = kCurrentTimePoint ;
25+ const auto kTimeDt = static_cast <float >(kElapsedMilliseconds .count ());
26+
27+ const float kRevolutions = static_cast <float >(ticks_value) / static_cast <float >(loopsTicks_);
28+
29+ const float kInputPoint = static_cast <float >(
30+ std::round ((kRevolutions * SECONDSTOMINUTE * MILISECONDSTOSECOND) / kTimeDt )) *
31+ SPEEDINDEXMULTIPLIER;
32+ const float kError = static_cast <float >(setpoint) - kInputPoint ; // get rid of abs() !!!
33+ std::cout << " set point " << setpoint << " current point " << kInputPoint << " error " << kError << ' \n ' ;
34+
35+ const float kPTerm = kp_ * kError ;
36+
37+ integral_ += kError * kTimeDt ;
38+ if (integral_ > integralLimit_) {
39+ integral_ = integralLimit_;
40+ }
41+ if (integral_ < -integralLimit_) {
42+ integral_ = -integralLimit_;
43+ }
44+
45+ const float kITerm = ki_ * integral_;
46+
47+ const float kDerivativePart = (kTimeDt > 0 ) ? (kError - previousError_) / kTimeDt : 0 .0F ;
48+ const float kDTerm = kd_ * kDerivativePart ;
49+
50+ previousError_ = kError ;
51+
52+ return static_cast <int >(kPTerm + kITerm + kDTerm );
53+ }
0 commit comments