|
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯
; a5 Y5 c7 O0 K* ~! r4 }
% T3 r% H! G- h! g7 g2 T( z1 n您好,不知是否能向您請教。* F& P! R O3 x
目前和宋修賢老師在處理Ardui Car
- f2 E! J4 \( z" b雖然已使用較繁雜的方式處理了跑出黑線外的狀況
$ _* d: l9 I- ?- q7 |
) Q S3 }% z4 S' i7 O* m但基於想追求更精簡的程式所以還是想請問一下0 Q0 c/ D3 q# |# w: q" W3 K0 Y
就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝! r/ A0 a$ r. {" R( m
不知道您是否願意教我可以如何處理
; O; [% |" d6 D5 {( k, `& x/ J
( c0 S- g( b y0 K' V1 w) e0 F/ h& F, K
以下是我挑出我一般寫純PID控制的Code:- int MotoSpeed = 250;9 V7 b l+ h D; R
- double CNY70Val = 1000;
+ `' i5 ?( f9 Q3 E* R - int interror = 0;
' Q% e- C- t0 F& z6 J( c - int olderror = 0;
2 n1 U! w$ C2 T& J* ~7 v) l ~ - double values;1 L8 c8 G4 A |9 _
5 f- [& f* V0 e- S, C: _5 }, R- 0 U" [. Z$ A6 ~0 s
- void CNY70()
/ Z8 L+ q8 ^1 G! ? - {
, Q$ ]1 [/ b! g( W - valuesRR = analogRead(RR)5 \6 {% C. S1 }! `$ z+ ]
- valuesMR = analogRead(MR);) ~0 M5 q. Q' k6 \
- valuesMM = analogRead(MM);
+ j1 Q$ A) f$ u N3 a% t# U - valuesML = analogRead(ML);
h# s$ P m/ d4 W2 c0 p - valuesLL = analogRead(LL);
' V, d+ K/ ~3 n& h% o- e - , J8 E( H/ ^1 ?
- if (valuesRR > CNY70Val)
1 l' c1 w2 D1 c, k - valuesRR = CNY70Val;8 W, {) |9 t) f; c2 P! ?/ T
- if (valuesMR > CNY70Val)& l' O( Y$ h1 m, }
- valuesMR = CNY70Val;% z; U# N' G! R' s6 n
- if (valuesMM > CNY70Val)9 D7 [/ r8 a K( A
- valuesMM = CNY70Val;
. s7 c% E5 U4 R/ K# o* L - if (valuesML > CNY70Val)
% L" @9 w( g0 M1 I) \: L5 _( Y - valuesML = CNY70Val;: ]! C) ]8 [: ?5 G
- if (valuesLL > CNY70Val)
) a- A, x$ i5 Q- u2 b; v* P9 n6 j - valuesLL = CNY70Val;
2 |( `# d" c9 X+ C
0 S! {# U8 I( L8 K0 L- values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;
9 y, }" Y& s/ `% k - }
b% Z/ Z& K& u; D# y - . ]7 N) D% R7 _5 ~2 f. q$ ^* k5 i6 ?
- void Car()9 B" ]. z% g1 a8 M4 [/ } s- `
- {
- f% s8 q4 b- N - while (1) {
1 P$ z5 Q& z. u7 t& N8 d - CNY70();; d( \) d9 E/ V( L& M
1 v, E- R3 e8 {% E- int error = ((int)values);
( |3 |0 `2 ~7 j/ |' M - interror += error;: A' [" l) A+ Z) x. f6 c6 E' x
- int lasterror = error - olderror;. I( F$ ~ N/ ]) q+ z1 p
- olderror = error;" Y& w5 P. ?4 L; V( J9 K/ h
- int power = error / 5 + interror / 10000 + lasterror;0 d. T% L: o3 E! H- b) s
" A- G7 i; r( [! \. L% ~. p1 R- if (power > MotoSpeed)2 h9 a8 B& ^/ t# @' o
- power = MotoSpeed;4 Y" C1 y8 G. ]: t3 X( X) ^
- if (power < -MotoSpeed)* d+ Y1 _6 y2 b- z+ i
- power = -MotoSpeed;
6 y- y* i6 Z/ u) a5 ]
# H1 x" h- e. K- if (power > 0)
# F! U1 a; c% ^9 t - Speed(MotoSpeed, MotoSpeed - power); //馬達動作,正數正轉 負數反轉。: g9 s. O" g9 d0 B2 R9 i2 p
- else0 S/ Y/ H+ u1 `0 {
- Speed(MotoSpeed + power, MotoSpeed);
1 t/ s: p, E, U0 S( U: Y - }+ i& {- g1 X( X
- }
複製代碼 3 w4 T0 y$ ~8 X0 T6 ~
8 B( e& ^5 C l. Q3 t
|
|