|
|
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯
* H+ N5 C/ c) Z. M: Q+ W9 a( ?$ p9 k
您好,不知是否能向您請教。
7 z0 E1 |7 v0 S- ~7 p* b9 A |. E. N目前和宋修賢老師在處理Ardui Car4 R! l) y- Y, U
雖然已使用較繁雜的方式處理了跑出黑線外的狀況* p9 X$ t5 P) u! i7 v0 T8 g
! O5 o# _. H2 q0 \# m
但基於想追求更精簡的程式所以還是想請問一下% p. r+ z' E0 }3 O. E% J
就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝
7 f6 {, x o# B* J不知道您是否願意教我可以如何處理1 K/ v" N3 M; u; ~) G7 \
2 Z! b# A+ F3 A9 F4 z9 k
" d/ Z3 v/ a2 r% B; O以下是我挑出我一般寫純PID控制的Code:- int MotoSpeed = 250;
2 h$ q5 y8 x2 Y) x% m2 Y - double CNY70Val = 1000;
6 y H8 a. _3 @1 ~ - int interror = 0;* D y) B# r6 F. q0 x7 E) Z
- int olderror = 0;* Y3 A5 y" s& U- j# [0 d' b, E' u; e0 P
- double values;
5 k$ O# i' M% R5 e4 Z8 @# M - % l- [5 R/ b+ K/ d+ O
- % p* J6 n8 O2 I1 `8 t* s
- void CNY70()
4 i9 y0 s2 ]- f9 V( j/ m, y6 r - { T. Y" c9 e; H0 {# I# q* C# |
- valuesRR = analogRead(RR)$ m. D2 a: z: C
- valuesMR = analogRead(MR);
9 P$ \( M% y, x - valuesMM = analogRead(MM);- O# D4 x. ^- c7 w& s
- valuesML = analogRead(ML);
4 S# `7 N6 f. f7 }# w4 T% w1 |# @ - valuesLL = analogRead(LL);) ~! V( C) p8 r5 T& n
- 2 W2 z) p/ [4 X8 _: i
- if (valuesRR > CNY70Val)+ y- Y/ R/ X2 `; b7 a5 l+ f
- valuesRR = CNY70Val;) X4 I1 E( G! k. y* z
- if (valuesMR > CNY70Val)
: H; t/ _' L, L w# y - valuesMR = CNY70Val;, X/ Z+ y& l8 X- e5 r# d, J, f
- if (valuesMM > CNY70Val)" [( A1 E$ b7 l% f
- valuesMM = CNY70Val;
% |4 @$ H% b5 d5 r. E3 F - if (valuesML > CNY70Val)
" F! @( z. d1 `6 S) b) s, e1 L! r - valuesML = CNY70Val;
+ O" Q$ _, F6 F4 k - if (valuesLL > CNY70Val)
+ f* ~8 l) B5 v# w* z0 t0 ` - valuesLL = CNY70Val;
- N5 ?/ P+ p6 @1 @# K - ! _* O3 t3 ]6 m T5 a# _5 e+ g3 k. W
- values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;
; W2 W) `4 u: ^ - }
/ _- o. u) v, u3 K f$ W) M
' U) C" l" l) j- void Car()
8 Q0 b# E, z( i, p1 Z - {% X- f- v) r1 @9 c# z
- while (1) { I! c& {6 m- `1 e: n7 C
- CNY70();
$ k! d% z( t. O. I - 6 j- P( ^* u' {& F+ r
- int error = ((int)values);9 m) q! L4 R q+ j
- interror += error;
3 }* p: C# V% S. H- W$ p - int lasterror = error - olderror;
! ~6 D9 w; c7 ]4 s! b - olderror = error;6 R: i0 ` j/ Q: E- J% [* t
- int power = error / 5 + interror / 10000 + lasterror;* W7 @0 j" h% [& }6 U' N- ]; Q
- 8 x- ^7 h4 ]7 q' }6 q4 L
- if (power > MotoSpeed), C9 r3 F! P4 [& s2 }/ r2 T8 k
- power = MotoSpeed;3 o' Z$ j3 h1 S) s3 T
- if (power < -MotoSpeed)
; @9 S/ e2 M! N) B+ g- m& W' y - power = -MotoSpeed;
1 o: d/ s; r0 W: N. C( x( g
0 W9 A1 [) U v& m: B- if (power > 0)9 c# [ S; r3 @; h
- Speed(MotoSpeed, MotoSpeed - power); //馬達動作,正數正轉 負數反轉。
2 |( `7 {3 k; D, b9 v - else
3 I$ h* k7 z) r9 ^ - Speed(MotoSpeed + power, MotoSpeed);
. @$ l" B& H: y2 t - }' Q- U$ J9 X* f o+ c
- }
複製代碼
6 g) J: g/ I H' r3 k( v" s9 u5 k: L. h- q7 s1 P
|
|