你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

基于电机库的管道清洗控制器模拟设计

[复制链接]
jinglixixi 发布时间:2017-8-31 10:13
本帖最后由 jinglixixi 于 2017-8-31 10:15 编辑 2 ?9 Z. d4 C0 _* c$ X5 b3 ?1 t

4 E% X6 m, {' w8 {, K) U- s
    对于管道型的生产设备,为了保证其可靠的运行需要定时地进行清洗,其工作方式与我们常见的洗衣机十分相像,主要有2种工作参数,即运行时长和清洗模式。而清洗模式又关系到电机运行的速度、转动方向和工作节拍,其中的工作节拍是指转动时间与停止时间的占空比。利用本次活动的STM32 FOC开发套件,十分便于做这方面的模拟设计。
      在设计的开始本打算是设计一个基于MCU内部RTC进行多时段控制的管道清洗控制器,且利用STM32F3-Discovery的程序实现了RTC计时功能,如图1和图2所示,但移植到该电机套件的环境下却不能正常执行。无奈只能放弃该功能。
图片1.png
1 用F302实现LCD5110屏显示
4 {# }, c, b5 ^" g
图片2.png
2 F302实现RTC计时

4 \/ {: L) u. u/ ?) ]8 f! S
    随后以LCD5110液晶屏、软按键及电机套件构建了一个简单测试环境,如图3所示。在未启动电机的情况下,能进行模拟运行,即开机后可通过按键来设置电机运行的模式,为简化设计电机工作节拍内的运行时间t1和停止时间t2是由程序固定设置好的,工作时长n,也由程序来指定,其界面如图4所示。为便于验证,最后一行为运行状态指示行以供对比。
图片3.png
3 验证环境构成

, X( H6 g5 q( K/ l- ^
图片4.png
4 设置运行模式
, d$ w6 |/ o" B3 E" U6 V
图片5.png
5 模拟验证界面
' {1 l. i  c% W3 i) ^8 X
其中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
1 d" U/ H' {  v* K+ W" `

7 Q" O, @% E  v# N( Q0 U
    故对LCD5110相关引脚所定义的输出高、低电平的语句如下:
#define SetLCD_SCE_Low()          HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_RESET)

# J. i* j+ |7 l3 }" H) ?; A0 t" q
#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)
0 W8 X' W- a- o- k6 S
#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)
* z  h" a- d; D0 h
#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)

3 \' F. O) B9 ]) o+ d0 h+ w# ]# w
#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)
1 F, O  ]" I8 w2 q
      LCD5110屏的初始化函数如下:
  1. void LCD_Init(void)
    1 p' I8 Z) [$ U9 c, Z
  2. {/ ~: ]' A( N3 @4 c2 s/ Q. \% P
  3.         SetLCD_RST_Low();    8 q9 Y; b8 z9 R1 o
  4.         delay_1us();
    0 ~& |' Q8 W4 f& c& h# V, a0 r
  5.         SetLCD_RST_High();   
    4 g' J* X7 P, z3 m  Q; Q, M
  6.         delay_1us();
    # |. y4 D# E/ w1 r8 C% [$ |9 Y
  7.         delay_1us();
    5 P' l) _* h5 i0 \1 M; ~' G
  8.         LCD_write_CMD(0x21);
    : M0 i0 H# x) B& `1 k0 I
  9.         LCD_write_CMD(0xc0);0 p4 s' [9 Z- c
  10.         LCD_write_CMD(0x06);8 G+ h# f8 R1 C1 j
  11.         LCD_write_CMD(0x13);
    6 Y6 e, l) }& [' g8 U# l/ Q
  12.         LCD_write_CMD(0x20);
    6 ]# O7 i2 U- t2 f
  13.         LCD_Clear();           
    * I( L% Q8 }* }1 Y/ t2 ]5 j
  14.         LCD_write_CMD(0x0c);        ) T, u6 z  d6 W4 {6 V! [3 f- G. V
  15. }
复制代码
       实现设计功能的主程序如下:
  1. int main(void)" E* u. T' z/ P' H" s! S
  2. {5 V, |5 G/ [* ~1 A2 O6 L
  3. uint n,i,j,k,m,v;
    * _, O- @" t- c0 \9 Y
  4.     HAL_Init();, _1 p! X& ~! o- }& c3 s; {
  5.     SystemClock_Config();
    6 q2 j2 N5 f  {8 Q, a6 j- x
  6. MX_GPIO_Init();
    5 {. F8 D4 Q& r5 E( d
  7.     MX_ADC1_Init();
    - T9 k( O3 j  d/ k3 O# {
  8.     MX_DAC_Init();- }, n$ u) N  F- p3 X& A
  9.     GPIO_Configuration();        7 w7 h. G" ?% k
  10.     LCD_Init();
    * e* ^$ @% |9 k1 H, Y) k9 s7 U; U7 B
  11. LCD_Clear();- z: ?% H& b! s0 V4 u& u  ~
  12. LCD_write_english_string(0,0,"NUCLEO-F302R8");
    + L0 G/ s8 v/ L; x3 S
  13. LCD_write_english_string(0,2,"NUCLEO-IHM07M1");
    0 o% r2 I( n1 ^5 U( {3 m
  14. LCD_write_english_string(0,4,"X-CUBE-SPN7");5 U" z- X; g  t) f1 C& g
  15.     HAL_Delay(1000);
    ; W. j( r; X. g% ?- s: N& \
  16. MX_TIM1_Init();
    2 y" ]; D0 d/ w! e& g/ U
  17.     MX_TIM6_Init();
    : y# R# G1 H, a& C( a5 Q' j. e1 |
  18.     MX_TIM16_Init();
    & S* j% E. w4 F; ]
  19. MC_SixStep_INIT();, s: s* ^  r. x" i" ]
  20. loop:        
    ) G6 r" ?& G5 n6 [: z" u% V5 E% X
  21.     LCD_Clear();0 _8 F( P7 M3 U0 L
  22.         LCD_write_english_string(10,0,"M");  //   工作模式# r9 o3 ^( T( l9 E+ x  D2 y2 G* S& X
  23.         LCD_write_english_string(30,0,"t1");  //   启动时间2 W+ N. s/ x" h6 ?; b" P# A
  24.         LCD_write_english_string(50,0,"t2");  //   暂停时间
    ' _6 E: r1 W; N5 a4 w; d
  25.         LCD_write_english_string(70,0,"n");   //   运行时长
    2 {# Q, Z+ g% \' s, W
  26.         n=0;
    . m9 `+ J8 \  ^1 c
  27.         i=1;
    * a0 w5 q: F" x
  28.         v=3;
    % J1 x; ^0 B5 a
  29.         while(i)
    / w$ C1 k8 i: H
  30.         {   //   选取工作模式: h; L/ S) l7 I( N6 X5 a5 T
  31.                 if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_14)==0)  n=1;
    $ P; v0 u' d( z( ^
  32.                 if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_15)==0)  n=2;# W0 K. _' S" @4 a& a. r' @
  33.                 if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_13)==0)  n=4;
    9 e; ?# b+ W5 W1 T$ D) [9 p( ?: j8 ^
  34.                 LCD_set_XY(10,2);3 n- x8 f( l( f- e  O/ l1 S
  35.                 LCD_write_char(n+0x30);  `& T  U; V; |: k
  36.                 if(n>0) i=0;; B0 t( |$ s4 ~, f
  37.                 if(n==1)% r* x  @" \: L; y; @& [/ f
  38.                 {   //  设置模式参数
    5 b4 @2 R" A( |9 {
  39.         j=3;) y* g* ]. g' U7 b9 W3 }
  40.                         k=2;. _- r" v1 l/ C$ z# v9 k; k
  41.                         MC_Set_Speed(4000);  //   指定转速
    $ a/ T4 e5 o- U: O+ D. E% i) j
  42.             LCD_set_XY(30,2);' N  B3 p1 f! j& k
  43.                         LCD_write_char(j+0x30);
    - ?3 f& _- A) S
  44.                         LCD_set_XY(50,2);
    6 u- A0 d. f  `! U) N! ~8 S
  45.                     LCD_write_char(k+0x30);: ^1 ^, N  n; X9 D
  46.                 }/ d0 `  L9 X1 R7 y$ N+ Q
  47.                 2 N7 P! M, {+ H3 J! c6 c( d
  48.                 if(n==2)
    / f. S/ e/ f) U- g5 s, h# J" A
  49.                 {' c+ d0 K( ^2 _* w
  50.                     j=2;4 ~; D% s* Q! u
  51.                         k=3;/ x% T! i, E  A8 a) x) x8 S
  52.                         MC_Set_Speed(6000);
    - N% I9 U/ f0 Z0 F% F* o
  53.                         LCD_set_XY(30,2);) a" V7 g: s) J7 z# g+ ^0 Z: n% N
  54.                     LCD_write_char(j+0x30);
    - y, j% y# s7 o) c7 I( T) W9 I
  55.                         LCD_set_XY(50,2);# v  F% W5 W5 l. `" U
  56.                     LCD_write_char(k+0x30);# e- _# h* x' V& m. C& f- H) o
  57.                 }
    - j- b. C/ `6 l6 K( M0 \5 z' W
  58.                 if(n==4)9 _- X4 h3 u8 c1 C$ {
  59.                 {' v- j# p  A" V6 Z
  60.                     j=3;9 W, t4 a, T% d
  61.                         k=3;) C- f8 z/ F  x( W
  62.             MC_Set_Speed(10000);2 r% X- w/ q0 w' O! k- j
  63.                         LCD_set_XY(30,2);/ w3 q, A( K* Z& A' i8 g+ S. H
  64.                         LCD_write_char(j+0x30);
    + E4 S3 {. _: [3 U' ^$ s; A* }
  65.                         LCD_set_XY(50,2);+ ]5 ]$ V/ G* R, k! W) C
  66.                     LCD_write_char(k+0x30);
    2 l  A% R  V. N% P$ T( C8 t
  67.                 }
    9 G: q- U4 `, Q+ b0 h6 N
  68.         }! R! @/ n; j5 x4 }
  69.                 LCD_set_XY(70,2);4 U* v+ s3 s- `- |! E
  70.                 LCD_write_char(v+0x31);
    % N) H9 P$ H& i8 G, r. D+ H
  71.                 LCD_set_XY(70,2);/ y6 u" j; |1 k* h
  72.             LCD_write_char(3+0x30);
    ( V: N$ b# A+ h" g' @6 e
  73.                 for(m=0;m<v;m++)      // 运行时长控制
    9 M) Z. k, I' l" {
  74.         {
    + n/ j! l# @  i! H4 u1 U
  75.                MC_StartMotor();    //  启动电机        
    + p9 X* Q. L5 B9 v  Y9 R. B) I
  76.                for(i=0;i<j;i++)1 O! `, `% ?/ \% J4 y) ^
  77.                {+ s( n1 r) a: G
  78.                       LCD_set_XY(30,4);
    " W% r/ h0 Z+ [8 s
  79.                         LCD_write_char(i+0x31);7 x7 R/ b+ P! v  P5 ^6 `% [$ j$ a; i
  80.                         HAL_Delay(1000); // 时间基准
    $ }0 a+ O; m9 d3 o0 ?7 ?
  81.                }2 ^6 D+ i6 K( O5 V
  82. MC_StopMotor();     //  电机暂停
    ' O; _1 u5 X& B7 l# i, L
  83.                for(i=0;i<k;i++)" {. A3 E, K+ }8 ~5 N  d& s/ B8 u
  84.                {
    - c5 S$ N5 E+ |3 p9 `% a
  85.                       LCD_set_XY(50,4);
    . d" l7 V6 i. w. a% c# ~
  86.                         LCD_write_char(i+0x31);
    ) T8 O6 `: @4 r  F
  87.                 HAL_Delay(1000);, a/ o& i% X9 K4 o
  88.                }& Q) L3 g1 x" k" J0 U* ?9 T
  89.                    LCD_set_XY(70,4);0 _" p* T* Q6 P0 |$ g
  90.                    LCD_write_char(m+0x31);) \% c  Z9 @1 \1 {" w3 x0 K7 l9 F
  91.     }   & X+ \% X2 D. S2 J& M  Q$ z
  92.         goto loop;
复制代码
小结:
经实际测试,可达到对应的控制要求。但其最大的缺陷是由于电机的工作电流较大且带有一定的电磁干扰,从而导致在电机运行时会破坏LCD5110屏的正常显示,而在电机启动前的工作模式选择是不受影响的,故不适于在连续操作的场合使用。

5 f, U8 \2 _* _9 H. l. n. N" Y. P  ~

评分

参与人数 1 ST金币 +20 收起 理由
zero99 + 20

查看全部评分

收藏 1 评论4 发布时间:2017-8-31 10:13

举报

4个回答
五哥1 回答时间:2017-8-31 10:29:16
谢谢分享
zero99 回答时间:2017-8-31 11:04:44
学习了
Stm32McuLover 回答时间:2017-8-31 12:49:29
/ B  P1 _( |/ j6 |: K  b% i
学习了
jinglixixi 回答时间:2017-8-31 20:10:28
多谢支持!!!, Y, R, O+ I: \) J5 |- k; C

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版