|
|
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯
4 s" t; I+ ^ L; G8 j8 w+ R) s5 t1 ? v. q S
您好,不知是否能向您請教。( Z; Y0 s: k& u; n. }# y
目前和宋修賢老師在處理Ardui Car/ J) r6 u# o& l3 f0 k6 h2 i8 a' q
雖然已使用較繁雜的方式處理了跑出黑線外的狀況$ c& |: Q; t- M& r
+ H4 u& x% s( h" B( x& p
但基於想追求更精簡的程式所以還是想請問一下0 v3 ?/ J- h& C( D' x
就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝( r/ n+ h4 o, l# s0 N3 Y, H
不知道您是否願意教我可以如何處理
7 v1 I2 q; `$ q8 u$ X! a$ K3 ]2 n M8 N: j7 k$ a k k
$ D6 X) Y5 t) u% ?7 }; t6 Q以下是我挑出我一般寫純PID控制的Code:- int MotoSpeed = 250;
2 T+ h0 h. v! F- j4 y+ \ - double CNY70Val = 1000;* M, ~/ z: ^& N* @$ ~$ O7 a
- int interror = 0;
: _+ @" ?9 P6 k5 A0 c5 Z& n - int olderror = 0;
: U0 L( H( n3 d( G% Z - double values;7 _" o: D3 b, ^, _9 R
6 W" a4 \' e" Y+ z* F# t v% S X
, d( A1 r( |& e) Q- void CNY70()
$ @9 G: e- O) i ^1 L# x - {5 T1 U( \2 }2 V
- valuesRR = analogRead(RR)& a6 h9 L% d0 d& G; p
- valuesMR = analogRead(MR);4 |/ d& R. _/ v( a9 K& Z, \
- valuesMM = analogRead(MM);
) r( @! `' z! D) T# A - valuesML = analogRead(ML);* O5 T1 U; g5 [9 \5 z) {! B5 ?& }/ z
- valuesLL = analogRead(LL);) x7 o7 w! V m/ V, F- v
- ! s, ~% u5 F5 c( y
- if (valuesRR > CNY70Val)
T% `; s4 Y- A4 L `6 l$ w - valuesRR = CNY70Val;
, ?' y0 `$ g' r! U% e( w( \, D - if (valuesMR > CNY70Val)6 J' d- t$ o! ]& x( L
- valuesMR = CNY70Val;
% k+ t" }, N: {3 e5 s5 o3 a4 L - if (valuesMM > CNY70Val)
' Q- l. B2 g6 ~& \ - valuesMM = CNY70Val;, k8 I$ _7 K6 K7 {
- if (valuesML > CNY70Val). J+ i. E8 z$ W
- valuesML = CNY70Val;% X, W& G8 K% h1 T2 n
- if (valuesLL > CNY70Val)
2 m' e- l5 j# S* T - valuesLL = CNY70Val;) a' v4 B# ~. U- \0 H
- 8 b& {$ ?8 A, P |
- values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;
! ~5 a; F D! Q - }
4 D }$ C+ W1 \* U# R/ F
, ~- [$ t6 _# J5 w ^9 ~$ A9 U. ]2 m- void Car() J( |$ L: Z/ L6 d, T
- {
& q r. `) o0 D - while (1) {
( [4 ~9 O8 n' j9 K - CNY70();8 \/ f8 ]8 p- j- Z; H9 a8 @
- & K2 A y3 a' m
- int error = ((int)values);& E# X3 Q8 W9 q/ a8 W: K- Y
- interror += error;% U! [5 \8 `! }1 H# c+ F
- int lasterror = error - olderror;
8 b6 r- A* a" P1 Q @, Y9 ~ - olderror = error;! l0 v4 j; j" S: l
- int power = error / 5 + interror / 10000 + lasterror;
4 g5 L, @6 g* c/ u- Y - 8 @; ?: H3 K1 H' R3 o- T7 n
- if (power > MotoSpeed)* j; A( x* B( \, T; n6 o0 t9 R
- power = MotoSpeed;
0 @$ K/ X% P' A - if (power < -MotoSpeed)1 y( n8 x- [# T( m! o; |
- power = -MotoSpeed;( ~% w) n$ V( z% v+ U, }
- 1 ^5 d& D8 ?2 q" `- Z) o
- if (power > 0)( u. g' S$ a+ N) {# d: p
- Speed(MotoSpeed, MotoSpeed - power); //馬達動作,正數正轉 負數反轉。- ]0 x7 E, J* |8 L' R! I
- else+ |* @% E# q) s, D, d' ?" M
- Speed(MotoSpeed + power, MotoSpeed);7 k' d! k* X6 t# L
- }
. D1 p& @1 p4 Z* e1 L - }
複製代碼
" D5 @) n: q+ V
! U- E% |% V2 p( E- Z |
|