|
|
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯
9 T% H5 u3 z/ \) k
6 B! P( B' `; F# g您好,不知是否能向您請教。
; H' K! C+ I* V' Z' v) j) }' B目前和宋修賢老師在處理Ardui Car
2 B2 H5 D# Q3 {: i+ }7 m2 ~雖然已使用較繁雜的方式處理了跑出黑線外的狀況
5 d6 m8 s p6 _
# j4 R: l0 G! s- z' R但基於想追求更精簡的程式所以還是想請問一下0 j( a y* r. P8 Z
就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝
5 a% @# h" Y( k不知道您是否願意教我可以如何處理
* _+ l1 z( F" N9 r' w
# s* b( C0 i4 ?1 [& v
4 }* b% c$ H1 q$ C* q: q( x6 g以下是我挑出我一般寫純PID控制的Code:- int MotoSpeed = 250;- `# f7 S- j$ Y8 x K
- double CNY70Val = 1000;
3 v4 K& N$ }# \% N& _+ R - int interror = 0;" M' q$ i7 \1 ^' Y+ Z) `7 a; q" q. N
- int olderror = 0;0 ?" h H4 @9 R& b8 F( H6 C
- double values;
3 ^, {9 q, y/ y& a- ^4 g
/ W6 k: P" S( ?/ M4 i; Z2 n
C4 u4 x$ j; v- void CNY70()
$ G) @7 U5 t4 T, n- g. E8 K - {5 e' S# x. |: b. C8 r$ n
- valuesRR = analogRead(RR)3 V' ?% d3 s6 v5 X& ?
- valuesMR = analogRead(MR);* p( P0 y+ P r2 L
- valuesMM = analogRead(MM);
4 |0 x& Y6 b! G3 @- V/ T. c - valuesML = analogRead(ML);2 b+ ]" W2 ?! [
- valuesLL = analogRead(LL);
4 i1 I% B9 L; |- z9 o6 g, G! f - # ]1 p& s( d- e
- if (valuesRR > CNY70Val)- v7 U- y# H( r5 Y) M
- valuesRR = CNY70Val;& A0 v" q* x& H) n% F8 H# p
- if (valuesMR > CNY70Val)
* t* H$ j4 F; a( p1 s1 N o6 G4 k - valuesMR = CNY70Val; e) [% F C' t0 z5 Q
- if (valuesMM > CNY70Val)
4 L7 k( E3 l3 d6 f3 v% B/ _& M8 ~ - valuesMM = CNY70Val;
" P |8 H% [' c, y0 b6 h - if (valuesML > CNY70Val)
/ V2 K' j- A. D2 g6 V1 j9 Q - valuesML = CNY70Val;& |; p: u5 T. @' n
- if (valuesLL > CNY70Val)
; K+ v% o4 t2 c, E& n/ E - valuesLL = CNY70Val;3 v" i: _/ X; M1 P# b* m% ]+ |5 y
# c: o1 N: C6 d( U1 p' ~+ g. p- values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;
- A' j9 _) T2 Y/ ]1 U - }
8 P( c) }' k( {3 y' Q
- @4 M4 a' H( p0 ? n- void Car()
% |4 p. G6 ~( y3 g3 } - {$ h7 C% Q( ^& w* z3 I; v
- while (1) {, A9 d0 ]# U3 U: S
- CNY70();
" L1 y( \9 z% }9 I- }/ I% l - & Y& P. g7 L9 _8 V3 z1 L
- int error = ((int)values);
T9 ^. u* z1 d3 q! V* ]! w6 ~. E - interror += error;
4 C! l. d" ~( O0 p: `; L+ q - int lasterror = error - olderror;+ u3 } U2 R, U4 l
- olderror = error;
- o. `! Q+ i9 V% L' x - int power = error / 5 + interror / 10000 + lasterror;
% K6 n$ m/ D \, d - ' f- |+ P/ c' q' z( Q
- if (power > MotoSpeed)
( M7 v& I7 T$ s7 A/ T/ M! R. t - power = MotoSpeed;9 s% ^) w3 j( v$ d n& }
- if (power < -MotoSpeed)
! u/ F2 ^0 X, V; S b- o! z2 b, P - power = -MotoSpeed;( D4 L: D5 [; C' N, F+ c
- 1 S) n: I8 B& U% f3 L7 R9 L* x
- if (power > 0)8 z% \$ X" O5 ^
- Speed(MotoSpeed, MotoSpeed - power); //馬達動作,正數正轉 負數反轉。! r7 h( c, s8 `8 T$ o7 B
- else% \! F( ~0 M9 O: ~
- Speed(MotoSpeed + power, MotoSpeed);2 } _# [% K, t; a( }5 C5 @
- }
' B- g$ Z" `, }5 b; H( O) | - }
複製代碼 & ]6 V1 I& H- h5 G
2 Y; \5 _! p+ c |
|