|
|
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯
( T) t7 ~: C9 U& ` e/ h
& J, o \9 a# `" q% i' T9 y您好,不知是否能向您請教。! y- M; u4 d! f% p$ y b% _
目前和宋修賢老師在處理Ardui Car
% Z6 z7 {1 y5 k. W9 F% Q( H雖然已使用較繁雜的方式處理了跑出黑線外的狀況: Q0 o: S1 w/ A* W J: t% ~2 I1 \
5 |5 S4 B6 V+ ^) L d但基於想追求更精簡的程式所以還是想請問一下
; p& @; s+ v! b+ x3 F就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝
u) M6 P) ~( `3 d不知道您是否願意教我可以如何處理
! \ r; b% C- k9 r3 n
0 Y, I% T! B& H8 A; m# z- k) E3 r0 M# P$ Y
以下是我挑出我一般寫純PID控制的Code:- int MotoSpeed = 250;6 |; H- n9 _! A8 w+ T
- double CNY70Val = 1000;
% o x- v X+ g* I5 C) i - int interror = 0;
c8 i% D$ K/ U! k+ o - int olderror = 0;9 H: o8 f& |/ h: u; Y, e6 @
- double values;
: a6 V3 V) n+ B. H+ P8 c( R" \ - 3 w9 H% R" I9 @4 C; R% s, e
- . }6 P+ m6 q2 g1 W6 j" X7 R
- void CNY70()) w3 h, v, z- T, ?
- {
4 i2 D1 l5 y5 _# ?; T - valuesRR = analogRead(RR)
3 g# y* E2 P7 X3 v' K" F - valuesMR = analogRead(MR);( d* s) H& k& e) c, i4 G
- valuesMM = analogRead(MM);
9 M0 D. i2 t y& a' `* H0 X - valuesML = analogRead(ML);
6 S$ B& |2 b/ E4 A- `! M" y3 F - valuesLL = analogRead(LL);2 g* e4 b: J, [% x5 Z7 Z* R0 I% e
$ c1 w8 ?, S+ K! d; H! B: p m- if (valuesRR > CNY70Val)
/ v% H6 @- M. h+ Z2 | - valuesRR = CNY70Val;2 h# T/ @6 F( {) r; Q3 ?8 q5 ]
- if (valuesMR > CNY70Val)
6 m, d5 e, O* E - valuesMR = CNY70Val;, R; q, n$ \1 u+ H, W/ X
- if (valuesMM > CNY70Val)2 `3 G9 E9 Z. E& G* e+ f
- valuesMM = CNY70Val;
2 A3 _$ w0 W; x* s8 J$ o/ f0 B3 l - if (valuesML > CNY70Val)
. ~* n& p0 V' ]$ O0 y) D - valuesML = CNY70Val;' f6 ^* K$ g& {
- if (valuesLL > CNY70Val)
5 x4 J& ?; b4 i R0 n+ k @) X3 W - valuesLL = CNY70Val;; u6 l3 H" k% ^ L- b+ a
0 C3 p e+ s+ d* u9 T1 }4 ?5 ?- values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;" s" _) @( l* }( d( e8 U: H
- }
; T5 a5 M, Z3 P
: n$ X6 ?' ^/ }* r7 `1 i" @- void Car()
W( i" V* ]% ?! f) d - {6 c" `4 [" e3 {# v
- while (1) {) @- F; l" ]% [
- CNY70();. l C( Q- [1 t( F- s
. v# F p, m; w4 E, }- int error = ((int)values);5 _6 T9 ^- t5 f% j
- interror += error;
2 ^; P; N/ T) j6 n" p/ \ - int lasterror = error - olderror;
: M7 P: C/ E5 \0 A" S0 \ n5 g - olderror = error;
3 \% D" [# ]- e) {0 e) K6 U3 R - int power = error / 5 + interror / 10000 + lasterror;# H8 ~7 S% G) E/ I9 B; Z
- 1 q4 x: d, l x7 i8 {
- if (power > MotoSpeed)
( u! ^) X! S: t1 m$ e& u% Y4 U) `# d - power = MotoSpeed;8 J& ^, u6 k! J3 n( D
- if (power < -MotoSpeed)# E5 L6 a0 ]( ]# ?
- power = -MotoSpeed;
- h% z) I9 V. ~6 i% e9 }4 `: v' C
4 K0 @: d- j/ }' n% N/ G- if (power > 0)
2 F$ b% r( T1 e7 [7 z# l* k3 k' F' F - Speed(MotoSpeed, MotoSpeed - power); //馬達動作,正數正轉 負數反轉。
! q# e( K9 D% O/ r; v - else
; `; _3 R9 I5 y/ O. X9 D+ v0 j - Speed(MotoSpeed + power, MotoSpeed);5 _: u2 `, j, s$ a
- }9 b1 |$ L: ]1 B; \, e
- }
複製代碼 / T; ~0 y7 I% s* J6 D6 F( e
) l) N- [# Q! L; a5 }% W2 b
|
|