|
|
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯 $ {1 z0 V* `1 K
0 n2 K' ^( o3 s& k9 d9 K
您好,不知是否能向您請教。2 A/ K( T0 j* R3 H0 d9 T
目前和宋修賢老師在處理Ardui Car
) `& H( Z# H7 M+ h( `6 L雖然已使用較繁雜的方式處理了跑出黑線外的狀況. f: D1 o0 A; H; O
" g& h6 |- ^% A- A5 ~2 S) y' n. C* T
但基於想追求更精簡的程式所以還是想請問一下* M: {- {6 c: j8 O7 M: |
就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝
- p9 |2 t, e1 d2 w不知道您是否願意教我可以如何處理' T1 l) Z; \- ?
) K. Y) ^( ^' |9 w1 [# x* A8 I
- u/ i0 c3 ~' u以下是我挑出我一般寫純PID控制的Code:- int MotoSpeed = 250;. _/ S; a$ ?2 M, S
- double CNY70Val = 1000;
( j' P# Q5 E2 r+ P$ [/ A+ X( S - int interror = 0;
0 C2 {9 g0 T V8 d - int olderror = 0;
) F0 [) O( M% X5 K7 c# H0 a4 N7 f - double values;
% M8 c' R( D) q: Z - * ?% C5 G, Y' r. t" D
- {5 w V, G! ?6 E- void CNY70()
0 c/ n5 j) F, h% j7 P7 W. R4 n - {
7 P z: p6 ?4 I& n0 f. n9 O - valuesRR = analogRead(RR)
1 ]- Y, }, i+ P1 D4 N5 g8 X - valuesMR = analogRead(MR);
" |, ], l- C% H& N# L - valuesMM = analogRead(MM);
9 K" V2 R: T: v) [* l6 \ - valuesML = analogRead(ML);( X. B# K- ]# f0 i! i# `: F, N) y
- valuesLL = analogRead(LL);" j! M8 d( z2 s
- 1 t; b/ n6 C! ^! J! s0 I, U
- if (valuesRR > CNY70Val)
& ?; C$ F; H) j/ a1 B) i* Z6 j - valuesRR = CNY70Val;# X) j& n7 z7 w7 I; T% i( Y. p2 A
- if (valuesMR > CNY70Val)% ]: F( `' E M# K, t
- valuesMR = CNY70Val;8 k9 k4 y1 p- y6 l" Z
- if (valuesMM > CNY70Val)
$ L- ^9 Y. W2 ~ [/ ?! t - valuesMM = CNY70Val;+ @, A. l G# y
- if (valuesML > CNY70Val)
3 r4 S5 i/ } J# Z - valuesML = CNY70Val;
/ O: ~, z1 z7 r2 R% Y* T - if (valuesLL > CNY70Val)' u$ n/ d5 N. B/ i* U$ i. M1 w. w
- valuesLL = CNY70Val;
! }' [0 e4 x& S' A2 g8 N5 I
5 B$ d9 `: M) _; O$ G- q- values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;
7 |2 R4 L0 d% I9 \ T - }
0 x/ I* u) f8 I7 i - 8 }9 T* j4 f% b2 q
- void Car()
: }3 j9 t5 Z, T7 L6 A - {8 k8 _! ]& |4 l3 Y
- while (1) {
) i4 [, f. f9 |: z9 C' J4 H - CNY70(); i1 X" G( H; g
( k, D# @2 k8 i- Q5 Q _- int error = ((int)values);
H$ X; n8 C/ U, @/ c. ?, w - interror += error;
" r( R, R# l( ~0 d0 k; ~ - int lasterror = error - olderror;6 I0 ~+ u/ i( h3 `/ ]" ^
- olderror = error;5 r5 Q" {* L Y B
- int power = error / 5 + interror / 10000 + lasterror;0 g1 i4 y z9 U; s: N9 N
- 7 p) y2 J! j0 [" ? G% I5 f6 \
- if (power > MotoSpeed); a) o, T1 d! E" I
- power = MotoSpeed; t- ?: ~) B8 _5 G" M% Y
- if (power < -MotoSpeed); P7 ~1 \4 Q. _# n5 B/ x) \
- power = -MotoSpeed;2 X. \ c: s0 e* Y2 Z/ \6 _
- , d' B& ]6 w$ f4 ?2 X
- if (power > 0)
. X* P; W0 ^* F - Speed(MotoSpeed, MotoSpeed - power); //馬達動作,正數正轉 負數反轉。9 ^) D" \' y+ Y; m6 a% j% ?, }3 q
- else: }% @3 Q& T, P
- Speed(MotoSpeed + power, MotoSpeed);
* r; }+ J: A1 J - }* s% L1 U/ Z* k9 g. d5 N6 ~
- }
複製代碼
. U: r" l2 v) t4 e& K" ?3 C; O+ k8 E$ v
|
|