|
|
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯 m8 S( q6 o9 ~* E% P: i
# F* X5 e2 z6 A" W- I4 _3 R( F您好,不知是否能向您請教。
' }1 E. ?- `9 |9 M) _目前和宋修賢老師在處理Ardui Car6 J' s2 E; |% s# |5 V E' q; y
雖然已使用較繁雜的方式處理了跑出黑線外的狀況) S0 t C8 q3 u
& R- Z. ?( `6 N( ~! S) Q# V0 n! a但基於想追求更精簡的程式所以還是想請問一下
' d: q% X$ U& _! d& e( u就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝7 e3 [. `; \) k |
不知道您是否願意教我可以如何處理
5 ?+ _8 |( [' ^6 U% w7 `4 y3 w$ V; k: U% Q; _2 U' H
8 d' L4 \' \/ J. j+ t
以下是我挑出我一般寫純PID控制的Code:- int MotoSpeed = 250;$ @* X' t! P, X$ [4 ?$ y* n" Z7 H
- double CNY70Val = 1000;7 ]0 r- r+ E" L9 p
- int interror = 0;
/ Q$ M# Q* w+ E& L! `3 n, u) v - int olderror = 0;4 X+ t! B8 Z& r% [! g$ j! P
- double values;$ h% R2 L& J! q6 [( {' r3 B
5 I, h, S8 Z0 c1 h1 e# A- % T, e: H( h# g( V% m! T& t
- void CNY70()* D4 \) `) N; ? S+ }
- {
, k' K/ u# {- V1 w+ F" f$ t - valuesRR = analogRead(RR)! w, C! G1 A% J* a" j3 G
- valuesMR = analogRead(MR);
/ z" }! S' d$ `# M - valuesMM = analogRead(MM);
% \6 U; W7 X+ r) U& _4 M - valuesML = analogRead(ML);
- x9 K' O, K7 `6 B4 G; w/ m - valuesLL = analogRead(LL);
9 m# F- l6 |" t. R3 v - 0 E# e Z# {. F, A* u, N, r: g
- if (valuesRR > CNY70Val)
1 h9 O- W, D( p3 H7 ?3 D$ W - valuesRR = CNY70Val;8 J, r% R# x; l. A+ {
- if (valuesMR > CNY70Val)
% M8 E! c$ s1 m8 t( ?5 @; w - valuesMR = CNY70Val;# l8 e0 ?, q! Y8 ?% P* I
- if (valuesMM > CNY70Val) R+ u: d8 Q3 u4 `& k' e
- valuesMM = CNY70Val;( F6 G: B4 ~# U/ h8 p
- if (valuesML > CNY70Val)
& A" ]+ s& U" M5 y+ e - valuesML = CNY70Val;. i2 t( w- Z7 {1 l0 g! A, `/ a
- if (valuesLL > CNY70Val)
# `; t* j# U; l, Y - valuesLL = CNY70Val;
4 G5 ^ h- h9 `* S- M. S - : g5 \/ k* l3 `! r
- values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;% u" [. d3 [. U6 F! u+ }
- }! `& n6 B& @! J J
& z' t; B. D; _9 `, f f7 u: @' K- void Car()' {' Z6 }. m$ ~
- {
; v4 ], ~) I0 p- D% _8 @8 H% D - while (1) {3 W4 N7 b. b2 Y/ e" Y# ~/ t/ Q0 U1 f
- CNY70();
8 G' ?' N( b4 a9 `$ M
. k% Z( n! j( v, f- int error = ((int)values);
" H: L. s# k. `5 ~8 m' m - interror += error;
/ j; E; p! v) ?8 B& d b# A - int lasterror = error - olderror;" i0 v% n6 E$ h# O7 b) Y d& s
- olderror = error;
/ W( c+ U4 }' b! c5 W4 @- T# c - int power = error / 5 + interror / 10000 + lasterror;0 V9 t$ X0 c! X' X; \$ o4 J
; M! v3 h: \* T' u8 \ c/ K) S- if (power > MotoSpeed)
7 U) r4 o3 F' O$ c/ m - power = MotoSpeed;" t* Z' v! J! X: r1 o) X0 v, Q( W
- if (power < -MotoSpeed), i6 t3 R% P! }0 \2 r! z
- power = -MotoSpeed;& w, m, o6 F8 M; ?" ?
- / p7 u! o( B. N7 X# l2 F; m
- if (power > 0): m# g5 I4 E1 P( N0 K
- Speed(MotoSpeed, MotoSpeed - power); //馬達動作,正數正轉 負數反轉。
3 o; H* c% t5 ?; V - else
) t- R# ]0 D4 \! l0 f - Speed(MotoSpeed + power, MotoSpeed);) U6 W: D; m' d: C4 X2 }) P4 f, f/ w$ M
- }
8 Z! z, t( {% l# [7 i - }
複製代碼
i; V; |) s- @# C2 d) C# Q% U- T: S3 r, V Y
|
|