|
|
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯
* _# p U* _% U" R
8 k1 U7 ]+ _, ?- |4 d1 W您好,不知是否能向您請教。3 V7 [7 Y% D8 D+ k) r
目前和宋修賢老師在處理Ardui Car! l9 V2 W6 D6 P; ~" p7 v
雖然已使用較繁雜的方式處理了跑出黑線外的狀況# w6 S( W1 t {% G: l+ U9 a- P% m
7 h+ A6 W' o7 t- j# A& _8 ]0 a
但基於想追求更精簡的程式所以還是想請問一下
2 k* [% Z" p8 Z. \& |1 I就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝
' _* }6 K/ o2 h2 M0 k& m不知道您是否願意教我可以如何處理( n: Z% ~; L9 f2 B* [
# g7 `. U- e, J% y- u9 `3 s
% ? w2 E; C: y, h# h1 h6 h以下是我挑出我一般寫純PID控制的Code:- int MotoSpeed = 250;
^0 z* l- n+ G' ^ - double CNY70Val = 1000;
7 a# J: X0 E6 @ ]- u6 q5 e - int interror = 0;0 q. T/ ?3 i- |+ w- w# O& N
- int olderror = 0;
h$ s' S$ P9 ^ - double values;1 d; g" Z. Y. x
- # C& r9 l6 x: v o; f3 I
" V/ H% m) D- T$ p5 Y- void CNY70()
2 @' }5 W5 P0 t5 G. @9 H# A - {
. c& q6 J. |" ? X j! | - valuesRR = analogRead(RR)
' `, }- D: c, L4 N! K& I0 ~ - valuesMR = analogRead(MR);- N# p7 s! u9 m0 A8 N
- valuesMM = analogRead(MM);
1 u, o8 j+ I$ }, a% a! y7 E/ i: x - valuesML = analogRead(ML);
; L, B, W# n: I3 b9 @ - valuesLL = analogRead(LL);, |5 ]8 ~, c$ ~0 R$ ^5 Q9 ~
- / T1 Y: a9 K- o9 y5 h. ?1 G( _% P
- if (valuesRR > CNY70Val)2 t. Z( b4 ^+ @
- valuesRR = CNY70Val;4 b" F' Y( m9 c5 m
- if (valuesMR > CNY70Val)
+ b. J( W6 G$ X - valuesMR = CNY70Val;
2 v/ W q2 |* A/ a x - if (valuesMM > CNY70Val)3 z! Y# ^% E$ S8 D# K- [, i
- valuesMM = CNY70Val;
* V4 A1 x! Y O9 \, W: Y - if (valuesML > CNY70Val)
0 F! g) v/ C& D! W - valuesML = CNY70Val;5 k% Y% s* b7 K
- if (valuesLL > CNY70Val)
& X- W' a9 _4 k5 A$ D7 m; k* B - valuesLL = CNY70Val;
! r8 E. {9 R/ [, @ - ! X2 ^) x" y& R( E( Q
- values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;
+ V. A# Z: R! ]! T0 e - }9 ]1 H( Z* R8 O$ Y7 r; W2 I
- ; g6 W! e, L- T" D7 S
- void Car()" \* k' \0 P8 f3 I) t4 K& f9 U
- {
$ u; L; E' C# ^; a- h - while (1) {! c; [) Q: q- _5 L2 N
- CNY70();
/ a. e2 B, _% p3 \ - $ P2 ~2 T' E* d, U
- int error = ((int)values);8 N. r: f1 r& K) v
- interror += error; C/ x o& K, s( [+ V
- int lasterror = error - olderror;
& U( D: |! O9 Y, W - olderror = error;
& M* v& Z% t* R5 W - int power = error / 5 + interror / 10000 + lasterror;$ z2 `) y. p2 d z' a" u+ K
7 W2 O- m6 }9 Q- {; l1 J5 O8 L- if (power > MotoSpeed): P/ N0 v: U8 j7 D- b
- power = MotoSpeed;+ K- M( Q! _0 X9 x' q! U F7 a
- if (power < -MotoSpeed)
$ j: x# z3 E( V! S - power = -MotoSpeed;" L4 Y5 j6 s5 k- q0 r% U
8 n( ~6 e7 z$ p! Z5 _; U9 N- if (power > 0)
" a: K C$ F- v - Speed(MotoSpeed, MotoSpeed - power); //馬達動作,正數正轉 負數反轉。+ [9 K2 [4 Y2 D6 {* f
- else
& Q9 u% P" I9 A2 a - Speed(MotoSpeed + power, MotoSpeed);) [, k0 X$ M M( F c& m
- }
5 j4 Y/ M G" R. Y& B$ ~; Q9 v4 V - }
複製代碼
" f. w+ k4 M+ C$ T, O$ ~& x6 \ ?' _3 d
|
|