|
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯
9 p) `3 K" t5 U4 e$ R
. s3 q7 @3 z1 @# P您好,不知是否能向您請教。/ A5 z4 P% O: n5 I6 [
目前和宋修賢老師在處理Ardui Car' }+ j6 r/ s4 R( O
雖然已使用較繁雜的方式處理了跑出黑線外的狀況
% y+ u% [0 I, [3 Q
- w( I5 O, ?2 F6 X+ g$ |" M但基於想追求更精簡的程式所以還是想請問一下* C0 D$ I8 ]5 I" i" b
就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝, T0 B( \3 _1 W# n
不知道您是否願意教我可以如何處理( P% e$ e3 b6 S8 a" e5 M
9 X& O+ A: z2 A" e9 I; Z" c
0 s; f) n" Q" ?$ B) t以下是我挑出我一般寫純PID控制的Code:- int MotoSpeed = 250;( q8 K i+ @ n8 n' k$ u
- double CNY70Val = 1000;1 R- Z( y/ b0 G3 f
- int interror = 0;
# J+ }1 C$ l2 p) Y - int olderror = 0;) Q9 v8 H, ^' j% B: \
- double values;
$ M5 W: I. X! D, k+ E: K
+ q/ {5 ^4 K, v% S, n- 0 E [$ [0 u$ Z
- void CNY70()
6 S1 K5 i; P j3 [$ }$ a - { Z2 I; X; L* n1 O% A& `
- valuesRR = analogRead(RR)6 Z- r) l' H* |, C* ?$ ]! h
- valuesMR = analogRead(MR);
' R- j1 e! R1 W' ^/ J4 l - valuesMM = analogRead(MM);
5 X2 [5 A& `+ Q: m7 y+ H { - valuesML = analogRead(ML);+ n& u6 B% L( l. t$ V0 o* `$ G
- valuesLL = analogRead(LL);
1 O3 U4 e/ i! K
( n7 c6 ?0 e6 k" d5 U3 b9 E- if (valuesRR > CNY70Val)
5 G; o: Y# x9 N/ h - valuesRR = CNY70Val;
& H. F; b% I+ s2 ]* [2 O6 a - if (valuesMR > CNY70Val)* K9 L9 U' {; E+ H1 n8 Q
- valuesMR = CNY70Val;
- A* g+ e. m/ V - if (valuesMM > CNY70Val)
. |3 W4 Q3 b1 \" P, p; @/ J# \1 P - valuesMM = CNY70Val;: }- o/ l" W# u
- if (valuesML > CNY70Val)( S% ~* p$ `/ G# C
- valuesML = CNY70Val;
+ x; J, e' Q* L( H# d - if (valuesLL > CNY70Val)! J- n5 T. I6 B7 |% W
- valuesLL = CNY70Val;/ \% Z# x A4 {0 v- H
- ! ~# @& m3 E6 {" `( Z. {; Q1 ]9 S
- values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;% Z/ R v S& U6 d" k
- }% |$ u; @! |* H/ R9 I7 D
; l) O4 @" ]& }* j0 G5 @5 Q- void Car(), k7 g1 b& l8 `/ c4 N
- {6 ~- l, r5 m1 i8 W+ ^
- while (1) {
; _- A# g( v" [8 X _ - CNY70();& P$ g8 ~$ O" H
- " i' s$ W7 @; @; T" Q6 i1 G; R
- int error = ((int)values);
, ]0 ]3 }9 v. `6 Y) A/ T - interror += error;9 T. C. E0 V0 M) X
- int lasterror = error - olderror;, c, I q* Y$ [/ ~
- olderror = error;+ d+ q4 y- k* [# x, o% T+ E' Y' x. \
- int power = error / 5 + interror / 10000 + lasterror;
: r ]' {. V' g/ N/ I5 d, [7 w
( K+ L1 }4 I7 w) W$ G7 O r7 c; o- if (power > MotoSpeed)
+ u) ~- k" E# f4 n - power = MotoSpeed;
4 X/ E- b: o- r. F, w - if (power < -MotoSpeed)$ ~2 y9 m8 D0 {) K' f4 q" ~
- power = -MotoSpeed;
k/ R7 v' w7 Y4 ? E - 0 n8 @& Z: l# k2 S" T; F; ~
- if (power > 0)
1 I+ Y2 H& F5 B$ F/ t' q' }, [ - Speed(MotoSpeed, MotoSpeed - power); //馬達動作,正數正轉 負數反轉。, x2 O+ r1 {/ S7 A6 l
- else% X" }; C# K0 N1 `- B0 m0 U5 m7 v
- Speed(MotoSpeed + power, MotoSpeed);
- z8 @2 {& V4 i1 T9 _ - }5 M' D# r3 |) @6 m; T% U5 D6 \
- }
複製代碼
6 {" z0 [( j( N+ Q2 a$ v/ a9 z
* S8 L, v# x1 R! B |
|