-
Notifications
You must be signed in to change notification settings - Fork 0
/
pump.cpp
129 lines (108 loc) · 2.56 KB
/
pump.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
/**
* Defines gardener pump controller.
*/
#include "pump.h"
#include <algorithm>
#include <wiringPi.h>
using namespace gardener;
using namespace std;
const int Pump::deltaSpeed = 1;
const int Pump::dwellTime = 1;
const int Pump::dutyScaleBits = 2;
const int Pump::dutyDeadband = 623;
Pump::Pump(
const int fwdPin,
const int revPin,
ITimer &dwellTimer)
: fwdPin(fwdPin)
, revPin(revPin)
, dwellTimer(dwellTimer)
, currentSpeed(0)
, requestedSpeed(0)
, currentState(STEADY)
{
/* set PWM pins as output */
pinMode(this->fwdPin, PWM_OUTPUT);
pinMode(this->revPin, PWM_OUTPUT);
}
void Pump::requestChangeSpeed(const int newSpeed)
{
this->requestedSpeed = newSpeed;
}
bool Pump::isSpeedSteady(void)
{
return this->requestedSpeed == this->currentSpeed;
}
void Pump::transition(void)
{
switch (this->currentState)
{
case STEADY:
default:
if (!this->isSpeedSteady())
{
this->currentState = CHANGE;
}
break;
case CHANGE:
if (this->isSpeedSteady())
{
this->currentState = STEADY;
}
else
{
this->currentState = DWELL;
}
break;
case DWELL:
if (this->dwellTimer.isExpired())
{
this->currentState = CHANGE;
}
break;
}
}
void Pump::execute(void)
{
switch (this->currentState)
{
case STEADY:
case DWELL:
default:
break;
case CHANGE:
if (this->requestedSpeed > this->currentSpeed)
{
// Ramp up
this->setCurrentSpeed(min(
this->requestedSpeed,
this->currentSpeed + deltaSpeed));
}
else
{
// Ramp down
this->setCurrentSpeed(max(
this->requestedSpeed,
this->currentSpeed - deltaSpeed));
}
this->dwellTimer.reload(dwellTime);
break;
}
}
void Pump::setCurrentSpeed(const int newSpeed)
{
int fwdDuty = 0;
int revDuty = 0;
if (newSpeed > 0)
{
fwdDuty = (newSpeed << dutyScaleBits) + dutyDeadband;
}
else if (newSpeed < 0)
{
revDuty = ((-newSpeed) << dutyScaleBits) + dutyDeadband;
}
/* provide PWM value for duty cycle */
pwmWrite(this->fwdPin, fwdDuty);
pwmWrite(this->revPin, revDuty);
this->currentSpeed = newSpeed;
}