|
|
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯 1 z1 B9 p" _5 X" N
% V9 n8 U7 ^( y% ]您好,不知是否能向您請教。
v/ L$ E0 s7 u* L8 v. Y3 G目前和宋修賢老師在處理Ardui Car
3 a4 q2 R1 w8 H雖然已使用較繁雜的方式處理了跑出黑線外的狀況- N+ b5 K! ]) ]; p' R z" D
$ f9 c: @0 t9 o- ]# e6 P
但基於想追求更精簡的程式所以還是想請問一下8 y0 g' U8 x/ g% I+ c* o; |, f6 D
就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝9 R* S' s$ ]5 j# E) ^$ g! v9 q
不知道您是否願意教我可以如何處理
, Y! k' H1 Q0 P% ~- s" o, I- E% k Q* P/ Y
; v7 ?5 ^4 U# V以下是我挑出我一般寫純PID控制的Code:- int MotoSpeed = 250;0 ~6 B9 S) [- Q+ s. W
- double CNY70Val = 1000;6 b! H" ?( a/ u
- int interror = 0;& Y1 t9 n' r$ i5 E
- int olderror = 0;
! Y% o1 t, Q2 e' `' D- d - double values;
8 k1 n l7 r( } u, G. S4 y
* S# [* i4 G J, c8 I* N
* @* j, c( K3 \/ h. l- void CNY70()
8 M2 y. V8 c8 K2 t' W N+ e6 f - {3 q4 ]% b9 X+ o1 X/ I4 v; f
- valuesRR = analogRead(RR)6 z" ?+ a4 Y! S
- valuesMR = analogRead(MR);0 W: v: p, D, O g
- valuesMM = analogRead(MM);
: u3 n9 B6 T( M; g" R5 |- r3 h% ]4 T - valuesML = analogRead(ML);& h$ b( Z( D, m5 j
- valuesLL = analogRead(LL);; f8 Z9 T! f S C" L/ ~
' Y5 Z# Y, E6 @0 M: ^, B- if (valuesRR > CNY70Val)1 h3 O" m, t& n7 e1 h
- valuesRR = CNY70Val;
8 c2 k) e; q2 [- v! Z% Z+ X9 ] - if (valuesMR > CNY70Val)
6 y0 w) g+ y- ]9 V# _* n. A5 B - valuesMR = CNY70Val;- p% _ y1 r, v8 y4 i- |/ s' a
- if (valuesMM > CNY70Val)) W' H) Q/ f0 q) z) ]
- valuesMM = CNY70Val;
6 ?3 b. J4 t) Z - if (valuesML > CNY70Val)
8 s: L/ I3 ~0 ^ - valuesML = CNY70Val;
6 E# P% Q0 B5 w, @" m- b; _ - if (valuesLL > CNY70Val)8 h$ `3 @" i& M2 Y7 O
- valuesLL = CNY70Val;) x' S* U6 A+ j1 g6 q1 u
3 W; h" A# ^* S$ ?: R$ G- values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;
* R' X# W: w, V. [1 H - }
$ P* L) D& L0 d) s7 w* } - 9 h9 a2 R, p0 w, n# ?6 M
- void Car()
# {4 V, j* @% j) K* ], [' G - {) J0 B7 B# z" ?1 L7 o
- while (1) {
3 \' A: {; a+ W) N - CNY70();
& N$ K0 Z1 F% y - 5 \5 M7 R3 A8 ]/ C/ Y
- int error = ((int)values);
8 K0 K4 K8 H7 f2 S6 P* M - interror += error;% u5 S# s) t% s1 P9 K
- int lasterror = error - olderror;
$ J- b8 X& X0 q1 ~/ e - olderror = error;
) |6 C. {/ ?6 D( p; ]7 {+ P - int power = error / 5 + interror / 10000 + lasterror;
2 t% v+ ^5 s# u( P4 D - 3 S, r+ H& t9 B: _; ?% v1 d/ c
- if (power > MotoSpeed)
2 M+ m2 }+ A6 X g2 j$ | - power = MotoSpeed;
# E' X& K$ O9 W4 i8 I0 _ - if (power < -MotoSpeed)
$ Y* d$ _7 ?% ]$ u, [2 y) I/ P7 w - power = -MotoSpeed;
, d) F; k. g5 i7 Q% K( k
1 H: B8 U% j: W X1 L! x- if (power > 0)2 e' |& J9 E5 Q
- Speed(MotoSpeed, MotoSpeed - power); //馬達動作,正數正轉 負數反轉。+ j2 C$ ?; o+ s N5 J, V7 R, ]) v" M
- else' |/ k# j7 e* g0 u8 M; l8 _
- Speed(MotoSpeed + power, MotoSpeed);
0 R/ G1 | t5 O0 B1 c - }
. h, P0 D8 s% h% f A. @ - }
複製代碼 ( N: P: f& Y! W7 r3 Z
, f3 [4 L7 |( Y! N% o& S$ M+ w |
|