|
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯 % q7 {. C3 M* D) f' b
- D2 I6 h; V; r
您好,不知是否能向您請教。
: Y5 R+ R0 P7 d9 s目前和宋修賢老師在處理Ardui Car5 [. Z3 E2 L( z% ~ M% p
雖然已使用較繁雜的方式處理了跑出黑線外的狀況
* }5 D3 T: @4 x/ s' s
3 q4 j+ v# d5 o3 H. [6 S但基於想追求更精簡的程式所以還是想請問一下1 \9 X/ B8 c0 j1 S" E
就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝
8 }. u8 n0 ^6 L" Q2 o不知道您是否願意教我可以如何處理
9 ?7 E C, G) }2 @4 n7 U$ X
% R z& R0 w0 D4 m) e- Z# R
& y0 b5 _4 c% Z' G2 k以下是我挑出我一般寫純PID控制的Code:- int MotoSpeed = 250;% }1 Z# q! N/ Q: ?7 ]3 |5 j$ ?0 L; e
- double CNY70Val = 1000;& q& V) p+ i# b
- int interror = 0;
& O4 s; }- B* J) f% q - int olderror = 0;6 ?# |. ]) d! |, n9 v
- double values;
8 `9 O" i, q0 Q0 n0 } ^
. N4 A6 `% U: F( G) T- - l* i) D. j* H& x$ q
- void CNY70()
# P( q1 o& A3 R, e8 g - {) ?1 v- e0 v1 @6 ~2 U) u' f( l2 U
- valuesRR = analogRead(RR)+ B% y# u' {0 q4 E
- valuesMR = analogRead(MR);* ^7 z# X( P" c6 I4 Y8 C) N
- valuesMM = analogRead(MM);
) J" A5 Y* s7 F$ z, u; F - valuesML = analogRead(ML);
6 C# y2 i. I$ e - valuesLL = analogRead(LL);
\% [6 b" v1 Q, Q
1 N1 |$ I2 H+ U( q$ p+ V e- if (valuesRR > CNY70Val)
+ d$ y+ r6 r* ^8 [ o - valuesRR = CNY70Val;3 k! s4 m) p6 Q' |0 y5 z# x
- if (valuesMR > CNY70Val); n2 c5 Y* E' G# r: P6 X$ P
- valuesMR = CNY70Val;
$ i0 z) f8 r' q' `$ ] - if (valuesMM > CNY70Val)" U* q+ b @( O: |1 J( J1 p
- valuesMM = CNY70Val;
# F' }* v+ a/ G- x' z - if (valuesML > CNY70Val)) p+ l0 p% n# G
- valuesML = CNY70Val;% u, W% M5 H: q6 j: S
- if (valuesLL > CNY70Val)
) {9 K( w/ F! b6 h: e5 g$ y - valuesLL = CNY70Val;
, }' Y: f4 z. T
2 l/ h1 Z9 H) ]- [& l' r- values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;
% \ ] g% f+ E% a) Z7 g1 V e - }8 B* l. Z6 y5 q9 I6 j# K3 l
, L, i% @4 y; i+ B, q! |4 X7 f* p- void Car()5 B! Z( \! @* Y& v0 E/ M# t3 U9 ?* a
- {, Y3 ^1 j0 F; ^
- while (1) {
( i: p/ a7 |3 m+ b$ T - CNY70();
* y+ A8 [, b U. m: B
8 {; A+ w0 Y5 M2 a: z- int error = ((int)values);
! ]! Z! N5 J# [& ^4 p. J/ m6 k - interror += error;) V# p: p" P$ x* I2 j, ^0 p- P
- int lasterror = error - olderror;
) d6 S/ C5 |7 b" a# R3 | - olderror = error;
' a z4 p, M( t+ h6 o& F- M5 f - int power = error / 5 + interror / 10000 + lasterror;
+ A: l+ F& L& I - ! A) [7 Q; H5 e7 F+ b
- if (power > MotoSpeed)
6 t" o5 O B/ n - power = MotoSpeed;5 p! v% n/ |; M' r7 S
- if (power < -MotoSpeed)* z" n* }* c' W& s
- power = -MotoSpeed;5 H c& u( W( k0 K
$ r0 D/ W9 S, M- if (power > 0)
. Y+ [! @$ U, D' n9 q& L# J - Speed(MotoSpeed, MotoSpeed - power); //馬達動作,正數正轉 負數反轉。* d0 r+ t7 I/ @. P6 U! a
- else" X% S+ i8 \, D2 `
- Speed(MotoSpeed + power, MotoSpeed);$ R3 z0 x* @8 X( I* |+ x1 B
- }6 B9 \3 r* S3 f7 X7 p
- }
複製代碼 - t. J h* A: o u2 k' @9 A" r
+ E+ `, [% n8 B) x& s
|
|