|
|
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯 - G V, u, k9 m6 V7 |& L+ D, `
* O) B3 z9 N% d* p: F: i您好,不知是否能向您請教。
- l1 I$ n, [2 `/ P& k6 }/ h3 P& ^目前和宋修賢老師在處理Ardui Car/ o9 ^( ?8 q& l9 P
雖然已使用較繁雜的方式處理了跑出黑線外的狀況% A5 M! V9 R5 H2 E' @) u
0 ]1 v2 @/ l/ y2 z但基於想追求更精簡的程式所以還是想請問一下$ Z8 x* Z v4 m) u: M6 l
就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝
8 S$ x: Y! I1 J不知道您是否願意教我可以如何處理2 ?$ q/ B6 u6 D$ s
! o# [. @3 c+ Z+ ^$ o) u3 q% m, h* z+ Z7 H* y9 m9 M0 G4 d4 r
以下是我挑出我一般寫純PID控制的Code:- int MotoSpeed = 250;
* p% ~9 @+ u( Q1 V, k+ H - double CNY70Val = 1000;7 a) q9 {- y2 J" X+ {, Y
- int interror = 0;
9 M) l( H9 M0 K# V0 W' x2 @ - int olderror = 0;
( s0 d: H9 }- `3 i - double values;
. u7 D$ E5 T$ u - & T# O, l8 \ ]/ p
- 6 U L% l# r$ L" Y7 J
- void CNY70()
: Z, j3 J' j9 e- F5 O, c" A - {
$ {+ p7 ~5 r( ^# X5 {/ Z+ @, k6 T( `4 S - valuesRR = analogRead(RR)
/ i" t9 N9 D d. @* ?8 b& } - valuesMR = analogRead(MR);
! P% J& D: @7 D/ i, {- O - valuesMM = analogRead(MM);3 i& O U" j) ]5 n0 S! e! j
- valuesML = analogRead(ML);% u6 k) b: X+ c5 q
- valuesLL = analogRead(LL);
! n8 Q+ Z4 M+ T1 K3 L" |# t
6 S% q$ k. A/ [% l' N- if (valuesRR > CNY70Val)* Y) d8 V2 }5 C9 F. u$ T) x
- valuesRR = CNY70Val;9 W* j( x3 S: `8 E, g& w! D R
- if (valuesMR > CNY70Val)" V# n+ w4 o$ d" A0 l# A, m5 g) \
- valuesMR = CNY70Val;
) {$ N7 X6 i2 Z L+ G' t9 L - if (valuesMM > CNY70Val)
0 k4 L3 F$ a: U# c0 J - valuesMM = CNY70Val;
9 d) A. R$ h- a( p8 U7 O% a - if (valuesML > CNY70Val)+ c0 C+ n% n" U) Q
- valuesML = CNY70Val;# b4 ]2 Y( i! ^$ U _
- if (valuesLL > CNY70Val)
3 \$ v/ ]3 {" ^ - valuesLL = CNY70Val;
@1 M' ^! H4 ?1 M* v - , H7 Y' K, f$ e" W
- values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;
. i/ }6 N: x E0 u - }
: n* v# g0 J0 y/ j" h
& e/ e) X& x) B1 R# z4 a/ a- void Car()( J3 N" o/ B( x
- {8 o3 h3 s. T3 J8 Q) n1 g/ P
- while (1) {
+ _/ d/ A0 c' _% R% L, N5 N - CNY70();/ l, A3 I( Q- R: C0 k
- : k. t' J( z, f; h
- int error = ((int)values);
+ J. E4 E* }, k& L - interror += error;' i% ]/ Z+ ], p' V1 D d% F
- int lasterror = error - olderror;
/ S- z+ u' A% l - olderror = error;
5 G- j; l1 c- }+ h( N - int power = error / 5 + interror / 10000 + lasterror;( n; z2 D: g# F) E7 g
- , J, k9 U4 \; M' j# M1 K
- if (power > MotoSpeed)
" w+ z2 I0 ]. d# k- X& E4 v2 Z - power = MotoSpeed;
1 J3 _1 ^) x2 }9 B) N8 n2 S9 V. y - if (power < -MotoSpeed)
# L% l6 p3 l, m b: j* _4 c - power = -MotoSpeed;
0 y% F+ L# R. e2 j - $ G2 x$ g* g/ N7 v
- if (power > 0)
$ g+ {1 X- t1 b, X - Speed(MotoSpeed, MotoSpeed - power); //馬達動作,正數正轉 負數反轉。5 x1 u) }5 ^0 H! M5 W) p( {
- else5 ~* z# ?! \% W+ Z
- Speed(MotoSpeed + power, MotoSpeed);% X Q' g" j4 b- C4 \; ?
- }2 x- U' ]6 E- r" B
- }
複製代碼 - c4 _$ d* l! z' p; Q( O$ \
+ z; U3 o8 G7 z6 e; c' e; [ |
|