|
|
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯
: r! w& X6 H8 X, F/ T2 _) R& Q& w K
您好,不知是否能向您請教。
' E, k; x+ y! f Q9 v目前和宋修賢老師在處理Ardui Car
w* K" I9 S0 t) P: Y8 Y6 \雖然已使用較繁雜的方式處理了跑出黑線外的狀況
: w( r7 ~ \8 {5 G5 V' g% m
. O& i& p% K5 D, w, x0 U/ i但基於想追求更精簡的程式所以還是想請問一下# Z; o- C* J2 p3 {3 y
就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝
' |! I2 p' r$ h4 }) o/ K1 @8 T不知道您是否願意教我可以如何處理
4 `% W6 c) W7 c* [& v3 b3 w8 n5 g! q4 Z) m- j9 W5 L/ C
4 n$ D. Z L( m" s8 u
以下是我挑出我一般寫純PID控制的Code:- int MotoSpeed = 250;
8 N1 R( q$ x- |; J: a - double CNY70Val = 1000;& \4 v% h4 K! E- D+ B
- int interror = 0;) f" e1 u# O |4 `% D$ R
- int olderror = 0;1 f r- ]* h& p/ S0 u
- double values;' F6 r: k+ ?2 h- k1 V$ [ m9 I
: B' w3 X0 L$ T) t+ C- 2 V; c$ \. N* f
- void CNY70()
: x$ l: k3 v6 ]$ r - {' m; W4 C; k' J$ C
- valuesRR = analogRead(RR)$ g' u: d7 Y/ E4 B6 N" M! x
- valuesMR = analogRead(MR); I: ]+ z* X* C: v& d m
- valuesMM = analogRead(MM);
- O% `2 t" ^6 a4 z2 }7 X" t, u - valuesML = analogRead(ML);
" A) b" q% q' a; G$ Z4 ^, \0 M) E - valuesLL = analogRead(LL);9 u( Q. c+ l& J& u0 c. r) K
- % a% F( E6 \) R2 R
- if (valuesRR > CNY70Val)3 h7 G( f$ a$ t/ L6 d
- valuesRR = CNY70Val;
5 V8 P* O. M$ Q; Y; d) ` - if (valuesMR > CNY70Val)
& y+ {: B0 m* {( g - valuesMR = CNY70Val;# `; O5 r1 {) c9 F7 S; X
- if (valuesMM > CNY70Val)
, t) U- N% H8 b9 u5 J - valuesMM = CNY70Val;
1 {) N% I$ d' ]; n - if (valuesML > CNY70Val)
6 L- q& r% b T0 O - valuesML = CNY70Val;( s4 G. [( y' }: \# n$ T8 t
- if (valuesLL > CNY70Val)
. B" `) {+ g9 [9 R" D - valuesLL = CNY70Val;
( G, H1 Z$ [5 ~% X/ v. l
4 \8 z! ~7 p. B6 ?- values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;
1 w, t% ]. X: i# n3 f8 O0 W - }
. O! X8 F6 B q1 x1 C# ?# e - 3 `$ R1 E+ V' W g0 K
- void Car()5 y/ h+ c/ m' _8 A% x6 w/ L
- {; I( y' a" X" F4 L6 {; R7 [% j% C
- while (1) {
7 l% N) C, V0 K" I5 _ - CNY70();
7 n, F0 j4 s# o! }) \* c, w" f5 Z
% r7 s8 I* r" {, r# T J- R: D) U- int error = ((int)values);
4 t! c8 x/ Y; E( M: o2 M - interror += error;. |; o% j7 s8 \4 }$ z
- int lasterror = error - olderror;+ |* H. K0 \4 ^5 r
- olderror = error;1 v; s) V- ~8 c/ O. X
- int power = error / 5 + interror / 10000 + lasterror;2 f) m% U, a) F7 P" Y" M
8 q; E, O1 s* [) |, _7 q8 m% ~; n2 x- if (power > MotoSpeed)
. o- G: @9 h: e, @5 F2 N/ B. n v - power = MotoSpeed;- g8 _- X# T! R; `: R. G
- if (power < -MotoSpeed)7 I6 A6 ~; ]: I
- power = -MotoSpeed;
' S* a7 U+ r9 l; A+ Q1 v0 i
1 i% A8 `2 X* j S7 H K& A* f- if (power > 0) e! `% C8 y6 M m% q
- Speed(MotoSpeed, MotoSpeed - power); //馬達動作,正數正轉 負數反轉。
' s8 F; o7 {# m6 `) c - else
9 `! t- W0 t$ V - Speed(MotoSpeed + power, MotoSpeed);
0 L' |% c0 p& e7 i - } X. r; |% |* }, o6 x4 ]
- }
複製代碼 9 [, ?5 P# v `: X- u$ \' [' m0 N w
3 B* E- I) D0 T( r) \: f
|
|