|
|
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯
/ x8 h2 f3 X2 f- R$ |$ k9 p3 K
) ^0 W e7 m& C6 b您好,不知是否能向您請教。
; u0 W. {% x, A6 w目前和宋修賢老師在處理Ardui Car
6 g& C0 \$ l5 U" h: q* b: @雖然已使用較繁雜的方式處理了跑出黑線外的狀況
" L" Q7 k- K6 s+ E* U# C5 B6 q, n& h
但基於想追求更精簡的程式所以還是想請問一下
( y x' @6 L7 b就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝; v7 l2 L; _$ W% b6 H/ V
不知道您是否願意教我可以如何處理
% d. p) D8 x) J1 \5 t) h; W
$ Q- |9 D) U1 u0 O4 ^' C/ L+ w q) ~+ }. J6 O( M
以下是我挑出我一般寫純PID控制的Code:- int MotoSpeed = 250;
! ^! B- d/ {% `+ z - double CNY70Val = 1000;3 B p! c2 f' w
- int interror = 0;
' i3 k& G N1 G4 c - int olderror = 0;. b! ^0 d; J* t' X, {; U# P8 j0 V
- double values;, r8 c( F- p9 i3 x/ `, W
- 9 o# D! o! L G1 Q" E2 G7 M
- 1 n) \( F7 }- s
- void CNY70()
0 N/ s2 v9 ~, m4 @ - {
3 _0 b& [3 j G/ g% X - valuesRR = analogRead(RR)
% |' J V' u1 N" U& O - valuesMR = analogRead(MR); D. p1 X0 i0 ~, S X
- valuesMM = analogRead(MM);
+ H$ q$ a& d& t; p$ z) C( v - valuesML = analogRead(ML);
' y; ^+ ]* ]+ `. R! y! w) D6 J - valuesLL = analogRead(LL);% f) P3 x v, d5 V6 o3 t
- 5 b, x3 t; E5 r, P( m" `
- if (valuesRR > CNY70Val)
* q, E/ {2 x/ ~0 h6 | - valuesRR = CNY70Val;
n, k4 @7 a- o% b - if (valuesMR > CNY70Val)4 C2 l4 ?9 ~$ U H+ H7 U- y
- valuesMR = CNY70Val;; c/ N: u% `% d0 g$ ?9 p1 P
- if (valuesMM > CNY70Val)# l' `" ~- I4 p8 I7 D0 g) R: g
- valuesMM = CNY70Val;6 g( g, W5 Z& p7 D# L, G
- if (valuesML > CNY70Val)
6 v8 W/ W# c8 v2 R# a0 ~3 Q/ x - valuesML = CNY70Val;5 J; h' l4 V( l+ b. ^ o( Y2 j
- if (valuesLL > CNY70Val)9 ^* s/ p$ |9 t) F4 `. }1 |
- valuesLL = CNY70Val;+ O7 z" a8 W3 k/ m( e2 ?( d) h
5 T7 y3 {+ d o( }8 |5 R. h- values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;: R, V) N) n" H# G' o7 i7 Q
- }
5 {4 R0 a) g: A; G; A
8 S0 a: S& u* g" C- void Car()
9 D. |1 D0 j/ Q- n1 R$ s' _ - {3 S. d6 v- C& u/ `: U2 w
- while (1) {
) E6 k) Q# Z4 z, k3 l3 N4 u5 W - CNY70();3 g8 B! x& G, {% Q p! y- B: @
- 4 h1 |( v3 D0 w3 u& e4 ?) j( c
- int error = ((int)values);
. [' O7 B. O! ]( E( o; s1 [% f$ A5 D - interror += error;
5 o4 f$ a, n- s* n$ B - int lasterror = error - olderror;' a4 }0 u! k/ y/ V) y: S
- olderror = error;% a6 J/ i# @' x3 v
- int power = error / 5 + interror / 10000 + lasterror;' f8 c& R5 z0 C! b! L2 L
" E9 J" K6 t6 c4 W# _- if (power > MotoSpeed)/ H+ E& L/ x% G) }+ i
- power = MotoSpeed;' T# e+ W# I" G
- if (power < -MotoSpeed)
. [0 l' @+ i2 t - power = -MotoSpeed;3 }8 n* U# N8 C/ S7 k$ v* s
- 0 s/ P6 e, G* P# m# a& R2 x# X
- if (power > 0)! b/ ^3 o" n& ~8 r
- Speed(MotoSpeed, MotoSpeed - power); //馬達動作,正數正轉 負數反轉。) `0 q4 p# O u
- else
! O+ C$ s: N, Q% e1 l - Speed(MotoSpeed + power, MotoSpeed);5 g! W& O5 r& S3 n9 K& O' G$ m; w
- }1 p9 U, x! Y" x+ } p- q
- }
複製代碼 0 w( v9 z5 \& r' i5 O9 e8 c
7 F5 M! k! \2 `2 ]8 z9 [( Q$ X
|
|