|
|
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯 # d8 y& e( B4 Q' t
9 L& N% v# |+ Z' C
您好,不知是否能向您請教。 U: J5 ^2 V1 c+ Z- x! a1 A7 ?
目前和宋修賢老師在處理Ardui Car2 Z' P0 V5 ^! y: y& @! t9 Q
雖然已使用較繁雜的方式處理了跑出黑線外的狀況
3 E, g8 e4 b' Y, ?' U" _% G' Z ~ H7 S4 X, o6 a7 ^
但基於想追求更精簡的程式所以還是想請問一下3 N+ j4 L# s) y7 T1 k. g! R4 S
就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝
& S) `8 u3 B' Z, w' v& u) ]不知道您是否願意教我可以如何處理" j$ t2 q6 A* F" D: o& o8 L
3 j" e( M& b. t$ v- j) ?4 [$ u
" m& r' J; e. q' O, b' I! v6 b
以下是我挑出我一般寫純PID控制的Code:- int MotoSpeed = 250;$ M9 S- \- p% [# Q8 c, R3 Z8 h
- double CNY70Val = 1000; s7 l, Q4 A: L- P! u
- int interror = 0;
& K% \% @. E6 j2 ^ L6 F - int olderror = 0;( G" X( o4 q) E2 P8 `4 Z7 [
- double values;; K4 Y" J- d" m/ h6 u
5 h( }4 ?/ S: _* s1 j; p' M- $ c# l% X; F' D$ E+ I6 U& I
- void CNY70()
& m0 ]1 P! i" }' A [% B# \+ | - {, c: ]) b$ h: t- D, c1 n
- valuesRR = analogRead(RR), G$ V9 [1 b" J+ F0 Y% w, w6 i/ ^
- valuesMR = analogRead(MR);1 B. @0 x0 o$ P7 ^
- valuesMM = analogRead(MM);
) x! h5 r6 q, o; |+ l7 t - valuesML = analogRead(ML);
* v& o' f8 d n2 g% V( o - valuesLL = analogRead(LL);
" |3 r b M6 ~- T
3 l5 v+ a( E$ I! N( H# A2 u. Y- if (valuesRR > CNY70Val)
" L3 B; @3 a6 \1 d! L8 q - valuesRR = CNY70Val;
& y, w, x" b# Q - if (valuesMR > CNY70Val)
* z4 I, K! @6 S( X - valuesMR = CNY70Val;
+ v# z" q, Z; ]* I - if (valuesMM > CNY70Val)9 |* p) F& ~/ S( ]/ x8 X2 p) z/ |
- valuesMM = CNY70Val;. j1 ]( K# m9 A8 w
- if (valuesML > CNY70Val)
6 D" P( ]6 s( B6 l. q9 J - valuesML = CNY70Val;) J8 }, q; i- T5 K# a
- if (valuesLL > CNY70Val)2 V E6 U4 @% b& y
- valuesLL = CNY70Val;2 q y$ [) D/ d, R; |
- - x2 j H/ G0 C. d
- values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;2 k7 P! u7 r m# f3 P
- }
/ C5 U) O7 Q; @ k$ {3 F6 U - & w9 V0 Z0 `+ f1 ?
- void Car()3 y5 w( m4 W' ?
- {/ h- L+ n# w0 c/ ?7 ?1 c* }
- while (1) {
6 T- ?% N: m" S7 t: L# X - CNY70();
( C$ P# p9 p+ e6 b" K2 ? - 6 w4 _, l4 T3 J. V
- int error = ((int)values);
+ f P1 v$ K6 E3 }; u( s# s! i - interror += error;
8 P# B. ?. z. _4 k) h - int lasterror = error - olderror;- e$ y) Y- P, e! |$ ^
- olderror = error;
/ P% L/ S- }) A [/ J3 p/ Y - int power = error / 5 + interror / 10000 + lasterror;& d5 J2 t( g l; e8 ~; V1 o
, n7 ^+ g7 b0 X! S& A' h( G- if (power > MotoSpeed)
: S. D0 r& L/ r/ q8 I/ R4 s$ h - power = MotoSpeed;- `4 R" {& s; E
- if (power < -MotoSpeed)
; U0 R; o' d4 [7 @- u) F, }- a - power = -MotoSpeed;
7 @# o9 ?. [3 B" ^& u6 e( J - . |: }2 y9 ~1 }. K* M
- if (power > 0)8 Y" q" o5 l& y( Q
- Speed(MotoSpeed, MotoSpeed - power); //馬達動作,正數正轉 負數反轉。
& t% j, Y& ?4 s! W5 {9 s& J - else/ _7 S; [, c9 _2 c
- Speed(MotoSpeed + power, MotoSpeed);" W7 O4 a8 ]! v1 {
- }
: Z6 S" ]0 j& @ - }
複製代碼 ; i6 l. P- Z N1 }8 z/ q
+ H/ Q& P: {( Y2 x1 N1 a
|
|