本帖最后由 jinglixixi 于 2017-8-31 10:15 编辑
9 k- J; o1 x) g! v$ D7 ^! h) w& H; B$ ~/ @ x
对于管道型的生产设备,为了保证其可靠的运行需要定时地进行清洗,其工作方式与我们常见的洗衣机十分相像,主要有2种工作参数,即运行时长和清洗模式。而清洗模式又关系到电机运行的速度、转动方向和工作节拍,其中的工作节拍是指转动时间与停止时间的占空比。利用本次活动的STM32 FOC开发套件,十分便于做这方面的模拟设计。 在设计的开始本打算是设计一个基于MCU内部RTC进行多时段控制的管道清洗控制器,且利用STM32F3-Discovery的程序实现了RTC计时功能,如图1和图2所示,但移植到该电机套件的环境下却不能正常执行。无奈只能放弃该功能。 图1 用F302实现LCD5110屏显示 v' s9 W& f Q3 c8 O. t! E! ?2 |
图2 用F302实现RTC计时 ; q8 S% _3 D( I8 |& S9 ?
随后以LCD5110液晶屏、软按键及电机套件构建了一个简单测试环境,如图3所示。在未启动电机的情况下,能进行模拟运行,即开机后可通过按键来设置电机运行的模式,为简化设计电机工作节拍内的运行时间t1和停止时间t2是由程序固定设置好的,工作时长n,也由程序来指定,其界面如图4所示。为便于验证,最后一行为运行状态指示行以供对比。 图3 验证环境构成 5 f! [2 v+ G& a
图4 设置运行模式 @3 b% {! f( z3 R6 H! Z+ N
图5 模拟验证界面 & l# Z, B8 I; P R& M. I. i
其中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 ' |4 w i+ `: ?3 f I
_. H- N+ Y( h$ s' I: Q) Y* ]0 i9 ^ 故对LCD5110相关引脚所定义的输出高、低电平的语句如下: #define SetLCD_SCE_Low() HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_RESET)
% z1 z; b( z1 `0 T2 A5 T5 d#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) ( z8 N9 z/ N7 u7 i, i: m5 {: {: T
#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)
, k1 @/ n1 {1 w. L' N#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) ! A, k. L; C% f& d) J& j# ]4 Y' P
#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)
+ `5 R+ {" m) Y. M }( B LCD5110屏的初始化函数如下: - void LCD_Init(void)
" e4 p$ p% D; b3 Q5 l& |+ F; @ - {) y' c# d( b( ?' Z* e# ^0 A
- SetLCD_RST_Low(); ) o2 `! G6 D9 l* E. B9 i
- delay_1us();3 x& S( w/ _2 [9 R' R
- SetLCD_RST_High();
" {3 b& j4 ?6 ]% f, ~ - delay_1us();
J7 S8 o z3 p" K - delay_1us();7 y- n$ ?7 y% }4 h% Y9 F
- LCD_write_CMD(0x21);7 O/ y5 I0 u7 w5 }2 {7 R6 w
- LCD_write_CMD(0xc0);
4 D" ] J$ E# v' g/ B1 N | - LCD_write_CMD(0x06);
4 G `) ]. F5 d$ x c7 v - LCD_write_CMD(0x13);. i( a* v; C( ]: Y5 d# `7 a
- LCD_write_CMD(0x20);- S. x- n) V$ M k6 M( ~/ N
- LCD_Clear();
6 V: n" n% o9 ^: l - LCD_write_CMD(0x0c); " f# M/ L v$ u- K4 k7 t
- }
复制代码 实现设计功能的主程序如下: - int main(void)
' Y' n7 p! {4 e& b; F7 G3 R - {8 s. y* D# E4 |" I
- uint n,i,j,k,m,v;& I$ N! t9 `8 M: R& c ^' P
- HAL_Init();. O& X6 i" e- b# r6 o s# A
- SystemClock_Config();
7 j: G* ?" F* E$ G - MX_GPIO_Init();
6 e0 V# [$ s' B0 H5 D4 p* d - MX_ADC1_Init();
: r, ]8 \$ x( ~8 l- K5 [4 p - MX_DAC_Init();( w- Y# E: t. |( D' [
- GPIO_Configuration();
& x+ L& ^0 y1 D- f7 b. t - LCD_Init();& L; J5 O. S" B: ^; K
- LCD_Clear();7 J9 f5 U& k. }- I* l z+ S
- LCD_write_english_string(0,0,"NUCLEO-F302R8");
' Q4 b. j# d& L" z/ F% t: y2 A - LCD_write_english_string(0,2,"NUCLEO-IHM07M1");
5 P& N' `: `- v" u$ m, x) V6 o - LCD_write_english_string(0,4,"X-CUBE-SPN7");
' [! c3 Y: p6 C* v- L4 N - HAL_Delay(1000);: }4 h3 d% Y+ M- a x! \. W
- MX_TIM1_Init();7 x7 w1 t) `5 h6 y
- MX_TIM6_Init();
; F3 @- w. I- p! }: Z1 G+ Y# O - MX_TIM16_Init();
# e6 h1 s& r8 y6 t( Q" L- _6 Q9 N - MC_SixStep_INIT();
, X1 t2 r* h4 i$ L) }9 K X - loop:
% |. c; s2 _2 o9 K3 I - LCD_Clear();. b7 A" Q' j$ ]
- LCD_write_english_string(10,0,"M"); // 工作模式- O# }- T" z4 _4 }) w$ e2 z
- LCD_write_english_string(30,0,"t1"); // 启动时间. y5 {3 @4 w5 I; Y, s8 v
- LCD_write_english_string(50,0,"t2"); // 暂停时间
1 s ]7 A) e( n - LCD_write_english_string(70,0,"n"); // 运行时长2 k6 ~! ]% }# _) `
- n=0;+ X9 @: D1 O* ?% O: l6 r
- i=1;
$ v8 a7 b* l; u: q* ]& w) A - v=3;# e! e6 Y5 c, n& p0 W8 H
- while(i)% v( O" J& x' i- x. m$ P& `. K( o9 c
- { // 选取工作模式, K8 X( x4 M. D+ N: t
- if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_14)==0) n=1;! D# @' {& ~) f/ b+ q, M4 Q& Q
- if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_15)==0) n=2;7 U# p2 n+ V( }4 f0 R* I
- if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_13)==0) n=4;
' ]/ r9 @; l& p( f$ u3 z" [! X - LCD_set_XY(10,2);
4 a4 V* M4 l/ b3 d- e& V K - LCD_write_char(n+0x30);
. x Z3 m4 [- V' D" X - if(n>0) i=0;& z6 y$ g5 ? t5 p6 k
- if(n==1)
2 c, o5 J/ k3 O& k Y% I8 T - { // 设置模式参数. @( L. H- C; b8 u6 W! `
- j=3;) a+ W$ h1 k) L$ X9 \ N
- k=2;- C- T# z6 I) a* W
- MC_Set_Speed(4000); // 指定转速+ p% y. v' x9 j) \- J! p. j/ w
- LCD_set_XY(30,2);
7 K; d# U% |, \- Z. z - LCD_write_char(j+0x30);
( N. r8 _6 V% Z1 R* R& w - LCD_set_XY(50,2);
" B$ O$ ~( O+ ] - LCD_write_char(k+0x30);* W9 t i' C$ T& r1 _1 q
- }
- E; ~' _1 L9 ^" L - 7 \) M5 K$ `5 S0 ~) r
- if(n==2)
4 `1 W2 m( n# ^) \$ T! ^ - {4 K9 [3 d( I1 E" I6 E3 E
- j=2;
. m$ o9 s( c3 w9 K+ f - k=3;) w3 C! P' R4 q; c% n2 g# K
- MC_Set_Speed(6000);+ Y$ [0 E' ?$ k H
- LCD_set_XY(30,2);
6 e C2 u# l/ ]9 F6 W - LCD_write_char(j+0x30);% H& N. G* v, D! o6 W
- LCD_set_XY(50,2);
! o9 j) d2 F( H( [' x - LCD_write_char(k+0x30);% ]! q2 B& [2 U5 Q n4 n
- }
. ~' T# e* R2 M9 T - if(n==4)
( R ]) A. t5 O" c. Z1 h - {, ^( U# q) O* a. N
- j=3;
# s# n: D' Z" D. l( S - k=3;
" E. |* |4 S4 Z- ]4 E9 q - MC_Set_Speed(10000);
5 q2 S* `3 Z, N! d/ P, P - LCD_set_XY(30,2);# {# Z- [% ?$ B% ~8 I$ T# o
- LCD_write_char(j+0x30);
5 g3 S7 t5 j9 d) r - LCD_set_XY(50,2);
- ^+ \. y) j/ t9 x& Q - LCD_write_char(k+0x30);6 D: D% o! l) A! R
- }4 o4 T6 \, @$ Q# g: l
- }: ^" m4 E3 V( X7 v
- LCD_set_XY(70,2);
( O3 o$ [! B& ^7 I! R8 R, Z - LCD_write_char(v+0x31);
5 e7 G \# F$ X4 J - LCD_set_XY(70,2);
/ {! o! F4 V, }2 B+ R - LCD_write_char(3+0x30);3 f3 H" Q: @, s/ F9 o
- for(m=0;m<v;m++) // 运行时长控制
$ r: f1 H& T5 G( H3 Y - {$ v5 ^# b- g! S4 f; n: ?
- MC_StartMotor(); // 启动电机
/ z" U! D; ]" Z6 y+ l - for(i=0;i<j;i++)' |+ v, h6 Y' M
- {
/ K7 R+ x: I, \, M8 v: ] - LCD_set_XY(30,4);
8 }) ~$ t6 I. m' y8 F+ ? - LCD_write_char(i+0x31); `" J @+ E7 T# G' _6 H! N B$ Q
- HAL_Delay(1000); // 时间基准
' D) S6 B1 g, b& r$ [ - }
! z0 c1 ^% G$ V8 J* I: { - MC_StopMotor(); // 电机暂停! p7 z: _& l1 k& a% w9 O) F
- for(i=0;i<k;i++)" A0 r: H% { ?4 N
- {5 a, z' P/ f5 j% B
- LCD_set_XY(50,4);
3 h5 D- _! Y p" f: w - LCD_write_char(i+0x31);
! ?. q$ h% \4 K- y( _ - HAL_Delay(1000);; R/ E7 l- Y' g, q: {+ b9 Q+ B
- }$ [0 b$ A4 o' s, e
- LCD_set_XY(70,4);! L! p7 K6 O1 a
- LCD_write_char(m+0x31);3 R" f) d6 B( M
- } w/ | a' r: i
- goto loop;
复制代码小结: 经实际测试,可达到对应的控制要求。但其最大的缺陷是由于电机的工作电流较大且带有一定的电磁干扰,从而导致在电机运行时会破坏LCD5110屏的正常显示,而在电机启动前的工作模式选择是不受影响的,故不适于在连续操作的场合使用。 . ]5 I" t2 Q2 p# {1 q- A* \5 p A' t
|
学习了