28
28
29
29
#define CONTROL_LIMIT 4095
30
30
#define MEM_SIZE 5
31
+ #define CONTROL_MODE_NORMAL 0
32
+ #define CONTROL_MODE_LINEAR 1
31
33
32
34
class MotorControl {
33
35
private:
36
+
37
+ uint8_t control_mode;
38
+
34
39
float kp;
35
40
float ki;
36
41
float kd;
37
42
38
43
float travel;
39
44
float reference;
40
45
46
+ float trip;
47
+ float iterations;
48
+ float start_value;
49
+ float end_value;
50
+ float step_size;
51
+ float step;
52
+ int step_index;
53
+ float interpolation;
54
+
41
55
float controller_period;
42
56
float conversion_factor;
43
57
float measure;
@@ -56,10 +70,15 @@ class MotorControl{
56
70
57
71
PidController * vel_pid;
58
72
59
- MotorControl (DCmotor * _motor, Encoder * _encoder, const float _kp, const float _ki, const float _kd, const float _controller_period){
73
+ MotorControl (DCmotor * _motor, Encoder * _encoder, const float _kp, const float _ki, const float _kd,
74
+ const float _controller_period,
75
+ const uint8_t _control_mode = CONTROL_MODE_LINEAR, const float _step_size=5.0 ){
60
76
motor = _motor;
61
77
encoder = _encoder;
62
78
79
+ control_mode = _control_mode;
80
+
81
+
63
82
kp = _kp;
64
83
ki = _ki;
65
84
kd = _kd;
@@ -69,6 +88,15 @@ class MotorControl{
69
88
travel=0.0 ;
70
89
reference = 0.0 ;
71
90
91
+ trip=0.0 ;
92
+ iterations=0.0 ;
93
+ start_value=0.0 ;
94
+ end_value=0.0 ;
95
+ step_size=_step_size;
96
+ step=0.0 ;
97
+ step_index=0 ;
98
+ interpolation=0.0 ;
99
+
72
100
measure = 0.0 ;
73
101
last_measure = 0.0 ;
74
102
@@ -86,20 +114,16 @@ class MotorControl{
86
114
vel_pid->reset ();
87
115
clearMemory ();
88
116
}
89
-
117
+ /*
90
118
bool setRPM(const float ref){
91
119
if ((ref<MOTOR_LIMIT)&&(ref>-MOTOR_LIMIT)){
92
120
reference = ref;
93
121
vel_pid->setReference(reference);
94
- /*
95
- if ((reference)<0.1&&(reference>-0.1)){
96
- vel_pid->reset();
97
- }
98
- */
99
122
return true;
100
123
}
101
124
return false;
102
125
}
126
+ */
103
127
104
128
float checkLimits (float value){
105
129
if (value>CONTROL_LIMIT){
@@ -191,6 +215,26 @@ class MotorControl{
191
215
192
216
*/
193
217
218
+
219
+ bool setRPM (const float ref){
220
+ if ((ref<MOTOR_LIMIT)&&(ref>-MOTOR_LIMIT)){
221
+ reference = ref;
222
+ if (control_mode==CONTROL_MODE_LINEAR){
223
+ start_value=interpolation;
224
+ end_value=reference;
225
+ trip=0.0 ;
226
+ iterations=abs (end_value-start_value)/step_size;
227
+ step=1.0 /iterations;
228
+ step_index=0 ;
229
+ }
230
+ else if (control_mode==CONTROL_MODE_NORMAL){
231
+ vel_pid->setReference (reference);
232
+ }
233
+ return true ;
234
+ }
235
+ return false ;
236
+ }
237
+
194
238
void update (){
195
239
196
240
measure = encoder->getCount ();
@@ -224,7 +268,25 @@ class MotorControl{
224
268
measure = measure*conversion_factor;
225
269
*/
226
270
227
-
271
+
272
+ // vel_pid->update(measure);
273
+ // motor->setSpeed(vel_pid->getControlOutput());
274
+
275
+
276
+ if (control_mode==CONTROL_MODE_LINEAR){
277
+ if (step_index<iterations){
278
+ step_index++;
279
+ trip+=step;
280
+ interpolation=trip*(end_value-start_value)+start_value;
281
+ if (abs (interpolation)>abs (reference)){
282
+ interpolation=reference;
283
+ }
284
+ }
285
+ vel_pid->setReference (interpolation);
286
+ }
287
+ else if (control_mode==CONTROL_MODE_NORMAL){
288
+ vel_pid->setReference (reference);
289
+ }
228
290
229
291
230
292
vel_pid->update (measure);
@@ -247,6 +309,22 @@ class MotorControl{
247
309
return vel_pid->getError ();
248
310
}
249
311
312
+ void brake (){
313
+ reference=0.0 ;
314
+ trip=0.0 ;
315
+ iterations=0.0 ;
316
+ start_value=0.0 ;
317
+ end_value=0.0 ;
318
+ step=0.0 ;
319
+ step_index=0 ;
320
+ interpolation=0.0 ;
321
+ clearMemory ();
322
+
323
+ motor->setSpeed (0 );
324
+ vel_pid->setReference (0.0 );
325
+ vel_pid->reset ();
326
+ }
327
+
250
328
251
329
};
252
330
0 commit comments