| User | Revision | Line number | New contents of line |
| yuron |
0:f73c1b076ae4
|
1
|
/* タイマ割り込みを使用して回転数(RPS)を取得し表示するプログラム */
|
| yuron |
0:f73c1b076ae4
|
2
|
/* これまでの計算手順では回転数が取得できないことが判明し、改善済である */
|
| yuron |
0:f73c1b076ae4
|
3
|
/* 具体的には取得したパルス数を分解能で割り算→掛け算でRPSへ変換から */
|
| yuron |
0:f73c1b076ae4
|
4
|
/* 取得したパルス数を掛け算→分解能で割ってRPSへ変換としている。 */
|
| yuron |
0:f73c1b076ae4
|
5
|
/* ロリコンにはTIM2~TIM5がいいらしい(Nucleo_F401re) */
|
| yuron |
0:f73c1b076ae4
|
6
|
/* TIM2(CH1: NC, CH2: D3(PB_3), CH3: D6(PB_10), CH4: NC) */
|
| yuron |
0:f73c1b076ae4
|
7
|
/* TIM3(CH1: D5(PB_4), CH2: D9(PC_7), CH3: NC, CH4: NC) */
|
| yuron |
0:f73c1b076ae4
|
8
|
/* TIM4(CH1: D10(PB_6), CH2: NC, CH3: NC, CH4: NC) */
|
| yuron |
0:f73c1b076ae4
|
9
|
/* TIM5(CH1: NC, CH2: NC, CH3: NC, CH4: NC) */
|
| yuron |
0:f73c1b076ae4
|
10
|
/* 2018/6/9追記 */
|
| yuron |
0:f73c1b076ae4
|
11
|
/* ついに回転数の!PI制御を実現できました。 */
|
| yuron |
0:f73c1b076ae4
|
12
|
/* タイマ割込みで角速度を取得してみようと思います。 */
|
| yuron |
0:f73c1b076ae4
|
13
|
|
| yuron |
0:f73c1b076ae4
|
14
|
#include "mbed.h"
|
| yuron |
0:f73c1b076ae4
|
15
|
#include "math.h"
|
| yuron |
0:f73c1b076ae4
|
16
|
#include "QEI.h"
|
| yuron |
0:f73c1b076ae4
|
17
|
#include "PID.h"
|
| yuron |
0:f73c1b076ae4
|
18
|
#define PI 3.14159265359
|
| yuron |
0:f73c1b076ae4
|
19
|
|
| yuron |
0:f73c1b076ae4
|
20
|
PID controller(0.7, 0.7, 0.0, 0.001);
|
| yuron |
0:f73c1b076ae4
|
21
|
PID RF(0.5, 0.3, 0.0, 0.001);
|
| yuron |
0:f73c1b076ae4
|
22
|
PID RB(0.5, 0.3, 0.0, 0.001);
|
| yuron |
0:f73c1b076ae4
|
23
|
PID LF(0.5, 0.3, 0.0, 0.001);
|
| yuron |
0:f73c1b076ae4
|
24
|
PID LB(0.5, 0.3, 0.0, 0.001);
|
| yuron |
0:f73c1b076ae4
|
25
|
I2C i2c(PB_3, PB_10); //SDA, SCL
|
| yuron |
0:f73c1b076ae4
|
26
|
//Serial pc(USBTX, USBRX);
|
| yuron |
0:f73c1b076ae4
|
27
|
DigitalOut emergency(PA_13);
|
| yuron |
0:f73c1b076ae4
|
28
|
|
| yuron |
0:f73c1b076ae4
|
29
|
/* 以下446基板用 */
|
| yuron |
0:f73c1b076ae4
|
30
|
QEI wheel_LB(PA_1, PA_0, NC, 624);
|
| yuron |
0:f73c1b076ae4
|
31
|
QEI wheel_RB(PB_6, PB_7, NC, 624);
|
| yuron |
0:f73c1b076ae4
|
32
|
QEI wheel_LF(PB_4, PB_5, NC, 624);
|
| yuron |
0:f73c1b076ae4
|
33
|
QEI wheel_RF(PC_8, PC_9, NC, 624);
|
| yuron |
0:f73c1b076ae4
|
34
|
|
| yuron |
0:f73c1b076ae4
|
35
|
Ticker get_RPS;
|
| yuron |
0:f73c1b076ae4
|
36
|
Ticker print_RPS;
|
| yuron |
0:f73c1b076ae4
|
37
|
|
| yuron |
0:f73c1b076ae4
|
38
|
int rps_RF;
|
| yuron |
0:f73c1b076ae4
|
39
|
int rps_RB;
|
| yuron |
0:f73c1b076ae4
|
40
|
int rps_LF;
|
| yuron |
0:f73c1b076ae4
|
41
|
int rps_LB;
|
| yuron |
0:f73c1b076ae4
|
42
|
|
| yuron |
0:f73c1b076ae4
|
43
|
int rpm_RF;
|
| yuron |
0:f73c1b076ae4
|
44
|
int rpm_RB;
|
| yuron |
0:f73c1b076ae4
|
45
|
int rpm_LF;
|
| yuron |
0:f73c1b076ae4
|
46
|
int rpm_LB;
|
| yuron |
0:f73c1b076ae4
|
47
|
|
| yuron |
0:f73c1b076ae4
|
48
|
int pulse_RF;
|
| yuron |
0:f73c1b076ae4
|
49
|
int pulse_RB;
|
| yuron |
0:f73c1b076ae4
|
50
|
int pulse_LF;
|
| yuron |
0:f73c1b076ae4
|
51
|
int pulse_LB;
|
| yuron |
0:f73c1b076ae4
|
52
|
|
| yuron |
0:f73c1b076ae4
|
53
|
int counter_RF;
|
| yuron |
0:f73c1b076ae4
|
54
|
int counter_RB;
|
| yuron |
0:f73c1b076ae4
|
55
|
int counter_LF;
|
| yuron |
0:f73c1b076ae4
|
56
|
int counter_LB;
|
| yuron |
0:f73c1b076ae4
|
57
|
|
| yuron |
0:f73c1b076ae4
|
58
|
double a_v; /* 角速度 */
|
| yuron |
0:f73c1b076ae4
|
59
|
double n_v; /* 速度(秒速) */
|
| yuron |
0:f73c1b076ae4
|
60
|
double h_v; /* 速度(時速) */
|
| yuron |
0:f73c1b076ae4
|
61
|
double n_a; /* 加速度 */
|
| yuron |
0:f73c1b076ae4
|
62
|
|
| yuron |
0:f73c1b076ae4
|
63
|
char send_data[1];
|
| yuron |
0:f73c1b076ae4
|
64
|
char true_send_data[1];
|
| yuron |
0:f73c1b076ae4
|
65
|
|
| yuron |
0:f73c1b076ae4
|
66
|
char RF_data[1];
|
| yuron |
0:f73c1b076ae4
|
67
|
char RB_data[1];
|
| yuron |
0:f73c1b076ae4
|
68
|
char LF_data[1];
|
| yuron |
0:f73c1b076ae4
|
69
|
char LB_data[1];
|
| yuron |
0:f73c1b076ae4
|
70
|
char true_RF_data[1];
|
| yuron |
0:f73c1b076ae4
|
71
|
char true_RB_data[1];
|
| yuron |
0:f73c1b076ae4
|
72
|
char true_LF_data[1];
|
| yuron |
0:f73c1b076ae4
|
73
|
char true_LB_data[1];
|
| yuron |
0:f73c1b076ae4
|
74
|
|
| yuron |
0:f73c1b076ae4
|
75
|
/* ロリコン処理関数 */
|
| yuron |
0:f73c1b076ae4
|
76
|
void flip();
|
| yuron |
0:f73c1b076ae4
|
77
|
/* RPS表示関数 */
|
| yuron |
0:f73c1b076ae4
|
78
|
void flip2();
|
| yuron |
0:f73c1b076ae4
|
79
|
|
| yuron |
0:f73c1b076ae4
|
80
|
void flip(){
|
| yuron |
0:f73c1b076ae4
|
81
|
|
| yuron |
0:f73c1b076ae4
|
82
|
pulse_RF = wheel_RF.getPulses();
|
| yuron |
0:f73c1b076ae4
|
83
|
pulse_RB = wheel_RB.getPulses();
|
| yuron |
0:f73c1b076ae4
|
84
|
pulse_LF = wheel_LF.getPulses();
|
| yuron |
0:f73c1b076ae4
|
85
|
pulse_LB = wheel_LB.getPulses();
|
| yuron |
0:f73c1b076ae4
|
86
|
|
| yuron |
0:f73c1b076ae4
|
87
|
/* *rps変換 */
|
| yuron |
0:f73c1b076ae4
|
88
|
/*10ms*100 = 1s
|
| yuron |
0:f73c1b076ae4
|
89
|
counter_RB = pulse_RB * 100;
|
| yuron |
0:f73c1b076ae4
|
90
|
counter_LB = pulse_LB * 100;
|
| yuron |
0:f73c1b076ae4
|
91
|
*/
|
| yuron |
0:f73c1b076ae4
|
92
|
|
| yuron |
0:f73c1b076ae4
|
93
|
//40ms*25 = 1s
|
| yuron |
0:f73c1b076ae4
|
94
|
counter_RF = pulse_RF * 25;
|
| yuron |
0:f73c1b076ae4
|
95
|
counter_RB = pulse_RB * 25;
|
| yuron |
0:f73c1b076ae4
|
96
|
counter_LF = pulse_LF * 25;
|
| yuron |
0:f73c1b076ae4
|
97
|
counter_LB = pulse_LB * 25;
|
| yuron |
0:f73c1b076ae4
|
98
|
|
| yuron |
0:f73c1b076ae4
|
99
|
/*
|
| yuron |
0:f73c1b076ae4
|
100
|
//100ms*10 = 1s
|
| yuron |
0:f73c1b076ae4
|
101
|
counter_RB = pulse_RB * 10;
|
| yuron |
0:f73c1b076ae4
|
102
|
counter_LB = pulse_LB * 10;
|
| yuron |
0:f73c1b076ae4
|
103
|
*/
|
| yuron |
0:f73c1b076ae4
|
104
|
|
| yuron |
0:f73c1b076ae4
|
105
|
/* /分解能 */
|
| yuron |
0:f73c1b076ae4
|
106
|
rps_RF = counter_RF / 100;
|
| yuron |
0:f73c1b076ae4
|
107
|
rps_RB = counter_RB / 100;
|
| yuron |
0:f73c1b076ae4
|
108
|
rps_LF = counter_LF / 100;
|
| yuron |
0:f73c1b076ae4
|
109
|
rps_LB = counter_LB / 100;
|
| yuron |
0:f73c1b076ae4
|
110
|
|
| yuron |
0:f73c1b076ae4
|
111
|
rpm_RF = pulse_RF * 25 * 60 / 100;
|
| yuron |
0:f73c1b076ae4
|
112
|
rpm_RB = pulse_RB * 25 * 60 / 100;
|
| yuron |
0:f73c1b076ae4
|
113
|
rpm_LF = pulse_LF * 25 * 60 / 100;
|
| yuron |
0:f73c1b076ae4
|
114
|
rpm_LB = pulse_LB * 25 * 60 / 100;
|
| yuron |
0:f73c1b076ae4
|
115
|
|
| yuron |
0:f73c1b076ae4
|
116
|
/*
|
| yuron |
0:f73c1b076ae4
|
117
|
rps[0] = counter_RB / 100;
|
| yuron |
0:f73c1b076ae4
|
118
|
rps[1] = counter_LB / 100;
|
| yuron |
0:f73c1b076ae4
|
119
|
|
| yuron |
0:f73c1b076ae4
|
120
|
rpm[0] = pulse_RB * 25 * 60 / 100;
|
| yuron |
0:f73c1b076ae4
|
121
|
rpm[1] = pulse_LB * 25 * 60 / 100;
|
| yuron |
0:f73c1b076ae4
|
122
|
*/
|
| yuron |
0:f73c1b076ae4
|
123
|
|
| yuron |
0:f73c1b076ae4
|
124
|
/* RPMから角速度へ変換 */
|
| yuron |
0:f73c1b076ae4
|
125
|
a_v = rpm_LB * PI / 30;
|
| yuron |
0:f73c1b076ae4
|
126
|
|
| yuron |
0:f73c1b076ae4
|
127
|
/* RPMから速度(秒速)へ変換 */
|
| yuron |
0:f73c1b076ae4
|
128
|
/* タイヤ半径を0.05[m]とする */
|
| yuron |
0:f73c1b076ae4
|
129
|
n_v = 0.05 * 2 * PI * rpm_LB / 60;
|
| yuron |
0:f73c1b076ae4
|
130
|
|
| yuron |
0:f73c1b076ae4
|
131
|
/* 速度(秒速)から速度(時速)へ変換 */
|
| yuron |
0:f73c1b076ae4
|
132
|
h_v = n_v * 3600 / 1000;
|
| yuron |
0:f73c1b076ae4
|
133
|
|
| yuron |
0:f73c1b076ae4
|
134
|
//n_a = n_v /
|
| yuron |
0:f73c1b076ae4
|
135
|
|
| yuron |
0:f73c1b076ae4
|
136
|
/*
|
| yuron |
0:f73c1b076ae4
|
137
|
if(rpm[1] < 200){
|
| yuron |
0:f73c1b076ae4
|
138
|
send_data[0]--;
|
| yuron |
0:f73c1b076ae4
|
139
|
}
|
| yuron |
0:f73c1b076ae4
|
140
|
else if(rpm[1] > 250){
|
| yuron |
0:f73c1b076ae4
|
141
|
send_data[1]++;
|
| yuron |
0:f73c1b076ae4
|
142
|
}
|
| yuron |
0:f73c1b076ae4
|
143
|
*/
|
| yuron |
0:f73c1b076ae4
|
144
|
|
| yuron |
0:f73c1b076ae4
|
145
|
//pc.printf("RF: %d RB: %d LF: %d LB: %d\n", rpm_RF, rpm_RB, rpm_LF, rpm_LB);
|
| yuron |
0:f73c1b076ae4
|
146
|
//pc.printf("%d\n", abs(rpm_RF));
|
| yuron |
0:f73c1b076ae4
|
147
|
//pc.printf("%lf\n", n_v);
|
| yuron |
0:f73c1b076ae4
|
148
|
//pc.printf("%lf\n", h_v);
|
| yuron |
0:f73c1b076ae4
|
149
|
//pc.printf("rpm: %d n_v: %lf\n", rpm[1], n_v);
|
| yuron |
0:f73c1b076ae4
|
150
|
|
| yuron |
0:f73c1b076ae4
|
151
|
wheel_RF.reset();
|
| yuron |
0:f73c1b076ae4
|
152
|
wheel_RB.reset();
|
| yuron |
0:f73c1b076ae4
|
153
|
wheel_LF.reset();
|
| yuron |
0:f73c1b076ae4
|
154
|
wheel_LB.reset();
|
| yuron |
0:f73c1b076ae4
|
155
|
}
|
| yuron |
0:f73c1b076ae4
|
156
|
|
| yuron |
0:f73c1b076ae4
|
157
|
void flip2()
|
| yuron |
0:f73c1b076ae4
|
158
|
{
|
| yuron |
0:f73c1b076ae4
|
159
|
//pc.printf("RPS_RB: %d RPS_LB: %d\n", abs(rps[0]), abs(rps[1]));
|
| yuron |
0:f73c1b076ae4
|
160
|
//pc.printf("RPM_RB: %d RPM_LB: %d\n", abs(rpm[0]), abs(rpm[1]));
|
| yuron |
0:f73c1b076ae4
|
161
|
//pc.printf("%d\n", rpm[1]);
|
| yuron |
0:f73c1b076ae4
|
162
|
//pc.printf("%lf\n", a_v);
|
| yuron |
0:f73c1b076ae4
|
163
|
//pc.printf("rpm: %d a_v: %lf\n", rpm[1], a_v);
|
| yuron |
0:f73c1b076ae4
|
164
|
}
|
| yuron |
0:f73c1b076ae4
|
165
|
|
| yuron |
0:f73c1b076ae4
|
166
|
void PID()
|
| yuron |
0:f73c1b076ae4
|
167
|
{
|
| yuron |
0:f73c1b076ae4
|
168
|
// センサ出力値の最小、最大
|
| yuron |
0:f73c1b076ae4
|
169
|
//RF.setInputLimits(0, 1100);
|
| yuron |
0:f73c1b076ae4
|
170
|
RF.setInputLimits(-400, 400);
|
| yuron |
0:f73c1b076ae4
|
171
|
RB.setInputLimits(-400, 400);
|
| yuron |
0:f73c1b076ae4
|
172
|
LF.setInputLimits(-400, 400);
|
| yuron |
0:f73c1b076ae4
|
173
|
LB.setInputLimits(-400, 400);
|
| yuron |
0:f73c1b076ae4
|
174
|
|
| yuron |
0:f73c1b076ae4
|
175
|
// 制御量の最小、最大
|
| yuron |
0:f73c1b076ae4
|
176
|
RF.setOutputLimits(0x01, 0x37);
|
| yuron |
0:f73c1b076ae4
|
177
|
RB.setOutputLimits(0x01, 0x37);
|
| yuron |
0:f73c1b076ae4
|
178
|
LF.setOutputLimits(0x01, 0x37);
|
| yuron |
0:f73c1b076ae4
|
179
|
LB.setOutputLimits(0x01, 0x37);
|
| yuron |
0:f73c1b076ae4
|
180
|
|
| yuron |
0:f73c1b076ae4
|
181
|
// よくわからんやつ
|
| yuron |
0:f73c1b076ae4
|
182
|
RF.setMode(AUTO_MODE);
|
| yuron |
0:f73c1b076ae4
|
183
|
RB.setMode(AUTO_MODE);
|
| yuron |
0:f73c1b076ae4
|
184
|
LF.setMode(AUTO_MODE);
|
| yuron |
0:f73c1b076ae4
|
185
|
LB.setMode(AUTO_MODE);
|
| yuron |
0:f73c1b076ae4
|
186
|
|
| yuron |
0:f73c1b076ae4
|
187
|
// 目標値
|
| yuron |
0:f73c1b076ae4
|
188
|
RF.setSetPoint(300);
|
| yuron |
0:f73c1b076ae4
|
189
|
RB.setSetPoint(300);
|
| yuron |
0:f73c1b076ae4
|
190
|
LF.setSetPoint(300);
|
| yuron |
0:f73c1b076ae4
|
191
|
LB.setSetPoint(300);
|
| yuron |
0:f73c1b076ae4
|
192
|
|
| yuron |
0:f73c1b076ae4
|
193
|
// センサ出力
|
| yuron |
0:f73c1b076ae4
|
194
|
RF.setProcessValue(abs(rpm_RF));
|
| yuron |
0:f73c1b076ae4
|
195
|
RB.setProcessValue(abs(rpm_RB));
|
| yuron |
0:f73c1b076ae4
|
196
|
LF.setProcessValue(abs(rpm_LF));
|
| yuron |
0:f73c1b076ae4
|
197
|
LB.setProcessValue(abs(rpm_LB));
|
| yuron |
0:f73c1b076ae4
|
198
|
|
| yuron |
0:f73c1b076ae4
|
199
|
// 制御量(計算結果)
|
| yuron |
0:f73c1b076ae4
|
200
|
RF_data[0] = RF.compute();
|
| yuron |
0:f73c1b076ae4
|
201
|
RB_data[0] = RB.compute();
|
| yuron |
0:f73c1b076ae4
|
202
|
LF_data[0] = LF.compute();
|
| yuron |
0:f73c1b076ae4
|
203
|
LB_data[0] = LB.compute();
|
| yuron |
0:f73c1b076ae4
|
204
|
|
| yuron |
0:f73c1b076ae4
|
205
|
// 制御量をPWM値に変換
|
| yuron |
0:f73c1b076ae4
|
206
|
true_RF_data[0] = 0x38 - RF_data[0];
|
| yuron |
0:f73c1b076ae4
|
207
|
true_RB_data[0] = 0x38 - RB_data[0];
|
| yuron |
0:f73c1b076ae4
|
208
|
true_LF_data[0] = 0x38 - LF_data[0];
|
| yuron |
0:f73c1b076ae4
|
209
|
true_LB_data[0] = 0x38 - LB_data[0];
|
| yuron |
0:f73c1b076ae4
|
210
|
}
|
| yuron |
0:f73c1b076ae4
|
211
|
|
| yuron |
0:f73c1b076ae4
|
212
|
int main(void)
|
| yuron |
0:f73c1b076ae4
|
213
|
{
|
| yuron |
0:f73c1b076ae4
|
214
|
emergency = 0;
|
| yuron |
0:f73c1b076ae4
|
215
|
send_data[0] = 0x40;
|
| yuron |
0:f73c1b076ae4
|
216
|
i2c.write(0xA0, send_data, 1);
|
| yuron |
0:f73c1b076ae4
|
217
|
i2c.write(0xA2, send_data, 1);
|
| yuron |
0:f73c1b076ae4
|
218
|
i2c.write(0xA4, send_data, 1);
|
| yuron |
0:f73c1b076ae4
|
219
|
i2c.write(0xA6, send_data, 1);
|
| yuron |
0:f73c1b076ae4
|
220
|
wait(0.1);
|
| yuron |
0:f73c1b076ae4
|
221
|
|
| yuron |
0:f73c1b076ae4
|
222
|
/* 加減速処理を入れた場合処理サイクルの最小周期は40msであった(2018/5/12) */
|
| yuron |
0:f73c1b076ae4
|
223
|
get_RPS.attach_us(&flip, 40000);
|
| yuron |
0:f73c1b076ae4
|
224
|
//get_RPS.attach_us(&flip, 100000);
|
| yuron |
0:f73c1b076ae4
|
225
|
|
| yuron |
0:f73c1b076ae4
|
226
|
//RPS表示(0.1sサイクル)
|
| yuron |
0:f73c1b076ae4
|
227
|
//print_RPS.attach(&flip2, 0.1);
|
| yuron |
0:f73c1b076ae4
|
228
|
|
| yuron |
0:f73c1b076ae4
|
229
|
while(1)
|
| yuron |
0:f73c1b076ae4
|
230
|
{
|
| yuron |
0:f73c1b076ae4
|
231
|
|
| yuron |
0:f73c1b076ae4
|
232
|
PID();
|
| yuron |
0:f73c1b076ae4
|
233
|
i2c.write(0xA0, true_RF_data, 1);
|
| yuron |
0:f73c1b076ae4
|
234
|
i2c.write(0xA2, true_RB_data, 1);
|
| yuron |
0:f73c1b076ae4
|
235
|
i2c.write(0xA4, true_LB_data, 1);
|
| yuron |
0:f73c1b076ae4
|
236
|
i2c.write(0xA6, true_LF_data, 1);
|
| yuron |
0:f73c1b076ae4
|
237
|
|
| yuron |
0:f73c1b076ae4
|
238
|
/*
|
| yuron |
0:f73c1b076ae4
|
239
|
// センサ出力値の最小、最大
|
| yuron |
0:f73c1b076ae4
|
240
|
RF.setInputLimits(0, 1100);
|
| yuron |
0:f73c1b076ae4
|
241
|
RB.setInputLimits(0, 1100);
|
| yuron |
0:f73c1b076ae4
|
242
|
LF.setInputLimits(0, 1100);
|
| yuron |
0:f73c1b076ae4
|
243
|
LB.setInputLimits(0, 1100);
|
| yuron |
0:f73c1b076ae4
|
244
|
|
| yuron |
0:f73c1b076ae4
|
245
|
// 制御量の最小、最大
|
| yuron |
0:f73c1b076ae4
|
246
|
RF.setOutputLimits(0x01, 0x37);
|
| yuron |
0:f73c1b076ae4
|
247
|
RB.setOutputLimits(0x01, 0x37);
|
| yuron |
0:f73c1b076ae4
|
248
|
LF.setOutputLimits(0x01, 0x37);
|
| yuron |
0:f73c1b076ae4
|
249
|
LB.setOutputLimits(0x01, 0x37);
|
| yuron |
0:f73c1b076ae4
|
250
|
|
| yuron |
0:f73c1b076ae4
|
251
|
// よくわからんやつ
|
| yuron |
0:f73c1b076ae4
|
252
|
RF.setMode(AUTO_MODE);
|
| yuron |
0:f73c1b076ae4
|
253
|
RB.setMode(AUTO_MODE);
|
| yuron |
0:f73c1b076ae4
|
254
|
LF.setMode(AUTO_MODE);
|
| yuron |
0:f73c1b076ae4
|
255
|
LB.setMode(AUTO_MODE);
|
| yuron |
0:f73c1b076ae4
|
256
|
|
| yuron |
0:f73c1b076ae4
|
257
|
// 目標値
|
| yuron |
0:f73c1b076ae4
|
258
|
RF.setSetPoint(400);
|
| yuron |
0:f73c1b076ae4
|
259
|
RB.setSetPoint(400);
|
| yuron |
0:f73c1b076ae4
|
260
|
LF.setSetPoint(400);
|
| yuron |
0:f73c1b076ae4
|
261
|
LB.setSetPoint(400);
|
| yuron |
0:f73c1b076ae4
|
262
|
|
| yuron |
0:f73c1b076ae4
|
263
|
// センサ出力
|
| yuron |
0:f73c1b076ae4
|
264
|
RF.setProcessValue(abs(rpm_RF));
|
| yuron |
0:f73c1b076ae4
|
265
|
RB.setProcessValue(abs(rpm_RB));
|
| yuron |
0:f73c1b076ae4
|
266
|
LF.setProcessValue(abs(rpm_LF));
|
| yuron |
0:f73c1b076ae4
|
267
|
LB.setProcessValue(abs(rpm_LB));
|
| yuron |
0:f73c1b076ae4
|
268
|
|
| yuron |
0:f73c1b076ae4
|
269
|
// 制御量(計算結果)
|
| yuron |
0:f73c1b076ae4
|
270
|
RF_data[0] = RF.compute();
|
| yuron |
0:f73c1b076ae4
|
271
|
RB_data[0] = RB.compute();
|
| yuron |
0:f73c1b076ae4
|
272
|
LF_data[0] = LF.compute();
|
| yuron |
0:f73c1b076ae4
|
273
|
LB_data[0] = LB.compute();
|
| yuron |
0:f73c1b076ae4
|
274
|
|
| yuron |
0:f73c1b076ae4
|
275
|
// 制御量をPWM値に変換
|
| yuron |
0:f73c1b076ae4
|
276
|
true_RF_data[0] = 0x38 - RF_data[0];
|
| yuron |
0:f73c1b076ae4
|
277
|
true_RB_data[0] = 0x38 - RB_data[0];
|
| yuron |
0:f73c1b076ae4
|
278
|
true_LF_data[0] = 0x38 - LF_data[0];
|
| yuron |
0:f73c1b076ae4
|
279
|
true_LB_data[0] = 0x38 - LB_data[0];
|
| yuron |
0:f73c1b076ae4
|
280
|
*/
|
| yuron |
0:f73c1b076ae4
|
281
|
|
| yuron |
0:f73c1b076ae4
|
282
|
/*
|
| yuron |
0:f73c1b076ae4
|
283
|
// センサ出力値の最小、最大
|
| yuron |
0:f73c1b076ae4
|
284
|
controller.setInputLimits(0, 1100);
|
| yuron |
0:f73c1b076ae4
|
285
|
|
| yuron |
0:f73c1b076ae4
|
286
|
// 制御量の最小、最大
|
| yuron |
0:f73c1b076ae4
|
287
|
controller.setOutputLimits(0x01, 0x37);
|
| yuron |
0:f73c1b076ae4
|
288
|
|
| yuron |
0:f73c1b076ae4
|
289
|
// よくわからんやつ
|
| yuron |
0:f73c1b076ae4
|
290
|
controller.setMode(AUTO_MODE);
|
| yuron |
0:f73c1b076ae4
|
291
|
|
| yuron |
0:f73c1b076ae4
|
292
|
// 目標値
|
| yuron |
0:f73c1b076ae4
|
293
|
controller.setSetPoint(400);
|
| yuron |
0:f73c1b076ae4
|
294
|
|
| yuron |
0:f73c1b076ae4
|
295
|
// センサ出力
|
| yuron |
0:f73c1b076ae4
|
296
|
controller.setProcessValue(abs(rpm[1]));
|
| yuron |
0:f73c1b076ae4
|
297
|
|
| yuron |
0:f73c1b076ae4
|
298
|
// 制御量(計算結果)
|
| yuron |
0:f73c1b076ae4
|
299
|
send_data[0] = controller.compute();
|
| yuron |
0:f73c1b076ae4
|
300
|
|
| yuron |
0:f73c1b076ae4
|
301
|
// 制御量をPWM値に変換
|
| yuron |
0:f73c1b076ae4
|
302
|
true_send_data[0] = 0x38 - send_data[0];
|
| yuron |
0:f73c1b076ae4
|
303
|
|
| yuron |
0:f73c1b076ae4
|
304
|
i2c.write(0x88, true_send_data, 1);
|
| yuron |
0:f73c1b076ae4
|
305
|
*/
|
| yuron |
0:f73c1b076ae4
|
306
|
|
| yuron |
0:f73c1b076ae4
|
307
|
/*
|
| yuron |
0:f73c1b076ae4
|
308
|
//どんどん加速
|
| yuron |
0:f73c1b076ae4
|
309
|
for(send_data[0] = 0x37; send_data[0] > 0x01; send_data[0]--){
|
| yuron |
0:f73c1b076ae4
|
310
|
//ice(0x88, send_data);
|
| yuron |
0:f73c1b076ae4
|
311
|
//ice(0xA2, send_data);
|
| yuron |
0:f73c1b076ae4
|
312
|
i2c.write(0xA0, send_data, 1);
|
| yuron |
0:f73c1b076ae4
|
313
|
i2c.write(0xA2, send_data, 1);
|
| yuron |
0:f73c1b076ae4
|
314
|
i2c.write(0xA4, send_data, 1);
|
| yuron |
0:f73c1b076ae4
|
315
|
i2c.write(0xA6, send_data, 1);
|
| yuron |
0:f73c1b076ae4
|
316
|
wait(0.1);
|
| yuron |
0:f73c1b076ae4
|
317
|
}
|
| yuron |
0:f73c1b076ae4
|
318
|
|
| yuron |
0:f73c1b076ae4
|
319
|
//だんだん減速
|
| yuron |
0:f73c1b076ae4
|
320
|
for(send_data[0] = 0x02; send_data[0] <= 0x37; send_data[0]++){
|
| yuron |
0:f73c1b076ae4
|
321
|
//ice(0x88, send_data);
|
| yuron |
0:f73c1b076ae4
|
322
|
//ice(0xA2, send_data);
|
| yuron |
0:f73c1b076ae4
|
323
|
i2c.write(0xA0, send_data, 1);
|
| yuron |
0:f73c1b076ae4
|
324
|
i2c.write(0xA2, send_data, 1);
|
| yuron |
0:f73c1b076ae4
|
325
|
i2c.write(0xA4, send_data, 1);
|
| yuron |
0:f73c1b076ae4
|
326
|
i2c.write(0xA6, send_data, 1);
|
| yuron |
0:f73c1b076ae4
|
327
|
wait(0.1);
|
| yuron |
0:f73c1b076ae4
|
328
|
}
|
| yuron |
0:f73c1b076ae4
|
329
|
*/
|
| yuron |
0:f73c1b076ae4
|
330
|
}
|
| yuron |
0:f73c1b076ae4
|
331
|
}
|