|
|
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯
) q6 L$ o1 }0 Z$ n! l0 d7 H: [: I% x: I/ r3 z
您好,不知是否能向您請教。
$ _2 N% [% m" N目前和宋修賢老師在處理Ardui Car
' s: O3 [3 q& ^2 l( A雖然已使用較繁雜的方式處理了跑出黑線外的狀況
' H+ b% Q6 A+ v4 a7 @' {7 }0 C& r2 u; C
但基於想追求更精簡的程式所以還是想請問一下
# w- j2 w) [; W& `! T就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝+ o" I. b H, V u& f5 b }
不知道您是否願意教我可以如何處理
8 S: h! p. d h/ F$ X' T% c# k# t" U( W
& Z {, r& L9 ^& ]
以下是我挑出我一般寫純PID控制的Code:- int MotoSpeed = 250;- W* v( N v) ^4 ^/ `2 K- M# Y
- double CNY70Val = 1000;
: j5 c9 y3 f0 y - int interror = 0;. ^4 ?, g& C: m- l1 | E8 ^
- int olderror = 0;) @ m: R1 X% W! l {
- double values;
+ W" L# { D( z - 9 p- C5 _$ q5 i, [ E
- 6 A1 Z3 [$ N( h% ~
- void CNY70()8 W, ?! z" V0 k% i [6 n( q
- {# Y4 ]! ^& ^7 ^- ?6 Y, ~
- valuesRR = analogRead(RR)1 V6 t _( C7 h3 U4 n$ q) a/ J
- valuesMR = analogRead(MR);% G) ~& O, U5 ?! C; D* @8 f2 v
- valuesMM = analogRead(MM);
* t* `: V; n' ~0 k$ C - valuesML = analogRead(ML);
5 N% n- T2 Y6 d2 s - valuesLL = analogRead(LL);
" S2 B% S, _9 Y. R2 Q" B- b# J - 2 d( h/ h/ j. y4 ^+ d
- if (valuesRR > CNY70Val)
; e e h* }7 {( m$ ` - valuesRR = CNY70Val;
. w8 [* C4 p6 _0 \. Y* Q; ` - if (valuesMR > CNY70Val)
& _% N' ^, F" w3 v6 }5 t4 I" R* \6 r+ p - valuesMR = CNY70Val;" v" Y+ ~& M" `
- if (valuesMM > CNY70Val)
8 o9 n8 R0 @2 E) J8 B - valuesMM = CNY70Val;' i0 q4 K! e" J3 e6 @; i
- if (valuesML > CNY70Val) E# h; n. f8 v, a' \% S
- valuesML = CNY70Val;
- ]8 | {& h' `4 P" W1 Q5 p - if (valuesLL > CNY70Val), a# L; G) Y; z! m) Y
- valuesLL = CNY70Val;
# X: D& l, I/ `! B - - o5 {0 u& M5 N7 a& q+ I, K
- values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;
! r0 u+ T6 n; Y* r - }( ^' z e# }7 \, I7 @0 j
- 8 y0 o/ j. ~; P& F' f
- void Car()! \$ @1 e, N# _: F( K+ K) G
- {
" S/ d2 W% E5 I: |- A; I2 o2 x - while (1) {3 A, ]3 P$ X- m$ u0 I
- CNY70();
/ X+ `; T- T/ e1 k# {; ?+ o0 _& D7 D* ?
3 V% c$ F7 A2 T: Q7 f: a( a2 M- int error = ((int)values);
: \0 h9 J3 ?8 Z - interror += error;) Q! I% Q" U& L0 s4 U0 ?3 r
- int lasterror = error - olderror;
) ?9 ?, a) l: |- f8 z. Q - olderror = error;1 r3 L5 ~9 [& W5 m) ]! Z. h& I
- int power = error / 5 + interror / 10000 + lasterror;
! D3 u) U `0 }- |' |" A; Q - / J5 ^ ]# Q6 b; T6 l
- if (power > MotoSpeed)8 h% i6 h' N* S2 z. z
- power = MotoSpeed;
0 B- h7 h) E/ v3 f: o - if (power < -MotoSpeed)
3 n/ r) @3 }. M- t - power = -MotoSpeed;" n& ~0 d" N$ }, P9 \
- d7 }; R Z; n8 L2 n5 }
- if (power > 0)/ L1 U0 d8 D% P2 R7 N
- Speed(MotoSpeed, MotoSpeed - power); //馬達動作,正數正轉 負數反轉。! i* W* A1 ^( E# K2 U2 A3 ?, @0 d7 f
- else0 g |; W) Z7 c4 G5 L
- Speed(MotoSpeed + power, MotoSpeed);
. P7 X8 h2 l: B8 ~: h+ N - }4 M, {9 h- c {
- }
複製代碼
& i! M% W4 s( [% z# C# P3 F) h* S" a
+ @+ v4 |2 u/ b' i$ c |
|