|
|
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯
8 Z. \1 {1 m9 A' o% x6 h# \4 T; V, N+ x3 _$ c
您好,不知是否能向您請教。2 P( F; W; c4 t: S. v$ H( U7 }4 e
目前和宋修賢老師在處理Ardui Car) O2 F4 g! z9 O4 z& E& V
雖然已使用較繁雜的方式處理了跑出黑線外的狀況/ F% _& O8 ~, f9 E' s- x
x! T! o+ h, b! p" \% K( N* Y但基於想追求更精簡的程式所以還是想請問一下" p. s$ f: l8 p+ P$ `" f
就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝$ k! S4 `+ }7 M
不知道您是否願意教我可以如何處理) `8 ?/ ^& |2 m% J5 O4 ^
% j- a: [" _7 k8 A/ g% t
3 D9 b: t @+ g2 ~( w3 ^' q( z# f以下是我挑出我一般寫純PID控制的Code:- int MotoSpeed = 250;
/ E( r% c; A3 z7 Z& i' [, w - double CNY70Val = 1000;
5 {4 c( K8 Z% i" f* o* G - int interror = 0;
& c5 X( H0 _ H9 i/ w - int olderror = 0;
% B% u# i! E" t - double values;
, F& W$ i3 I$ m% P) M m - 8 }$ g' `: G2 Z. l _0 P
. _) F; r- {! Q% @* X; E. b6 g- p- void CNY70()
8 \/ {1 i+ f& } - {
3 I; e8 r8 u4 L4 B: p+ {' }( l - valuesRR = analogRead(RR) q. L- M9 \8 w7 e8 {: I
- valuesMR = analogRead(MR);: @3 m% O- T8 B4 c* m) @8 L# K6 ^
- valuesMM = analogRead(MM);
) k7 |6 `( @3 S1 \+ N - valuesML = analogRead(ML);4 @' E P$ w2 w
- valuesLL = analogRead(LL);
4 M, \ G2 c# ] - " q( t5 ?* _" V/ ?: j i7 X
- if (valuesRR > CNY70Val)3 {. M4 P! G6 J6 s! w7 k, H
- valuesRR = CNY70Val;8 C' g! p: r! i; }
- if (valuesMR > CNY70Val)1 M' Z1 L7 K/ R, ~% k3 g4 _/ H
- valuesMR = CNY70Val;
9 _! A1 V( L- ^9 X - if (valuesMM > CNY70Val)
) }2 a4 d3 L. d7 {4 Z - valuesMM = CNY70Val;
: g! `. h8 R F/ b) h - if (valuesML > CNY70Val)/ Q8 K; }4 y' N, O6 ?+ V
- valuesML = CNY70Val;# \ j! K$ [+ e
- if (valuesLL > CNY70Val)
* b( u& ^9 h+ |- P2 o - valuesLL = CNY70Val;
W0 y4 o1 s4 E8 r# W! z, C
4 y* R, Y$ Z2 g5 Z- values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;2 d# q+ N- w6 c3 [2 o3 P. \
- }. \# d% v7 ~& q7 n5 P3 ]
: V9 c$ E, n3 j1 k& X" y- void Car()
" h, n8 r) x9 W3 k0 f0 O - {7 v4 j$ E$ [$ v9 z7 B9 W
- while (1) {. H2 d5 Z2 w3 T, n* ]
- CNY70();
$ i& w; `* Q% l2 W" t- G
) c+ ?9 o+ _1 H# U- int error = ((int)values);
& S; Z% R- @# x* D8 L+ h - interror += error;
0 w% B' U- h8 q, g - int lasterror = error - olderror;
1 O2 n- ^+ @' b0 ?) |# s# w( E - olderror = error;
v k/ R; @. b - int power = error / 5 + interror / 10000 + lasterror;
" u, p5 L' C1 c; ]: u. q
1 n4 Z+ y I1 h" t- if (power > MotoSpeed)& w4 k9 i" f1 e- ^8 ]* {( E
- power = MotoSpeed;
- q9 `7 E) _+ ?! z - if (power < -MotoSpeed)( ?: Y x( I* T# {* P8 H$ B/ {) k" d
- power = -MotoSpeed;, y. j" u, M, t. d* H/ P
7 ]1 V( X* S, l, }3 w- if (power > 0)
! a' m& Q0 Y1 L! B* }, P1 I - Speed(MotoSpeed, MotoSpeed - power); //馬達動作,正數正轉 負數反轉。$ `% n% m* Z& d$ s8 y
- else
1 j# I! ]: h! ]4 f2 b - Speed(MotoSpeed + power, MotoSpeed);
8 ^3 Z: e/ z1 t+ u; _3 B - }
$ S8 _: B/ o3 p8 i, E/ a - }
複製代碼
+ L2 p% q- @$ O9 \ O& S$ Y; v B/ E
|
|