|
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯
. m. p" [0 b/ }0 C9 C
4 U9 @+ h1 j3 M) N" a: l您好,不知是否能向您請教。
+ k6 r' `, [& p6 z l: K l2 t目前和宋修賢老師在處理Ardui Car
& D+ }& ?! ~/ \, c" @0 ~6 ]雖然已使用較繁雜的方式處理了跑出黑線外的狀況
6 j" j! G& q5 k. n. G/ `
' ^9 c! A$ ]9 ]* c: l" |但基於想追求更精簡的程式所以還是想請問一下
' n% q. t3 m- D+ v就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝
5 e$ f5 p/ w) C3 |. C: q+ ?: G不知道您是否願意教我可以如何處理# J5 B$ c! I4 k ?
. C' Q2 g n' n8 x
1 P0 M- t1 t5 H. }' _
以下是我挑出我一般寫純PID控制的Code:- int MotoSpeed = 250;
+ x+ n% w G' U- x/ f8 Z; F6 z - double CNY70Val = 1000;: Q' O& M1 V. V2 c, K
- int interror = 0;5 n2 m) k# Z$ \) j9 f
- int olderror = 0;7 p# _. g$ `8 i
- double values;9 S& w9 T V/ f% o$ k/ N( G+ |
- " R" @# M! q4 H. f* \
2 Q5 q% ?! C, B) C2 a- ?- void CNY70()
* S- y/ e3 a# _ k( H/ |# p - {
6 u5 f( W: Z; R5 K \' G - valuesRR = analogRead(RR)
Y) |5 \* H- S3 K+ f - valuesMR = analogRead(MR);
1 |/ K! B7 U7 K( O+ t& I - valuesMM = analogRead(MM);6 C# ?* V8 U. Y7 Q1 d% q
- valuesML = analogRead(ML);
5 Z2 }+ b* Q( {5 V3 D" }: |4 ^% D - valuesLL = analogRead(LL);3 V, z2 O7 l% [! r, n. _" X
- 6 Y9 k4 R0 e( H( U2 Y a" e+ t
- if (valuesRR > CNY70Val)
* @ a4 C3 z3 E* S1 M - valuesRR = CNY70Val;2 q( L& ` L, X9 m9 n: s" _
- if (valuesMR > CNY70Val)
- f8 w7 x, d5 C s2 K - valuesMR = CNY70Val;
7 q% `; M( T5 X - if (valuesMM > CNY70Val)
3 b; z7 k# X: x1 K- q: u6 Y! N - valuesMM = CNY70Val;
9 q+ s9 F" Q# g+ M$ x9 S; m - if (valuesML > CNY70Val)
; }/ t7 U7 b! C' m8 ^+ d - valuesML = CNY70Val;/ [8 q" `4 b; l. N4 r& H/ o0 |: M
- if (valuesLL > CNY70Val)+ @' {1 z% j) I3 u- ^( I1 Z
- valuesLL = CNY70Val;8 m; S. S% j' o' F/ p- t+ c# D& F) y
% N5 m4 y- _3 E6 D# z- I- values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;
% k- N" b$ Y, A - }
) z% x C1 a) _ r - 6 m( s r; x f6 F+ J
- void Car()+ [. {( f. p$ y X5 Z& D
- {
! f; c, l9 _) k* B: k - while (1) {3 S* _1 ]& d9 d5 x
- CNY70();! a, X6 O* m. ~' w2 U9 ?" C
- 9 y1 s, q1 H7 B2 }- B! @
- int error = ((int)values);
2 r ~1 I d9 K - interror += error;1 g" A- i1 c2 @
- int lasterror = error - olderror;
' H# Y- f' j# L- [- u: o - olderror = error;
; c) _1 @ G$ f% k - int power = error / 5 + interror / 10000 + lasterror;
! G5 a p, x: W* d- S
5 R+ ~5 d3 E5 I% A" q7 E" D- if (power > MotoSpeed)$ w0 v& D) _ ^. v. r* j0 W8 ?9 k! _, y
- power = MotoSpeed;# p1 E# W$ _* r2 h3 V: t* O! G! q: |
- if (power < -MotoSpeed)5 j; A2 U1 Y+ o, h2 E
- power = -MotoSpeed;/ X, _ P n# a+ l1 q" Q
9 W$ \4 d4 m! d/ x: T- if (power > 0)
: ]- G4 a" d. E( |# ~/ ^ - Speed(MotoSpeed, MotoSpeed - power); //馬達動作,正數正轉 負數反轉。
+ ?, l- l6 s, ?; V - else, g4 M, C- Q9 k$ c9 {$ L. S6 T! f
- Speed(MotoSpeed + power, MotoSpeed);
% e8 ?! M* }3 P) ?9 @- ~8 o, Z1 ^0 P - }1 G5 j7 Q' F. s+ I3 z# W
- }
複製代碼 6 }" O$ P E# Q' U& X5 y
* ]8 R& d ~# \( h: O0 [+ t
|
|