NXPCUP-libary
Library for car's control board on NXPCUP competition based on the Mbed framework.
MotorControl.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include "mbed.h"
4 
5 #include "atoms/control/pid.h"
6 
7 #include "Encoder.h"
8 #include "Motor.h"
9 
10 namespace nxpcup {
11 
12 class MotorControl {
13 public:
14  struct Config {
15  float coefficientP = 0.007;
16  float coefficientI = 0.008;
18  float antiWindup = 0.5;
19  float nullSpeedThreshold = 0.05;
20  float nullSpeedPower = 0.2;
21  };
22 
30  MotorControl(Motor& motor, Encoder& encoder, Config config)
31  : m_motor(motor)
32  , m_encoder(encoder)
33  , m_config(config)
34  {
35  m_motorMaxPower = m_motor.maxPower();
36  }
37 
43  void setSpeed(float desiredSpeed) { m_desiredSpeed = desiredSpeed; }
44 
50  float desiredSpeed() const
51  {
52  return m_desiredSpeed;
53  }
54 
60  float actualSpeed() const
61  {
62  return m_actualSpeed;
63  }
64 
71  void regulate(uint16_t timeSinceLastCallUs)
72  {
73  m_actualSpeed = m_encoder.speed();
74 
75  float error = m_desiredSpeed - m_actualSpeed;
76  m_errorSum += m_config.coefficientI * error;
77  if (m_errorSum > m_config.antiWindup) {
78  m_errorSum = m_config.antiWindup;
79  }
80  if (m_errorSum < 0) {
81  m_errorSum = 0;
82  }
83 
84  float output = m_config.coefficientP * error + m_errorSum; // normalized output <0.0 - 1.0>
85  if (output > 1) { // clamp the output
86  output = 1;
87  } else if (output < 0 || m_desiredSpeed < m_config.nullSpeedThreshold) { // turn off regulation around zero/low desire speed
88  output = 0;
89  m_errorSum = 0;
90  } else if ( // solve slower start of robot
91  m_actualSpeed < m_config.nullSpeedThreshold && output > m_config.nullSpeedPower) {
92  output = m_config.nullSpeedPower;
93  m_errorSum = 0;
94  }
95  output = output * m_motorMaxPower; // output <-1000; 1000>
96  m_motor.power(int32_t(output));
97  }
98 
102  Config config() const
103  {
104  return m_config;
105  }
106 
113  {
114  m_config = config;
115  reset();
116  }
117 
121  void reset()
122  {
123  m_motor.power(0);
124  m_errorSum = 0;
125  }
126 
127 private:
128  Motor& m_motor;
129  Encoder& m_encoder;
130  Config m_config;
131 
132  float m_desiredSpeed = 0; //[m/s]
133  float m_actualSpeed = 0; //[m/s]
134  uint16_t m_motorMaxPower = 0;
135  float m_errorSum = 0;
136 };
137 
138 } // namespace nxpcup
MotorControl(Motor &motor, Encoder &encoder, Config config)
Definition: MotorControl.h:30
float nullSpeedPower
Definition: MotorControl.h:20
void reset()
Definition: MotorControl.h:121
Definition: Motor.h:10
float actualSpeed() const
Definition: MotorControl.h:60
float desiredSpeed() const
Definition: MotorControl.h:50
float coefficientI
Definition: MotorControl.h:16
Definition: BorderDetector.h:6
void setConfig(Config &config)
Definition: MotorControl.h:112
float coefficientP
Definition: MotorControl.h:15
Config config() const
Definition: MotorControl.h:102
void setSpeed(float desiredSpeed)
Definition: MotorControl.h:43
void regulate(uint16_t timeSinceLastCallUs)
Definition: MotorControl.h:71
Definition: MotorControl.h:14
float nullSpeedThreshold
Definition: MotorControl.h:19
Definition: MotorControl.h:12
float antiWindup
Definition: MotorControl.h:18
Definition: Encoder.h:7