本帖最后由 jinglixixi 于 2017-8-31 10:15 编辑 ( M. {+ }- p: ?( X
5 o: l2 m0 G/ Q0 D 对于管道型的生产设备,为了保证其可靠的运行需要定时地进行清洗,其工作方式与我们常见的洗衣机十分相像,主要有2种工作参数,即运行时长和清洗模式。而清洗模式又关系到电机运行的速度、转动方向和工作节拍,其中的工作节拍是指转动时间与停止时间的占空比。利用本次活动的STM32 FOC开发套件,十分便于做这方面的模拟设计。 在设计的开始本打算是设计一个基于MCU内部RTC进行多时段控制的管道清洗控制器,且利用STM32F3-Discovery的程序实现了RTC计时功能,如图1和图2所示,但移植到该电机套件的环境下却不能正常执行。无奈只能放弃该功能。 图1 用F302实现LCD5110屏显示
& v) \6 G2 m- N. |4 W
图2 用F302实现RTC计时 ! t8 } j9 T- l
随后以LCD5110液晶屏、软按键及电机套件构建了一个简单测试环境,如图3所示。在未启动电机的情况下,能进行模拟运行,即开机后可通过按键来设置电机运行的模式,为简化设计电机工作节拍内的运行时间t1和停止时间t2是由程序固定设置好的,工作时长n,也由程序来指定,其界面如图4所示。为便于验证,最后一行为运行状态指示行以供对比。 图3 验证环境构成
, \" X; u; g y2 c8 i
图4 设置运行模式
/ B$ f- ~1 ~) C0 `1 X
图5 模拟验证界面 " v5 C' e# Q" H! i d4 {4 N
其中LCD5110液晶屏与MCU的引脚连接关系如下: SCE --PB13 RST --PB14 DC --PB15 DIN --PB6 SCLK--PC7 LED+ --Vcc 软按键与与MCU的引脚连接关系如下: 1 -- PA14 2 -- PA15 3 -- NC 4 -- PA13 COM -- GND ) J0 `% a% p/ I0 _( p4 S8 h
+ [: N* F# S* {) S" J6 j
故对LCD5110相关引脚所定义的输出高、低电平的语句如下: #define SetLCD_SCE_Low() HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_RESET) 7 w# K# j4 u9 S$ r
#define SetLCD_RST_High() HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_SET) #define SetLCD_RST_Low() HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_RESET)
6 E, E1 h& U) {* N1 S: f#define SetLCD_DC_High() HAL_GPIO_WritePin(GPIOB, GPIO_PIN_15, GPIO_PIN_SET) #define SetLCD_DC_Low() HAL_GPIO_WritePin(GPIOB, GPIO_PIN_15, GPIO_PIN_RESET) : r3 z- K) H+ [. m: \/ b3 _
#define SetLCD_SDIN_High() HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_SET) #define SetLCD_SDIN_Low() HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_RESET)
% ~/ ?$ n7 x" t6 y/ ~7 Z#define SetLCD_SCLK_High() HAL_GPIO_WritePin(GPIOC, GPIO_PIN_7, GPIO_PIN_SET) #define SetLCD_SCLK_Low() HAL_GPIO_WritePin(GPIOC, GPIO_PIN_7, GPIO_PIN_RESET) ?* t0 j, D' b" j' \2 [
LCD5110屏的初始化函数如下: - void LCD_Init(void)4 ?; [' |- u6 Z# k. l
- {: g6 c* Z: {' @1 \ C- e: i
- SetLCD_RST_Low(); : m( }& O* N2 Y/ j! l' Z1 r
- delay_1us();8 v& ~9 D& W+ l. I: K
- SetLCD_RST_High();
) M- {6 n! L& V1 [( u; g! p8 M% _ - delay_1us();( F7 H8 O" l2 }+ \7 D
- delay_1us();
7 A* f: i; ~+ K! }3 @; D- \ - LCD_write_CMD(0x21);
# A* H& I$ @, H$ e, D - LCD_write_CMD(0xc0);
& F/ k4 k. G6 g8 s. S - LCD_write_CMD(0x06);" J, Z& ?* I# L- r2 h. r: M8 f
- LCD_write_CMD(0x13);% j: _2 y7 \" ?/ I0 b9 t" ^
- LCD_write_CMD(0x20);& F+ P, f( @' Y: l! N: v
- LCD_Clear(); 5 U9 [% P# R5 @+ M6 o! Y
- LCD_write_CMD(0x0c); % W) ?7 v' Q/ ]- M6 _
- }
复制代码 实现设计功能的主程序如下: - int main(void)
; t' @. F9 b2 E/ a R - {, U. _! Z7 T B& S( K% X, K
- uint n,i,j,k,m,v;
9 l: c; p! N( T - HAL_Init();
! k: X5 R9 K' G4 l% V+ q - SystemClock_Config();
7 t/ J4 s% F$ l: y, P - MX_GPIO_Init();
/ O- ]) C9 H" P1 j) Y - MX_ADC1_Init();
J$ d# o1 Y& l% Y7 D# [5 n - MX_DAC_Init();& R: `' E+ N* q" e' J1 p4 D6 W
- GPIO_Configuration(); / V1 O: B# P& a( p; _) H" z
- LCD_Init();/ J% I& c& B. R5 B, x q' e# o8 s
- LCD_Clear();
8 r- @$ `9 c8 I - LCD_write_english_string(0,0,"NUCLEO-F302R8");$ |( t" \: G5 F( X. y7 X
- LCD_write_english_string(0,2,"NUCLEO-IHM07M1");
( u( _ e7 Z3 ^' w - LCD_write_english_string(0,4,"X-CUBE-SPN7");
6 j4 x+ W, X8 Y& F; _1 s1 T( A4 O - HAL_Delay(1000);- M* |; |/ _& T
- MX_TIM1_Init();
# S$ Y" O8 B4 `9 Z! V) f8 w0 e! s- X - MX_TIM6_Init();
: `( j! ] s9 g6 M' B) O' c9 @4 K - MX_TIM16_Init();! `) N" ^& e, \& _0 M1 Y9 n
- MC_SixStep_INIT();
/ W' L0 U- Z2 I% c/ T: V& o; | - loop:
( E, S8 a- V, }/ ?, {% b - LCD_Clear();6 E4 ]2 Y( h) R4 s+ p6 i" z
- LCD_write_english_string(10,0,"M"); // 工作模式/ m* ]. Q- R1 w
- LCD_write_english_string(30,0,"t1"); // 启动时间
. _/ L* M, Q% }# }, t" _+ ^ - LCD_write_english_string(50,0,"t2"); // 暂停时间4 X7 [; c1 y0 S
- LCD_write_english_string(70,0,"n"); // 运行时长1 x7 _; b y! t" v
- n=0;# p" z9 l0 r( [$ H7 a' _' A
- i=1;
6 j. V9 }6 p, k - v=3;/ C; }, C& q- u
- while(i)" f, E' j C2 P( z9 r9 ]! n
- { // 选取工作模式! J$ {9 B4 w/ V* p! \" t
- if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_14)==0) n=1;
7 x8 |) f' j! m% X% _ - if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_15)==0) n=2;
+ N8 a. T+ q, y: l* Z. Z7 q - if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_13)==0) n=4;7 [; r- K' G4 `3 f+ S
- LCD_set_XY(10,2);
2 J X' W2 y* x% Z9 S5 W* @ - LCD_write_char(n+0x30);
# f) ~4 t$ g3 f1 _# m, w - if(n>0) i=0;
8 N- N. C0 K/ ^8 M. N7 j. s - if(n==1)
* z7 t/ K; F2 Z6 | - { // 设置模式参数
; I* L$ [; {' y6 X% z - j=3;5 f4 J |! v/ ^5 Q# d
- k=2;
' d$ Y& Y9 h# R# ?- m2 K. O3 Y - MC_Set_Speed(4000); // 指定转速# S1 _9 d+ H8 {. ?4 `
- LCD_set_XY(30,2);! J1 o) \% W0 q
- LCD_write_char(j+0x30);
# a* v7 m1 A/ W# \' w5 [ - LCD_set_XY(50,2);4 a/ q$ g" J6 B8 j" {
- LCD_write_char(k+0x30);
2 I" X% @* O% l' g$ O6 O - }
/ K! g7 Q! G) j: B -
" @5 o, Y7 L% A! Q; r2 Y' \ - if(n==2)
4 M9 i3 [. Q3 A' B5 o/ V - {
$ ]. p8 k! z# s! x9 F - j=2;1 }. |; E& ~/ o! }7 C- t2 C* d7 K R
- k=3;
: [0 q( v3 ]) Y+ p2 f1 q# W# Q - MC_Set_Speed(6000);
0 c( Q/ G' `! l8 g - LCD_set_XY(30,2);) C0 O' J- i1 g8 J
- LCD_write_char(j+0x30);* P' V- D5 b, G$ _& O
- LCD_set_XY(50,2);
: u P- \: s% w3 @/ J - LCD_write_char(k+0x30);: P* j) C4 u) l( T/ ^
- }- o0 c; m# x- V
- if(n==4)! E, a* U; B. } w* C2 x
- {
1 e2 v/ u$ J- w, _7 v - j=3;, t6 N" E+ @' T9 n- [$ ]/ k. j
- k=3;5 H3 L" Q+ B6 g! ` A
- MC_Set_Speed(10000);
7 ~/ \7 V+ J2 E. Z - LCD_set_XY(30,2);
& W# O% S7 R1 y' x/ j7 f - LCD_write_char(j+0x30);
. K* q% U/ t# f, o - LCD_set_XY(50,2);9 U7 X1 @/ X1 i$ I
- LCD_write_char(k+0x30);
# J" J' I, e0 Y% c Z - }
4 q* L' N) _( J* {3 i5 ]* i - } e5 p) d8 g! G b- u$ O3 R( ^
- LCD_set_XY(70,2);4 I5 g8 q- d$ ?5 X" V
- LCD_write_char(v+0x31);
+ ?/ n4 i% k# p' q6 [1 K - LCD_set_XY(70,2);
) f0 V2 Q% X$ ~2 P: h, u - LCD_write_char(3+0x30);
, y6 f% d; @5 g - for(m=0;m<v;m++) // 运行时长控制
/ _1 | K1 e/ D% H - {
" {7 V$ t* q! {, ^; {4 Y" D1 X - MC_StartMotor(); // 启动电机 # t" P. g% s. ^8 d
- for(i=0;i<j;i++)
7 J, t: ?9 r4 b3 { u9 E - {; S6 P: c7 f8 ~: a0 h5 R8 ~
- LCD_set_XY(30,4);
3 ]% ?* L3 |1 A* D e" s% V - LCD_write_char(i+0x31);* n3 O# F0 ^ A. v, W
- HAL_Delay(1000); // 时间基准
, k( G2 |2 _% x - }
% }) u6 _' ^, y - MC_StopMotor(); // 电机暂停3 i/ c5 |6 o# k$ G1 o2 w* X* P
- for(i=0;i<k;i++)
6 {2 p/ T4 d; \& W4 b3 k - {% h3 {" O& g7 q3 W$ H! s3 L
- LCD_set_XY(50,4);
# s8 m4 [& h! ` - LCD_write_char(i+0x31);8 P& L, o& e @4 k; ]" H& ^
- HAL_Delay(1000); G* [' X8 _$ X
- }8 ]+ _0 o% x" G' X
- LCD_set_XY(70,4);9 B- L# `- y0 L( _7 z0 ^+ o
- LCD_write_char(m+0x31);
; }5 |2 J4 t/ Q - }
' |! b8 ?& D& G0 | - goto loop;
复制代码小结: 经实际测试,可达到对应的控制要求。但其最大的缺陷是由于电机的工作电流较大且带有一定的电磁干扰,从而导致在电机运行时会破坏LCD5110屏的正常显示,而在电机启动前的工作模式选择是不受影响的,故不适于在连续操作的场合使用。 : Z( c* t8 v4 |. y2 V
|
学习了