|
|
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯
# m+ Y+ u4 Q9 o+ G, ]5 r' K0 I* X* u/ p; ` C
您好,不知是否能向您請教。: {" q, K6 b- y9 h, z% K i
目前和宋修賢老師在處理Ardui Car
2 Y) ~# J. H7 x5 \# t) L$ G$ H0 Y雖然已使用較繁雜的方式處理了跑出黑線外的狀況2 P0 ` j) X; u: K3 D
( V' p4 M! |) J) z
但基於想追求更精簡的程式所以還是想請問一下" [; Q$ d6 P3 K! T2 {2 ]$ R5 h
就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝0 s% N6 y4 B- O
不知道您是否願意教我可以如何處理
" v6 h8 j, h1 q* \* z
/ Q: w9 y8 {9 [+ {* o. j5 i( K# O1 D* n( i" l
以下是我挑出我一般寫純PID控制的Code:- int MotoSpeed = 250;: B# t8 ^" g6 A" r% x3 l: _) C, I
- double CNY70Val = 1000;5 \; K, @. ?7 m* u# i
- int interror = 0;
, @' R( o" B% e6 Y$ N- w0 i8 r - int olderror = 0;2 }- m5 N0 s) n" e
- double values;5 k0 N( D5 |3 j
7 m' v: P, v2 j3 l) c& z- 2 o3 S+ M t7 L6 n. n
- void CNY70()
9 K1 q2 T5 r. [9 H7 F - {
4 u) S& {& _# ~& R- K - valuesRR = analogRead(RR)
, t1 _. \5 M6 {) M) I8 E: [) ~ - valuesMR = analogRead(MR);0 n/ S8 ^; I& m& X9 U7 H! W! W$ m3 x2 k
- valuesMM = analogRead(MM);6 _& w1 ?( f5 M! G" T
- valuesML = analogRead(ML);* w6 e* q. S! Y2 u8 U
- valuesLL = analogRead(LL);, r* V2 F* r. v
- 3 z5 y; Q$ J3 Q3 \) e9 j2 A
- if (valuesRR > CNY70Val)
0 ^1 {# w; V8 s" L1 x5 @7 Z, A - valuesRR = CNY70Val;" J1 u) l8 g& g# w1 r" }" o
- if (valuesMR > CNY70Val)
' n( D4 }) k: O - valuesMR = CNY70Val;+ G; T# [. [4 R: x, w1 e4 R
- if (valuesMM > CNY70Val)7 c9 G; N: V7 f( W2 B4 J
- valuesMM = CNY70Val;
, D! ~% R5 r6 J) m - if (valuesML > CNY70Val)
; E: C W/ O/ x9 s9 M7 X0 g - valuesML = CNY70Val;
# R: a7 |& \0 ~; v! C - if (valuesLL > CNY70Val)
) O8 v6 v7 ]2 d y, ?) k% E - valuesLL = CNY70Val;
1 \* W. `4 L6 M& P( T - 8 b* t0 s/ w6 g
- values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;
8 l$ N$ m. H; D- C0 S: @ - }
4 t- O" b) N Y- Q
. l$ N* G. N& o1 R: V- void Car()5 x( I9 z: \9 e# ?: u, S
- {
/ ]# F, h4 z& h6 E7 H! T3 P - while (1) {
4 S" t& _7 ^( Y/ y! N/ R - CNY70();7 k& g: x7 ]! a, U6 @
- 0 O7 U& q. M! x3 v; O, t( R/ l2 a! P
- int error = ((int)values);6 Z8 R% |9 _& p7 p8 l
- interror += error;+ u2 _1 O3 a6 w' x. d
- int lasterror = error - olderror;0 _9 H2 u$ A6 k E q, G, w
- olderror = error;
& V4 K0 x2 ]6 \% w+ n! i: |1 H$ } - int power = error / 5 + interror / 10000 + lasterror;5 G/ o# N) ^6 k% O: B B2 w- ~
$ _4 m: }- R+ }2 _+ o- if (power > MotoSpeed)/ v7 d9 j) d/ @" [& j. F
- power = MotoSpeed;
1 L& f1 r* M1 l1 \% s - if (power < -MotoSpeed)
5 O: s/ w! L+ H t6 E8 c - power = -MotoSpeed;
& d2 T4 s" r+ r+ H3 B; _
5 k" P! [6 R+ ?( q- if (power > 0)
7 u2 m4 J1 W, P+ P! R8 r - Speed(MotoSpeed, MotoSpeed - power); //馬達動作,正數正轉 負數反轉。7 m# [; b. W# ~. R3 [9 Q
- else
- y* p; T) X0 {1 @4 P - Speed(MotoSpeed + power, MotoSpeed);
C: p% }/ S) Y - }8 `9 Q" i9 |7 I- ?
- }
複製代碼 9 P6 @+ [5 c# f, P( i$ Q
6 }7 Z3 X: ~; C W7 c# n
|
|