|
|
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯
& l) Y6 W/ i* }+ \: S8 |& @# |. J, n$ U. F0 h# _
您好,不知是否能向您請教。" P1 x. `' ~" X
目前和宋修賢老師在處理Ardui Car
* ~5 R- t. i; E雖然已使用較繁雜的方式處理了跑出黑線外的狀況* u/ |+ M5 B6 U0 d
1 u! m$ V1 s" d$ J$ F( V) k但基於想追求更精簡的程式所以還是想請問一下
* U8 K* p) f% c/ @4 } X# o! m3 j9 i就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝7 P1 q) h. ~/ I2 h
不知道您是否願意教我可以如何處理- j4 _# Q# ^) ^; D9 h! N
2 t! R+ c2 C8 f7 I
3 o0 o. X4 r+ A( O* b以下是我挑出我一般寫純PID控制的Code:- int MotoSpeed = 250;5 e, U1 @7 C! a* O2 X' M* x# X% e
- double CNY70Val = 1000;) y4 M3 p, N( i
- int interror = 0;! o0 D. z+ {2 G
- int olderror = 0;
: W4 f' u1 ~6 {! W3 M0 T G: m - double values;
" Z' n/ H) C4 P7 N" x% h
5 V' a1 D# `( n Q3 d- ; \7 p6 e( t* H% k/ T8 S, `
- void CNY70()
" v! T. R3 f) i+ d - {, R& Q' h3 c: D) i6 R8 k( z& f$ L
- valuesRR = analogRead(RR)% d+ D3 ~, l' v( a$ V
- valuesMR = analogRead(MR);
' L7 {6 n7 V( ~4 `, D- O$ X - valuesMM = analogRead(MM);
, Y* _5 H) I' D- `5 @: Q, B6 f - valuesML = analogRead(ML);
+ n2 g+ p% o6 E - valuesLL = analogRead(LL);
. _ }$ ?! E9 m
( ~/ U% x5 r% I5 T8 T% Y- if (valuesRR > CNY70Val)2 z: I j, P& w7 U4 Y
- valuesRR = CNY70Val;
9 U5 S i* \9 h5 U; d" ` - if (valuesMR > CNY70Val). X2 D& J" ?7 S" E3 }
- valuesMR = CNY70Val;
# T* o9 {: ]/ H5 o5 i$ T - if (valuesMM > CNY70Val)
8 [4 W) g0 v/ u& C3 i$ j - valuesMM = CNY70Val;: T6 o* Y5 Z( X! v/ d8 ?
- if (valuesML > CNY70Val)
) a* {# Y6 h4 W - valuesML = CNY70Val;9 g. H0 H, E$ I; z
- if (valuesLL > CNY70Val)( K$ w W. u: k
- valuesLL = CNY70Val;0 [5 f+ k/ {4 F" c3 |7 b
- ) v/ E: D8 W4 Q+ K
- values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;- B* B. p6 ^. q; e$ q
- }
, _" g) B8 @7 J5 @! k* L3 B& Z - $ l# V6 \9 y3 ^* Y
- void Car()
* K$ _/ j4 {0 F d! w8 |( x - {
' r" `6 k* h, b. ~2 f+ t# i9 Z - while (1) {
2 j `* a7 B2 D5 I - CNY70();
9 g+ [$ m {0 X4 A1 O/ v4 ?6 \! x
! J- o/ |( x5 V- int error = ((int)values);' b/ q7 X/ D* s( a% U( w) R4 S( b
- interror += error;6 B9 ^. L1 E8 ?3 ^/ P* i
- int lasterror = error - olderror;6 T1 Z3 N i+ @8 ~
- olderror = error;
- w' D3 p# V# P5 r* l( ] - int power = error / 5 + interror / 10000 + lasterror;. M* a8 ~2 ~; b0 A" E
- 2 @1 @1 F$ A/ i9 E7 Z8 r! H
- if (power > MotoSpeed)' |3 t3 [& x( o2 g5 s' @0 K
- power = MotoSpeed;, G) _; g, q7 Y2 {% x1 v+ [( M# G, f
- if (power < -MotoSpeed). ~7 I; ^8 G8 C' Y+ s- ~
- power = -MotoSpeed;* D# a& ?4 |! H! d( w
$ R' a# |6 C2 ]1 a6 u- if (power > 0)
' U; T* d- E' V5 @2 p+ a - Speed(MotoSpeed, MotoSpeed - power); //馬達動作,正數正轉 負數反轉。
+ k# X( l ^. t j; s! v - else
& o2 i1 @4 P- A h( D5 r) w5 D - Speed(MotoSpeed + power, MotoSpeed);
. ?( Z4 U8 L0 G - }
. e1 |) U+ |2 o: c/ o - }
複製代碼
( g. G d6 _! y3 f- j& Y k( R: D, d" t0 J
|
|