|
|
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯
: C- g! v/ p9 M( i- O& d$ W0 b4 ^+ S) ]- ]" e, T$ t) P1 O
您好,不知是否能向您請教。/ \* \; s, o7 W* Y( v6 J+ \
目前和宋修賢老師在處理Ardui Car
% O T( z9 e" y2 n) v雖然已使用較繁雜的方式處理了跑出黑線外的狀況; u' f5 f ]# w- [5 K6 Z* s% C& \/ s
+ K* e: D, |; e+ G3 H8 I. u
但基於想追求更精簡的程式所以還是想請問一下
! ]8 l8 G6 B& `# N6 C# k8 [& A就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝$ o; `' ], }' t1 A* A* x" X
不知道您是否願意教我可以如何處理
! x3 t' L0 p& e" v* N0 U7 H! {
9 O4 t! n, c8 H) m
- c! O8 z4 v+ F1 Z: [% I以下是我挑出我一般寫純PID控制的Code:- int MotoSpeed = 250;
+ Z) E- q) t- M8 k" I8 b' U& @ S - double CNY70Val = 1000;3 f3 m( ]/ l" n: Q2 A
- int interror = 0;/ {5 P* [. @$ X4 z( Q5 p' x( k
- int olderror = 0;
! s8 s; p+ F# L5 K; n. q0 N, s1 j - double values;
# G: x/ S6 t& k9 O3 V+ a' I
. s9 _$ Y: ?( [5 h
# i$ F6 F, m! f R1 {3 Z0 R8 F- void CNY70()* c2 \; }8 O' H2 M
- {0 Z8 H+ S' y$ _/ e+ i( j- D
- valuesRR = analogRead(RR): U' \: V( o( J, u
- valuesMR = analogRead(MR);4 O( T" B7 G2 Q! H `
- valuesMM = analogRead(MM);
! W7 w$ Q! o1 |, D - valuesML = analogRead(ML);
( [" \9 b0 P1 h4 j H+ ?; U - valuesLL = analogRead(LL);$ r! f P, R, R
- # O: V7 o0 U) C6 K$ P
- if (valuesRR > CNY70Val)
. A6 W9 L. y+ R7 O - valuesRR = CNY70Val;5 X( X( V# T# I9 N" K8 z8 F
- if (valuesMR > CNY70Val)
: {6 }+ g$ f" o( h) l - valuesMR = CNY70Val;/ M- \# d r4 [& H! n
- if (valuesMM > CNY70Val)
1 j2 ~) J$ z4 v$ I3 M - valuesMM = CNY70Val;
* L% \7 ?" Q" ?# m: `0 t6 Z - if (valuesML > CNY70Val)
6 O* Q/ Z' }6 Y" H/ N2 D* N1 ~ - valuesML = CNY70Val;
+ T' A ~4 g$ ^4 o+ Z, H" E3 x - if (valuesLL > CNY70Val)) m4 D. c; |4 V% `
- valuesLL = CNY70Val;2 x4 w8 K5 s/ t0 S$ [
- & w: S1 |" Y0 y% p+ ~' T N
- values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;
' S& M4 A) s. ]( N- p8 O% B& p - }/ {7 I$ M5 z6 ^+ ]& {" m
# N4 W3 h& H$ p$ D+ W6 p- void Car()
' ^& U7 f4 |! L2 [ - {5 P4 `0 q1 d! ]' s8 e T
- while (1) {/ u, \& _5 A$ X" M9 r* t. B
- CNY70();" r4 M0 j @3 j# H
- # u, z, q6 d& w5 C; Q
- int error = ((int)values);0 E9 G& I) n" m; {. r# K
- interror += error;% a( `7 R* s b. z/ w5 q
- int lasterror = error - olderror;( x8 i/ G3 `4 [7 |+ z
- olderror = error;. R$ s) u# S8 X
- int power = error / 5 + interror / 10000 + lasterror;
, p z: ^5 r- D p
5 Q2 L( q! ]* G/ w) z3 W( |- if (power > MotoSpeed)+ n+ M; q+ y, j* [
- power = MotoSpeed;
$ ^: `) K; H9 G - if (power < -MotoSpeed)
6 o% j/ d1 ]+ t - power = -MotoSpeed;
0 A5 V$ b/ J9 e0 T, x - ( L. k9 J8 x) _
- if (power > 0)+ }2 a, g) D8 A8 e6 \9 T: h
- Speed(MotoSpeed, MotoSpeed - power); //馬達動作,正數正轉 負數反轉。
# o% Z, K9 a( {/ U - else
, Z+ l: P3 x' {9 q9 u d - Speed(MotoSpeed + power, MotoSpeed);
1 z- t0 K4 v! l2 ]7 E - }; I4 E7 g& t- v) b" e% h
- }
複製代碼
" p; i1 V# e+ ~ X
/ }3 x' ]9 E6 z6 f: j6 g |
|