|
|
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯
/ s- X4 Z# t8 k* I# B
0 ~! c2 w3 T0 i% {. E3 Q, `您好,不知是否能向您請教。
7 ^5 Q9 U$ I9 B |" X+ F1 P目前和宋修賢老師在處理Ardui Car
* X: t/ Z, w. E雖然已使用較繁雜的方式處理了跑出黑線外的狀況% D, D: e1 P+ Y, d( X: e" b
* ^' X9 S' C W+ h j# a! d% S但基於想追求更精簡的程式所以還是想請問一下
' j& R, S& |6 |8 f! |% w就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝
! A( H8 z$ E8 G1 O7 w f1 C不知道您是否願意教我可以如何處理: m8 L/ e" A; @) u, k! \3 P
8 y7 o' M* m7 M1 a, V
( ?6 V) n5 {! z# U1 ]
以下是我挑出我一般寫純PID控制的Code:- int MotoSpeed = 250;+ F8 t g, j7 r- y ?8 ~: A- V- j
- double CNY70Val = 1000;
+ O, j0 X& O: s; D0 z8 N" R6 k' E1 J - int interror = 0;; u Q: T, H, i) X
- int olderror = 0;8 r2 k, k4 q6 A# W
- double values;
# C1 w @/ S, y - / I) T: B: ~- k4 I6 {
- ! D* ^" E1 N9 F' z% \
- void CNY70()
5 h, `) F, U7 ]* |* b! B+ A( y h - {) P4 O9 j6 p; y; z# a T2 x
- valuesRR = analogRead(RR)0 l$ ]: s* M' ?" l
- valuesMR = analogRead(MR);
$ i4 x/ c- X8 Y0 \! r - valuesMM = analogRead(MM);
9 z1 K ^! w7 r0 G& L# K - valuesML = analogRead(ML);+ l1 \; m2 F9 ]: @% |7 E, v
- valuesLL = analogRead(LL);3 W# _4 A3 c! P& m" u- a
- 2 I4 G# I# a% `6 ]7 [# I
- if (valuesRR > CNY70Val)" |8 R7 O6 w3 n, Z
- valuesRR = CNY70Val;
8 b+ t# Y' o$ B0 L" i - if (valuesMR > CNY70Val)1 t2 z8 {& }4 d& ~0 j ?
- valuesMR = CNY70Val;3 ]( b3 T( u9 P. j( k7 ]( x5 W0 `
- if (valuesMM > CNY70Val)
0 I! z# A, H" k; O& a$ H4 s( Y - valuesMM = CNY70Val;
# ^* a- J: [9 \ N, W, i! \ - if (valuesML > CNY70Val) [+ `- P7 F; b
- valuesML = CNY70Val;7 r, \, F6 @& e# W7 z
- if (valuesLL > CNY70Val)
; r: l0 ^- y4 [* b, \+ ? - valuesLL = CNY70Val;
3 r3 Q4 l- Q7 a8 V7 `0 h - 5 a! A) T, \( x! y
- values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;* N4 i8 n# _) ~; h0 r
- }+ z# B0 c; Q1 X5 D
- / i1 x3 A4 i( f5 @8 u
- void Car()0 m- J; m! x& _: U i. W4 S" x T
- {( l7 y8 S* g: O2 _+ _# ], q
- while (1) {
[8 v( y+ x! P$ r% _. N( M - CNY70();
! @: o* y' Z, n( D, P& ]( O0 v
. t4 H- r9 P6 t: h" ^" M/ A- int error = ((int)values);
* {5 h [* @$ U8 m - interror += error;
, |4 d# Y+ ^6 `$ m7 f( i, V - int lasterror = error - olderror;" Z; N4 M! C0 t# @- ^) C
- olderror = error;
8 l0 E I7 {2 U d- y) [. | - int power = error / 5 + interror / 10000 + lasterror;
3 w1 P2 J0 P5 N8 C2 [7 M6 l
: \; T- o: f4 w* F7 A( f" L9 H- if (power > MotoSpeed)% Z& j1 f3 }4 w @" k' M
- power = MotoSpeed;
r- Y7 j2 }- h - if (power < -MotoSpeed)% g& t/ }2 K0 [* I5 Y1 {
- power = -MotoSpeed;; A0 l9 w, L) k; y' ~
- 1 T: ]' W! T% g9 s
- if (power > 0)& _: m1 f$ h& h" ?/ U, \
- Speed(MotoSpeed, MotoSpeed - power); //馬達動作,正數正轉 負數反轉。( ?8 l$ [, o: R6 N
- else! R6 h9 o3 f- r$ f. {7 k9 t
- Speed(MotoSpeed + power, MotoSpeed);) Q M" b2 w0 U
- }% |) l6 G q" A. z' k- ~3 ?6 Z4 t& v
- }
複製代碼 & ?: y# }, V8 |1 @
) u1 t9 |1 H* ?4 o" g |
|