|
|
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯
3 ]* N6 T' P0 x0 }+ E% `5 L- X" [. T; o
您好,不知是否能向您請教。: g+ J% y4 ?' T; U, O& ~
目前和宋修賢老師在處理Ardui Car3 @$ R6 q2 e& |
雖然已使用較繁雜的方式處理了跑出黑線外的狀況9 E0 e- N- g+ I" `! Q/ j% z$ `
* _( o$ a. D) J- a" X2 B9 U但基於想追求更精簡的程式所以還是想請問一下8 N' G$ A% t q) c1 {4 v6 p1 F5 u
就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝- T9 E0 ?+ B: J$ y4 f
不知道您是否願意教我可以如何處理
% Z" n% R4 p3 X# u9 H4 v3 B3 [1 z3 f4 N( z
6 s; M a& O( X0 ?/ s. M以下是我挑出我一般寫純PID控制的Code:- int MotoSpeed = 250;
) b" I; a- T" c+ }# P% b - double CNY70Val = 1000;4 G, h% S1 [ o
- int interror = 0;' M5 T9 `7 G7 @3 X
- int olderror = 0;
: p. y1 K* q/ U$ D; o7 j- M - double values;
- v z& G7 |, T) U - " s& G% r$ Z q- D- j. y
7 {' y: B* R5 s8 A8 b* ]- void CNY70()
% q9 {* B9 G! O9 l9 v. y$ ]% G t! P ~ - {" v) V; z' H8 t) _; g0 W c3 R
- valuesRR = analogRead(RR)
0 R+ k- U; f9 v( j+ M1 b - valuesMR = analogRead(MR);
' }' @$ D6 O9 x# ~# D, E( ?5 X - valuesMM = analogRead(MM);
+ o* g" U2 F/ y' }5 p& p( ^ - valuesML = analogRead(ML);
, p% E5 Q8 Y; B" L0 f" J! W - valuesLL = analogRead(LL);
H0 C: f Y/ G
7 B, t* o. T! ~: x: Q- if (valuesRR > CNY70Val)# y. B6 C( |) Z% W" s
- valuesRR = CNY70Val;" T4 Q9 _/ ?5 {& Q6 V S, R$ U
- if (valuesMR > CNY70Val)6 g4 j8 M, i1 d7 d+ |
- valuesMR = CNY70Val;* h5 f! x/ w, M
- if (valuesMM > CNY70Val); u% J# r2 {+ v
- valuesMM = CNY70Val;
' C% n" O: I f d) I* i - if (valuesML > CNY70Val)2 N ?" q# T1 s. U
- valuesML = CNY70Val; C: g2 _' k, M4 z4 p
- if (valuesLL > CNY70Val)
9 X0 w& P2 k+ [- I9 M - valuesLL = CNY70Val;
7 `2 M7 e' r1 Y" x
* c9 ~; M' K$ q* V9 V/ r- values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;1 ^+ z+ z1 R' y b
- }
: z1 L" j% ]2 I; t5 V. H - ) t( {9 @# K8 i5 f7 L
- void Car()
- ~' @, V/ i0 c - {9 p* X' R8 X/ G! q
- while (1) {
/ \6 O+ |+ l8 M! ]( f9 E5 m - CNY70();6 O5 U9 p* d( F
: G: p- Q& h' a7 Z" a, _# T+ ^- int error = ((int)values);
) n4 Q A2 d" |2 s0 P- Y# \+ l - interror += error;
1 v( t5 k" ^8 x4 t b9 Z - int lasterror = error - olderror;, h2 D+ D+ P9 ~, {
- olderror = error;; L# R8 T7 a) ?9 _) t, M2 S
- int power = error / 5 + interror / 10000 + lasterror;9 v# Y6 F6 y9 `* J7 V6 S9 b8 ^
9 T/ J: o' d0 A; q6 \- if (power > MotoSpeed) W+ F9 a" D9 \; ~/ g
- power = MotoSpeed;9 h3 g# j+ @$ I" V" x+ p2 O, s
- if (power < -MotoSpeed): @: z: V3 K# f! }
- power = -MotoSpeed;5 b+ j+ ~- g. y( s; \5 m2 o7 k4 [' Q8 G
+ n" Q- Y" `+ F( w- if (power > 0)" }, U0 d, V$ T; _& d
- Speed(MotoSpeed, MotoSpeed - power); //馬達動作,正數正轉 負數反轉。: a; x6 y k! Z) y; C
- else
8 ^8 \3 i6 Z, M6 e - Speed(MotoSpeed + power, MotoSpeed);1 x* `% p! ?# h5 B$ ~. d
- }
* V' V! j* E7 I6 v6 ` k2 i - }
複製代碼
) w7 P4 i6 ~4 k: X6 U+ }4 |0 @, V, l7 Y. E/ c8 S
|
|