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

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

[复制链接]
jinglixixi 发布时间:2017-8-31 10:13
本帖最后由 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.png
1 用F302实现LCD5110屏显示

& v) \6 G2 m- N. |4 W
图片2.png
2 F302实现RTC计时
! t8 }  j9 T- l
    随后以LCD5110液晶屏、软按键及电机套件构建了一个简单测试环境,如图3所示。在未启动电机的情况下,能进行模拟运行,即开机后可通过按键来设置电机运行的模式,为简化设计电机工作节拍内的运行时间t1和停止时间t2是由程序固定设置好的,工作时长n,也由程序来指定,其界面如图4所示。为便于验证,最后一行为运行状态指示行以供对比。
图片3.png
3 验证环境构成

, \" X; u; g  y2 c8 i
图片4.png
4 设置运行模式

/ B$ f- ~1 ~) C0 `1 X
图片5.png
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屏的初始化函数如下:
  1. void LCD_Init(void)4 ?; [' |- u6 Z# k. l
  2. {: g6 c* Z: {' @1 \  C- e: i
  3.         SetLCD_RST_Low();    : m( }& O* N2 Y/ j! l' Z1 r
  4.         delay_1us();8 v& ~9 D& W+ l. I: K
  5.         SetLCD_RST_High();   
    ) M- {6 n! L& V1 [( u; g! p8 M% _
  6.         delay_1us();( F7 H8 O" l2 }+ \7 D
  7.         delay_1us();
    7 A* f: i; ~+ K! }3 @; D- \
  8.         LCD_write_CMD(0x21);
    # A* H& I$ @, H$ e, D
  9.         LCD_write_CMD(0xc0);
    & F/ k4 k. G6 g8 s. S
  10.         LCD_write_CMD(0x06);" J, Z& ?* I# L- r2 h. r: M8 f
  11.         LCD_write_CMD(0x13);% j: _2 y7 \" ?/ I0 b9 t" ^
  12.         LCD_write_CMD(0x20);& F+ P, f( @' Y: l! N: v
  13.         LCD_Clear();           5 U9 [% P# R5 @+ M6 o! Y
  14.         LCD_write_CMD(0x0c);        % W) ?7 v' Q/ ]- M6 _
  15. }
复制代码
       实现设计功能的主程序如下:
  1. int main(void)
    ; t' @. F9 b2 E/ a  R
  2. {, U. _! Z7 T  B& S( K% X, K
  3. uint n,i,j,k,m,v;
    9 l: c; p! N( T
  4.     HAL_Init();
    ! k: X5 R9 K' G4 l% V+ q
  5.     SystemClock_Config();
    7 t/ J4 s% F$ l: y, P
  6. MX_GPIO_Init();
    / O- ]) C9 H" P1 j) Y
  7.     MX_ADC1_Init();
      J$ d# o1 Y& l% Y7 D# [5 n
  8.     MX_DAC_Init();& R: `' E+ N* q" e' J1 p4 D6 W
  9.     GPIO_Configuration();        / V1 O: B# P& a( p; _) H" z
  10.     LCD_Init();/ J% I& c& B. R5 B, x  q' e# o8 s
  11. LCD_Clear();
    8 r- @$ `9 c8 I
  12. LCD_write_english_string(0,0,"NUCLEO-F302R8");$ |( t" \: G5 F( X. y7 X
  13. LCD_write_english_string(0,2,"NUCLEO-IHM07M1");
    ( u( _  e7 Z3 ^' w
  14. LCD_write_english_string(0,4,"X-CUBE-SPN7");
    6 j4 x+ W, X8 Y& F; _1 s1 T( A4 O
  15.     HAL_Delay(1000);- M* |; |/ _& T
  16. MX_TIM1_Init();
    # S$ Y" O8 B4 `9 Z! V) f8 w0 e! s- X
  17.     MX_TIM6_Init();
    : `( j! ]  s9 g6 M' B) O' c9 @4 K
  18.     MX_TIM16_Init();! `) N" ^& e, \& _0 M1 Y9 n
  19. MC_SixStep_INIT();
    / W' L0 U- Z2 I% c/ T: V& o; |
  20. loop:        
    ( E, S8 a- V, }/ ?, {% b
  21.     LCD_Clear();6 E4 ]2 Y( h) R4 s+ p6 i" z
  22.         LCD_write_english_string(10,0,"M");  //   工作模式/ m* ]. Q- R1 w
  23.         LCD_write_english_string(30,0,"t1");  //   启动时间
    . _/ L* M, Q% }# }, t" _+ ^
  24.         LCD_write_english_string(50,0,"t2");  //   暂停时间4 X7 [; c1 y0 S
  25.         LCD_write_english_string(70,0,"n");   //   运行时长1 x7 _; b  y! t" v
  26.         n=0;# p" z9 l0 r( [$ H7 a' _' A
  27.         i=1;
    6 j. V9 }6 p, k
  28.         v=3;/ C; }, C& q- u
  29.         while(i)" f, E' j  C2 P( z9 r9 ]! n
  30.         {   //   选取工作模式! J$ {9 B4 w/ V* p! \" t
  31.                 if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_14)==0)  n=1;
    7 x8 |) f' j! m% X% _
  32.                 if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_15)==0)  n=2;
    + N8 a. T+ q, y: l* Z. Z7 q
  33.                 if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_13)==0)  n=4;7 [; r- K' G4 `3 f+ S
  34.                 LCD_set_XY(10,2);
    2 J  X' W2 y* x% Z9 S5 W* @
  35.                 LCD_write_char(n+0x30);
    # f) ~4 t$ g3 f1 _# m, w
  36.                 if(n>0) i=0;
    8 N- N. C0 K/ ^8 M. N7 j. s
  37.                 if(n==1)
    * z7 t/ K; F2 Z6 |
  38.                 {   //  设置模式参数
    ; I* L$ [; {' y6 X% z
  39.         j=3;5 f4 J  |! v/ ^5 Q# d
  40.                         k=2;
    ' d$ Y& Y9 h# R# ?- m2 K. O3 Y
  41.                         MC_Set_Speed(4000);  //   指定转速# S1 _9 d+ H8 {. ?4 `
  42.             LCD_set_XY(30,2);! J1 o) \% W0 q
  43.                         LCD_write_char(j+0x30);
    # a* v7 m1 A/ W# \' w5 [
  44.                         LCD_set_XY(50,2);4 a/ q$ g" J6 B8 j" {
  45.                     LCD_write_char(k+0x30);
    2 I" X% @* O% l' g$ O6 O
  46.                 }
    / K! g7 Q! G) j: B
  47.                
    " @5 o, Y7 L% A! Q; r2 Y' \
  48.                 if(n==2)
    4 M9 i3 [. Q3 A' B5 o/ V
  49.                 {
    $ ]. p8 k! z# s! x9 F
  50.                     j=2;1 }. |; E& ~/ o! }7 C- t2 C* d7 K  R
  51.                         k=3;
    : [0 q( v3 ]) Y+ p2 f1 q# W# Q
  52.                         MC_Set_Speed(6000);
    0 c( Q/ G' `! l8 g
  53.                         LCD_set_XY(30,2);) C0 O' J- i1 g8 J
  54.                     LCD_write_char(j+0x30);* P' V- D5 b, G$ _& O
  55.                         LCD_set_XY(50,2);
    : u  P- \: s% w3 @/ J
  56.                     LCD_write_char(k+0x30);: P* j) C4 u) l( T/ ^
  57.                 }- o0 c; m# x- V
  58.                 if(n==4)! E, a* U; B. }  w* C2 x
  59.                 {
    1 e2 v/ u$ J- w, _7 v
  60.                     j=3;, t6 N" E+ @' T9 n- [$ ]/ k. j
  61.                         k=3;5 H3 L" Q+ B6 g! `  A
  62.             MC_Set_Speed(10000);
    7 ~/ \7 V+ J2 E. Z
  63.                         LCD_set_XY(30,2);
    & W# O% S7 R1 y' x/ j7 f
  64.                         LCD_write_char(j+0x30);
    . K* q% U/ t# f, o
  65.                         LCD_set_XY(50,2);9 U7 X1 @/ X1 i$ I
  66.                     LCD_write_char(k+0x30);
    # J" J' I, e0 Y% c  Z
  67.                 }
    4 q* L' N) _( J* {3 i5 ]* i
  68.         }  e5 p) d8 g! G  b- u$ O3 R( ^
  69.                 LCD_set_XY(70,2);4 I5 g8 q- d$ ?5 X" V
  70.                 LCD_write_char(v+0x31);
    + ?/ n4 i% k# p' q6 [1 K
  71.                 LCD_set_XY(70,2);
    ) f0 V2 Q% X$ ~2 P: h, u
  72.             LCD_write_char(3+0x30);
    , y6 f% d; @5 g
  73.                 for(m=0;m<v;m++)      // 运行时长控制
    / _1 |  K1 e/ D% H
  74.         {
    " {7 V$ t* q! {, ^; {4 Y" D1 X
  75.                MC_StartMotor();    //  启动电机        # t" P. g% s. ^8 d
  76.                for(i=0;i<j;i++)
    7 J, t: ?9 r4 b3 {  u9 E
  77.                {; S6 P: c7 f8 ~: a0 h5 R8 ~
  78.                       LCD_set_XY(30,4);
    3 ]% ?* L3 |1 A* D  e" s% V
  79.                         LCD_write_char(i+0x31);* n3 O# F0 ^  A. v, W
  80.                         HAL_Delay(1000); // 时间基准
    , k( G2 |2 _% x
  81.                }
    % }) u6 _' ^, y
  82. MC_StopMotor();     //  电机暂停3 i/ c5 |6 o# k$ G1 o2 w* X* P
  83.                for(i=0;i<k;i++)
    6 {2 p/ T4 d; \& W4 b3 k
  84.                {% h3 {" O& g7 q3 W$ H! s3 L
  85.                       LCD_set_XY(50,4);
    # s8 m4 [& h! `
  86.                         LCD_write_char(i+0x31);8 P& L, o& e  @4 k; ]" H& ^
  87.                 HAL_Delay(1000);  G* [' X8 _$ X
  88.                }8 ]+ _0 o% x" G' X
  89.                    LCD_set_XY(70,4);9 B- L# `- y0 L( _7 z0 ^+ o
  90.                    LCD_write_char(m+0x31);
    ; }5 |2 J4 t/ Q
  91.     }   
    ' |! b8 ?& D& G0 |
  92.         goto loop;
复制代码
小结:
经实际测试,可达到对应的控制要求。但其最大的缺陷是由于电机的工作电流较大且带有一定的电磁干扰,从而导致在电机运行时会破坏LCD5110屏的正常显示,而在电机启动前的工作模式选择是不受影响的,故不适于在连续操作的场合使用。
: Z( c* t8 v4 |. y2 V

评分

参与人数 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
2 G9 h: u& b9 M8 G, j) f( w1 }9 ?! @/ K
学习了
jinglixixi 回答时间:2017-8-31 20:10:28
多谢支持!!!
+ [* d* v8 }) X: K

所属标签

相似分享

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