|
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯 / D" t, z$ `% U+ R% ^* {" c! Q8 m
% Q& ^) a6 t( h ]您好,不知是否能向您請教。
% o8 Z/ |+ \( Y* J7 X5 h目前和宋修賢老師在處理Ardui Car
% N0 a# i. c, b6 X- D$ M# v雖然已使用較繁雜的方式處理了跑出黑線外的狀況
- q: \" n5 V% Q O/ F$ S
7 ~" E: _! L- U' B& C8 X但基於想追求更精簡的程式所以還是想請問一下
7 B* I7 [0 k1 O; ~# X8 J4 O$ k3 V就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝; G5 v% p5 y" J% e9 {& W) @
不知道您是否願意教我可以如何處理/ ~) m7 U f% w) G; M) l
* t( y2 O( ^+ l3 h. i% o( ], Q/ x
以下是我挑出我一般寫純PID控制的Code:- int MotoSpeed = 250;
3 b/ E. K M% `# Z/ ?3 n2 Z5 T& ^- v - double CNY70Val = 1000;
8 y" V# v# n& D$ B - int interror = 0;
2 b/ v$ m7 h: H0 { - int olderror = 0;
" j8 `$ \" \& E- F$ p9 N! E - double values;! a- ]/ T( J/ O% a+ ^
! V! _$ W1 z+ g4 z# v: O4 F G/ f
! o( W. h* E/ l# W5 Q n- void CNY70()' }, j. E1 \+ I5 b! C
- {2 t7 x! G' \/ m: ]8 t
- valuesRR = analogRead(RR)' s# J. O" \& F9 `5 d- F) K+ r8 i
- valuesMR = analogRead(MR);1 V3 A! _& F2 T
- valuesMM = analogRead(MM);! h! P* O9 T! j5 e* A; I
- valuesML = analogRead(ML);( X8 e( g' V; T4 Z# F9 h, V
- valuesLL = analogRead(LL); [1 l, v7 {" c( L$ z# T
- ! Y! L* x+ r; p+ r, c: E# _
- if (valuesRR > CNY70Val)* D+ q7 H, {. T6 k: O( v
- valuesRR = CNY70Val;% K' t. p2 o5 h
- if (valuesMR > CNY70Val)6 m# S" u* z, q Q* V
- valuesMR = CNY70Val;
. p* t6 O# k6 A8 \6 T - if (valuesMM > CNY70Val)
# w. p+ }, s! {, V' E) t+ @" W - valuesMM = CNY70Val;, }6 R" C$ F8 \0 u% y# z6 Q/ ]: K
- if (valuesML > CNY70Val)% ~1 X5 O8 S) R E8 T
- valuesML = CNY70Val;4 L; r* N' [* j
- if (valuesLL > CNY70Val)+ \$ p9 L9 e/ p2 t9 h' d6 K
- valuesLL = CNY70Val;
' N9 W5 C Q) g }6 U - - y* }$ ]% Q" X; s8 G. i! ] U' L
- values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;
* v- A& F. F5 R. N - }
, W, A, X, v" }8 x
# E4 V2 _3 c4 w4 D3 R9 a/ g- void Car()* D/ J$ F0 ?3 g4 b
- {* s" \5 K. i; F7 `& U
- while (1) {4 q" B" D) e# `6 } r! N
- CNY70();
: G9 Y7 \% m. s. E# n - ) j8 W$ t% U' C7 t {$ R, O$ h
- int error = ((int)values);
) j% B7 ?( x' [/ ~1 X1 z# E, i - interror += error;
6 W9 m' {8 a! r5 [9 e5 w - int lasterror = error - olderror;
5 c8 v. C0 I7 D3 _/ g& [, v - olderror = error;
" o( c* Y8 H; b! r9 s ^ - int power = error / 5 + interror / 10000 + lasterror;
6 A! t# R9 `( P% h" n7 O& `0 h. X/ m - + h* ~4 d0 _7 |0 Q( V. v2 N* T1 f
- if (power > MotoSpeed)1 ]7 |0 l' b6 l: X- [; R
- power = MotoSpeed;
5 S# J+ U4 @4 g+ k - if (power < -MotoSpeed)8 m) E& i7 A0 y+ K* P8 q2 a
- power = -MotoSpeed;
7 W$ V0 C0 q# u- ?! s - ! T. H# u: i( F
- if (power > 0)
* M& ?$ h5 \- Z" C7 w( f& h* @( q - Speed(MotoSpeed, MotoSpeed - power); //馬達動作,正數正轉 負數反轉。2 C3 y; {) W) q% m9 {/ u* v
- else
( i2 j3 q/ B& c- m5 n7 |. c - Speed(MotoSpeed + power, MotoSpeed); ?( C# u8 Z- `/ N- x) j5 ~
- }
* U0 y5 o! h- `% [ - }
複製代碼
2 o3 ^" } W; H' `* [5 I$ P, Y' p3 [2 K+ l& s2 |
|
|