stm32利用oled显示屏与按键进行PID参数调节实现人机交互
8 L' l& C8 g' q, _
, U3 Z7 ]0 z$ V5 R/ u; m( ]上一个学期在学校做四轮车利用PID实现直线走,在调试过程中,我之前是每改一个参数就下载程序进控制板进行调试,观察车是否偏移来确定pid参数,但是后来我发现这样的效率很慢,经别人提醒后,我自己做了一个小小的人机交互界面,来显示pid的参数以及对pid参数进行调整。
( j N3 N! x3 d* R3 }以下是显示效果:
# m# q, [' Q* w2 Q9 c
7 K" _, | ~- ?4 V& a2 y. p O0 z
% d P T+ u Q @5 {% E* y W
' f: \- [# l5 r2 Z6 z; Q1 U" _6 }& }& X- I @8 v: g
接着我在附上主要代码: S8 m' ?) x4 u) n" a4 {. C7 H
- // 功能描述 : OLED 7针SPI接口演示例程(STM32F103系列)- j3 b' \( I* L! a
- // 说明:
; o/ G* I0 K9 \ A, f4 U. }" O8 l - // ----------------------------------------------------------------( [& N B- ?7 D+ q0 g% w' q! X3 b
- // GND 电源地
# f7 z, r; M" k/ z/ Y6 h- k ?; Q - // VCC 3.3v电源
' ~$ \- a1 J6 D, n' l - // D0 PA5(SCL)
4 N( D3 r3 Y4 E! m1 T/ o4 ] - // D1 PA7(SDA)8 t2 M: O6 n. E. M# d! }; t- L! M
- // RES PB0
* ?' G( b8 r6 `" m: i+ K% q8 J- G - // DC PB1+ O7 U, u8 w& w9 ~4 E. I( ^
- // CS PA4 # Z% Y8 [% P, M q- B
- % |% V. N* t( H6 @* s' A
- #include "delay.h"
' N4 {( x) }* [ - #include "sys.h"- Z( K" r& g* X$ n" G% Q4 q/ H/ w
- #include "oled.h") A; Q" h3 a1 v5 e. S
- #include "key.h": ]5 r. H& ?4 t. s4 z) |
9 a% z! Z9 |# g1 y5 U/ s; z- int main(void)5 U q" q* t% j: o3 z+ G: M9 j
- {
- Q. q' D, u8 g* p U0 k( j2 p+ Q. i -
& `( O. s8 @" i# N3 G - u8 t[]={10,10,10}; //因为取整数在显示屏上面显示比较好处理,所以这里把要显示的数字都改成整数: c. U8 T: Y$ q6 z
- //至于在PID调参数的时候,你可以把这里的t[0]、t[1]、t[2]当成是P、I、D的参数; Q6 D& \1 `0 D$ l" m( [3 s9 l' k
- //把t[0]、t[1]、t[2]除以10就可以变成小数了,u8是0-255的范围
. r1 F; h- p. O - delay_init();
3 m/ }* {0 m/ F4 J4 D - OLED_Init();9 ^. t/ u/ U% n& Z2 u" f, q2 f
- KEY_Init(); //初始化按键
# Z4 O+ e2 L9 d$ Q -
9 [; k# s Z! j+ q+ s' }5 Y - OLED_ColorTurn(0); //0正常显示,1 反色显示
3 L4 Y! B Q+ m8 C0 h, c - OLED_DisplayTurn(0);//0正常显示 1 屏幕翻转显示
6 j6 J0 f# P H0 S% k/ d - OLED_Refresh();6 X) Q: D8 K( j4 r
- while(1)( L( N! ^5 Z: \- w- M0 S3 r
- {6 a# F% q* \" L
- //由于带回来的器材有限,我这里只做了一个参数的调节,其他参数也是一样的道理
2 ` I8 G: s F# l9 n, s - if(KEY0==1)* c" [8 z% x6 H. |: G7 v
- t[0]++;
, H. e6 {# J9 q$ V6 }; v4 R - if(KEY1==1)
+ _5 g; c/ D* V8 w O0 Q [ u - t[0]--;; ]# N/ W3 u- @2 [& m
-
% S2 V2 _ ^+ ]' u" c+ G0 f6 ~' B - OLED_ShowString(0,0,"P:",16);: D) y( C3 P9 ^9 V
- OLED_ShowNum(16,0,t[0],3,16);
# i* ~: _2 G* h0 i! W; W) r- L7 V7 i8 u - OLED_ShowChar(32,0,46,16);//显示ASCII字符,一个ASCII为46的小数点
5 O) y5 ]# u" y; f( Z% q: \ - 9 T& t S5 I. e# x
- OLED_ShowString(0,16,"I:",16);# J- L8 T! }: k& X3 s
- OLED_ShowNum(16,16,t[1],3,16);
, Y; X ]1 i/ Z0 {; @& f2 Z# W - OLED_ShowChar(32,16,46,16);//显示ASCII字符,一个ASCII为46的小数点 * f. A0 W# E; F. |. T* U6 x7 O
-
% Q. z o) w# z* ?9 Z1 H9 s - OLED_ShowString(0,32,"D:",16);
. s" N5 c, ]5 G9 z z0 \6 ], t - OLED_ShowNum(16,32,t[2],3,16);# S4 A, W1 H9 \* z0 o1 C1 b1 w
- OLED_ShowChar(32,32,46,16);//显示ASCII字符,一个ASCII为46的小数点 + U& ^1 u9 e. n' @& _; y( m
- ( n9 t% r$ ]- A( [+ b+ o
- OLED_Refresh();
0 [: c8 D1 [0 Q' k; O: H - delay_ms(200); * |% t+ d- s. x2 o4 D
- }( o/ A7 A. x. c7 q
- }
复制代码 上面只是简单的进行三个参数的调节,方法是通过按键控制参数的增加还是减少,由于我带回家的器件不是很足,程序中只做了一个参数的调节,就是通过两个按键控制参数的增减,实现对PID参数的调节并显示在屏幕上。
4 S' u2 p$ I) X# [关于oled显示屏的各种程序,可以看我之前发的文章,里面有好几种oled显示屏。! O5 c0 N7 F. F, u, h C( u+ Z4 i. f, n
————————————————
6 e' O+ P+ X7 k2 c版权声明:i土豆& V. w, m; d$ `+ d |/ B$ l
% B9 j D0 Q4 s( `
+ ?8 C/ v2 r- Q# \* x8 ~. L) o% O0 k |