|
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯 5 C- ~! ?* ~2 j# Z3 Z7 X# }
0 f! G! F) e6 X, Y5 t" A" ?您好,不知是否能向您請教。
6 m+ Q6 l) Q) ]" ?! ]目前和宋修賢老師在處理Ardui Car1 N+ y9 X( I' [( l+ o
雖然已使用較繁雜的方式處理了跑出黑線外的狀況' N; ?3 H; |5 p
' ?4 }# L4 {" O; D' I) s1 y
但基於想追求更精簡的程式所以還是想請問一下
6 N" L3 d: _2 D就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝* u0 v. \, r" }; j: Y9 ]) }. I
不知道您是否願意教我可以如何處理
( z' U2 Q# N {4 `; Q; _+ _. I3 q9 j7 J
, {% L% K+ z( t. S/ N) E
以下是我挑出我一般寫純PID控制的Code:- int MotoSpeed = 250;# O0 L+ A5 R% B8 ]5 B+ H
- double CNY70Val = 1000;
( I5 P1 |# Y, k4 z - int interror = 0;/ F! ]& H( n9 Y( z
- int olderror = 0;: i; l; \! b5 l: w* y; l
- double values;; @3 `9 D/ {- y- y& Q( p
- 8 R7 ?0 ~3 E7 {' k. ?! ~- C
- ) q) l- {1 p6 q0 V _+ d
- void CNY70()3 w& R/ b. U. y( e, `5 B- a
- {
, e* \2 m8 Q% F, m7 l - valuesRR = analogRead(RR)7 E, y$ r" R! d; O* _/ F
- valuesMR = analogRead(MR);
5 Z2 A1 H8 z6 ~/ x2 N8 c9 Y) n - valuesMM = analogRead(MM);
( L% |% `7 @" j5 f) R: } - valuesML = analogRead(ML);; E7 G$ y) K# B3 i0 D6 H" P# f' A
- valuesLL = analogRead(LL);* ?9 F0 {! Y. c" T
- 9 D# ?. u1 W$ q$ W
- if (valuesRR > CNY70Val); }1 v# H& ?( o! v' E
- valuesRR = CNY70Val;
( u3 k. c/ j9 X$ O7 v9 f# p9 o - if (valuesMR > CNY70Val)
R5 u4 ~+ \; j4 L, p+ s1 R3 b* g - valuesMR = CNY70Val;
5 [- Y1 U% L1 G1 L - if (valuesMM > CNY70Val)$ x9 }/ ]7 \0 T' {' m
- valuesMM = CNY70Val;, } ?) n/ \6 y; X5 i, L
- if (valuesML > CNY70Val)
( m1 s! N0 K+ @1 i3 C: e, } - valuesML = CNY70Val;7 M2 ~5 }7 ?8 J; c8 i3 n+ z$ r- h
- if (valuesLL > CNY70Val); t* h. j- Q. h. H7 i
- valuesLL = CNY70Val;
" @% t( i1 J4 V' r9 m1 L$ C- h! V5 d
. }! F+ K9 h8 [& @" i- values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;2 h+ D' v5 ]7 |: w1 `
- }
F% Y0 |5 z* c3 x: d; Q; x
- }* p" D4 G' B: I& Z- void Car(), E8 y% T. Z9 x6 ]* ^7 [# q3 j
- {1 S/ Y; O7 r; _, S' _' k# v
- while (1) {
" R' G. B. J& F$ f3 f- f, Z1 t - CNY70();* i2 G6 y/ h4 [# j* A
3 R* f3 [8 v* x: a4 X( Q- int error = ((int)values);
9 b& X' y8 A7 ]8 R( c9 b - interror += error;+ }9 r; f% S3 L( b0 P
- int lasterror = error - olderror;
1 {" M9 R/ [3 G" X+ W" v - olderror = error;% _) B5 U5 s9 i) K
- int power = error / 5 + interror / 10000 + lasterror;
/ V+ j' n {3 ^2 i$ W; Z0 g- Z9 w - ; j2 ^. L4 ]6 O0 S
- if (power > MotoSpeed)
8 M4 ]1 O" T7 m2 x - power = MotoSpeed;) r$ K/ u# z' b% |# c8 p
- if (power < -MotoSpeed)0 q% ^$ h! v; l- g) \
- power = -MotoSpeed;4 \6 E/ f/ X. K) x3 I7 A, ]+ d
- . Q b& u" E' k5 {% t
- if (power > 0)5 p0 z2 o9 C: {; [: ]1 O
- Speed(MotoSpeed, MotoSpeed - power); //馬達動作,正數正轉 負數反轉。% v6 H7 B& u6 F& w; i" R( d/ J
- else: }* F1 X& L9 I
- Speed(MotoSpeed + power, MotoSpeed);# u2 U8 f: z/ a& B3 f2 T
- }! ~; z& |; D6 ^8 Y) V- x% ?2 t
- }
複製代碼 3 U9 P0 F3 \8 b, Y
8 e3 @7 h- f t |
|