|
|
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯
* q: Y. L4 Y7 W0 f7 T: u2 L U% x- S
您好,不知是否能向您請教。
# P' k/ C5 O$ S$ o# n目前和宋修賢老師在處理Ardui Car
7 G5 D1 x8 H) [' R, R雖然已使用較繁雜的方式處理了跑出黑線外的狀況6 x! J& b2 }; M3 Y9 b* I
/ M9 n' X$ v0 p1 ~% B. w
但基於想追求更精簡的程式所以還是想請問一下
6 w5 C. U; a u; d& H, v就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝7 d' ?) J7 I, n/ l+ Y
不知道您是否願意教我可以如何處理
( c D. h6 M; b% R* E5 w: f( \: W* U/ I: W: I; G1 ^
4 r. U- `( m& Q$ u' i; J
以下是我挑出我一般寫純PID控制的Code:- int MotoSpeed = 250;
P# b7 s& S( s3 k - double CNY70Val = 1000; ~7 E8 z7 s! F: _% \ k* a
- int interror = 0;
+ B6 o: ]7 j+ C# M! z$ M - int olderror = 0;
5 C# Y% b* \6 j$ @6 _6 v' d! _' q p - double values;
8 }4 D+ X) e2 y1 k, I
+ x3 ^, R5 ?, ^( T( Q; z) R- * W8 C5 ~/ E; n
- void CNY70()
1 F& ~( h" ?7 B+ [ - {
z; f- ~- d. j+ \1 d |6 X - valuesRR = analogRead(RR)
' g- e9 \1 \9 J0 d9 W - valuesMR = analogRead(MR);0 J) j# A9 M; T' f( p
- valuesMM = analogRead(MM);
* p8 w: K, R# O1 J# o7 C) } - valuesML = analogRead(ML);
" v) @3 E& d' N& H - valuesLL = analogRead(LL);4 {3 y: p% N/ I
- / I! T/ E4 |$ V. _9 T0 }
- if (valuesRR > CNY70Val)
. y6 L" k7 P# m" i# ` - valuesRR = CNY70Val;
' u2 O- g2 E5 w! m' z$ }# k5 M - if (valuesMR > CNY70Val)7 P" C8 r, d5 Q4 {4 c. b: @/ ~
- valuesMR = CNY70Val;
. }6 G: J, K, [' a& N+ k( U - if (valuesMM > CNY70Val)
8 L i8 b" o. _% l& K H - valuesMM = CNY70Val;
* X" ^4 k! n7 d: l: y - if (valuesML > CNY70Val)% H) ~( y" Q4 ]" C
- valuesML = CNY70Val;" s7 C% i$ {( E |! I, g
- if (valuesLL > CNY70Val)( @6 ~5 z3 f5 ~; f
- valuesLL = CNY70Val;
* o$ x% L* g5 L- u v - " | y9 i' w3 j1 ?1 Y1 e2 B8 k
- values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;
; G) X, t" U4 K" w - }
a/ O0 p4 |" c/ m- l - : M( ]4 y1 ]* x& G
- void Car()
# C9 Y0 O) f R - {; r2 H/ Y# S6 ?, c: ^: y
- while (1) {
) G, V4 c/ n/ r2 a' u8 O - CNY70();* ?+ R. f: p; Z! g6 F
- 1 {4 E9 I7 `9 N9 K/ c% {2 T
- int error = ((int)values);
5 U$ |' r5 d* ~8 U - interror += error;6 Q4 {* J Q5 F/ I7 I
- int lasterror = error - olderror;* \4 V6 Z7 d4 @
- olderror = error;
7 b1 Y- C# S& }4 X8 p% D - int power = error / 5 + interror / 10000 + lasterror;6 u* _ O- ~' a
- : X+ x! a9 e7 j* |
- if (power > MotoSpeed), {% g* |8 |- A8 E* C# A
- power = MotoSpeed;& v( s6 l {; V* ]
- if (power < -MotoSpeed)) R0 E. X; s9 U P8 w1 G" [
- power = -MotoSpeed;
% E' ]: M+ Z. J T0 v
, ?6 J1 O5 X& X! y. r- if (power > 0)4 K1 @2 U1 O- O9 t, T% k
- Speed(MotoSpeed, MotoSpeed - power); //馬達動作,正數正轉 負數反轉。# J/ L5 @( S7 @* H! `
- else
. u) t# i0 x4 v - Speed(MotoSpeed + power, MotoSpeed);# ?' B3 F# F- S. ~' |% `
- }
9 S) L) [: H3 ~% s8 y& { - }
複製代碼 ( e' g7 A% ^% S& P9 B/ N& P7 s1 R/ z
1 h7 ~" z# M9 o# }5 @$ n+ r2 X, A3 c, `* ^ |
|