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

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

[复制链接]
jinglixixi 发布时间:2017-8-31 10:13
本帖最后由 jinglixixi 于 2017-8-31 10:15 编辑
0 M; d2 k( c2 e. Z9 w
, d. k. r( W# y& p
    对于管道型的生产设备,为了保证其可靠的运行需要定时地进行清洗,其工作方式与我们常见的洗衣机十分相像,主要有2种工作参数,即运行时长和清洗模式。而清洗模式又关系到电机运行的速度、转动方向和工作节拍,其中的工作节拍是指转动时间与停止时间的占空比。利用本次活动的STM32 FOC开发套件,十分便于做这方面的模拟设计。
      在设计的开始本打算是设计一个基于MCU内部RTC进行多时段控制的管道清洗控制器,且利用STM32F3-Discovery的程序实现了RTC计时功能,如图1和图2所示,但移植到该电机套件的环境下却不能正常执行。无奈只能放弃该功能。
图片1.png
1 用F302实现LCD5110屏显示
6 j3 ~6 L( u5 I2 P, t! |
图片2.png
2 F302实现RTC计时
8 F6 S" G$ X5 t; A
    随后以LCD5110液晶屏、软按键及电机套件构建了一个简单测试环境,如图3所示。在未启动电机的情况下,能进行模拟运行,即开机后可通过按键来设置电机运行的模式,为简化设计电机工作节拍内的运行时间t1和停止时间t2是由程序固定设置好的,工作时长n,也由程序来指定,其界面如图4所示。为便于验证,最后一行为运行状态指示行以供对比。
图片3.png
3 验证环境构成

) ^# B, a  r3 h$ h) J6 T
图片4.png
4 设置运行模式

3 @$ Q$ Q* |; r+ G* d! e$ {
图片5.png
5 模拟验证界面
; I2 d  w. M, B4 ?
其中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
" C" o2 B3 o- H" B$ ^

0 v# n+ t; X/ u, Z: }2 j- ~. P( O6 a
    故对LCD5110相关引脚所定义的输出高、低电平的语句如下:
#define SetLCD_SCE_Low()          HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_RESET)
. O, j, ?# f9 \* b* 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)
, ^, n( c# |# D9 H9 j8 {8 W
#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)
7 N2 Q6 T- h; }( C, ~% G8 s; f
#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)

) w% R0 L" u: s: f% ~2 U6 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)

/ ?! r" Z5 m, U
      LCD5110屏的初始化函数如下:
  1. void LCD_Init(void)/ L$ A8 ^1 x0 A7 V6 s: E3 ]
  2. {9 z" z" d) H/ Q: ]2 l  D0 z, ^# f: i
  3.         SetLCD_RST_Low();   
    4 w& T1 K/ z! r* U& D0 R. i! e" n
  4.         delay_1us();/ o" N7 i& A% p# d3 ?5 }& l
  5.         SetLCD_RST_High();    ( `$ U% j% T% d* u
  6.         delay_1us();
    1 b8 \/ \, h; V9 c
  7.         delay_1us();* J$ F9 _  E$ d) _6 S
  8.         LCD_write_CMD(0x21);
    $ i, N% W! @( f. _
  9.         LCD_write_CMD(0xc0);
    4 s( {0 T  x# `; h! f7 b% J6 k
  10.         LCD_write_CMD(0x06);
    7 R$ y! g9 W) j/ T, A- h9 K# a$ y0 @
  11.         LCD_write_CMD(0x13);8 T8 ~( C! e6 m1 D+ p- C
  12.         LCD_write_CMD(0x20);' ?1 p  F9 N% D/ Y3 g; B
  13.         LCD_Clear();           ) N) Z; A1 S* _( j
  14.         LCD_write_CMD(0x0c);        2 _. F& r' j5 R* s3 M8 O2 d7 U
  15. }
复制代码
       实现设计功能的主程序如下:
  1. int main(void)
    0 Z& m' a  p* F- y, P2 h
  2. {
    * R( T& U" M# s: l/ o! c, x
  3. uint n,i,j,k,m,v;0 a5 o: f0 h: c+ b% ?
  4.     HAL_Init();( g; [+ F9 }- i0 l0 n# x# [
  5.     SystemClock_Config();
    4 ]" x- E  O0 g0 |0 |) A
  6. MX_GPIO_Init();0 j( M! c4 e5 s6 P3 _% ~
  7.     MX_ADC1_Init();; n7 I, ~, g" a/ b  e
  8.     MX_DAC_Init();( e. h% l. H! k" X
  9.     GPIO_Configuration();        3 e1 |" ?' l& A* c2 B
  10.     LCD_Init();8 C6 f4 b  Z0 c* ~5 K, s! `5 @
  11. LCD_Clear();
    9 A, e9 W! a# y7 @: Y1 ^  p9 a5 a, g
  12. LCD_write_english_string(0,0,"NUCLEO-F302R8");
    1 s1 W$ s2 A$ z* A, R: T' H
  13. LCD_write_english_string(0,2,"NUCLEO-IHM07M1");
    " B& @" b: Z6 V$ a& ~
  14. LCD_write_english_string(0,4,"X-CUBE-SPN7");) D$ o3 B2 M' e' v% z/ L5 ~' L8 x
  15.     HAL_Delay(1000);
    1 x% C+ E; k) y% s. Z0 e1 ^
  16. MX_TIM1_Init();5 E- W4 u) S  A2 b" W6 G
  17.     MX_TIM6_Init();( i/ k/ ?# T* Z3 G- L3 L- P: G
  18.     MX_TIM16_Init();
    6 i" C( H; G  i7 X
  19. MC_SixStep_INIT();, \7 U( X6 u6 |) S
  20. loop:        7 y* @$ M; p% e. W9 x
  21.     LCD_Clear();, g. x) A  {: Z2 u
  22.         LCD_write_english_string(10,0,"M");  //   工作模式
    # ]* ]* U8 o% e
  23.         LCD_write_english_string(30,0,"t1");  //   启动时间
    ( c# ?0 Z7 L$ E% i, O
  24.         LCD_write_english_string(50,0,"t2");  //   暂停时间5 B" q9 Q8 w) D# b/ t& Z" H3 U
  25.         LCD_write_english_string(70,0,"n");   //   运行时长3 J3 g) J! y1 T5 K! S* G9 w
  26.         n=0;
    ( a1 {3 ~6 O- h9 F2 Z) \. j' x
  27.         i=1;
    1 C  t; I; `6 u6 M" _) `
  28.         v=3;
    - N& g1 Z+ ], F' e
  29.         while(i)
    0 K: Y* O6 p0 I! h& q' X" m# W
  30.         {   //   选取工作模式0 P. @% p6 R5 z  ], y7 v
  31.                 if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_14)==0)  n=1;
    / e8 y# V% u/ A- P( J
  32.                 if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_15)==0)  n=2;
    # S0 ^' R# C% E/ y! o2 Y! y/ z3 S
  33.                 if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_13)==0)  n=4;
    ! y! a3 l+ g3 E0 @/ y, |
  34.                 LCD_set_XY(10,2);3 R' y, s6 j( d: d$ t3 E% U
  35.                 LCD_write_char(n+0x30);
    ' @; U% }- i( a; N5 ?
  36.                 if(n>0) i=0;
    & {4 {) P, ^' s* X9 G& ~9 f
  37.                 if(n==1)# S0 D7 E) r8 `- B/ r( Z1 h" n
  38.                 {   //  设置模式参数1 A: K& D! ]0 @5 W5 t
  39.         j=3;
    : s( [% k- w- _
  40.                         k=2;1 A! F5 ]% e3 z( M( H
  41.                         MC_Set_Speed(4000);  //   指定转速, K+ i/ N& O, |% d' h  }6 B
  42.             LCD_set_XY(30,2);
    + I- Y7 G5 b* Y' C4 d
  43.                         LCD_write_char(j+0x30);% Z) q5 T5 J8 s, s+ T
  44.                         LCD_set_XY(50,2);
    9 r8 Q) I( Y& E7 ^1 P; `  l
  45.                     LCD_write_char(k+0x30);2 C# C" S, ?1 p1 k- i
  46.                 }5 a- A8 T- E- M  [/ H& e
  47.                
    # f8 p6 U  ^" k
  48.                 if(n==2); _! Z2 w) k& U: R
  49.                 {
    ( b, e$ V9 K9 \# ]6 u
  50.                     j=2;% u  a0 t$ p: j' Y
  51.                         k=3;7 b  x/ z% t# W  x2 |; C
  52.                         MC_Set_Speed(6000);/ A$ I" B  p- A# m9 _
  53.                         LCD_set_XY(30,2);2 D- ~" o4 U: R6 X/ p
  54.                     LCD_write_char(j+0x30);
    $ g3 ^+ k/ W# f8 W" j
  55.                         LCD_set_XY(50,2);
    * K# p1 |( k  @$ B: y6 R; F
  56.                     LCD_write_char(k+0x30);: v# R4 N1 D- Q6 g/ ^! P# t
  57.                 }
    2 i" F$ x( e0 {& z/ p: O: Q, N
  58.                 if(n==4): c3 f5 h! h( g0 f- K/ C
  59.                 {; Q% Q0 ]# ?6 Y  g  T: q
  60.                     j=3;& d. E, v$ G' ~5 h5 C0 Y, S* Q
  61.                         k=3;- S3 n/ Y  k- s% J4 {
  62.             MC_Set_Speed(10000);
    ) x2 o# k5 Y8 h$ I. M
  63.                         LCD_set_XY(30,2);
    , @0 C* F! R8 Z& D6 s
  64.                         LCD_write_char(j+0x30);
    5 @* b- R  t& a' t/ e3 \
  65.                         LCD_set_XY(50,2);
    ) w" \: ?+ s: `9 b0 e, w. {
  66.                     LCD_write_char(k+0x30);3 G' u- B" i5 M; G
  67.                 }
    . |! V1 s+ l1 T# ?& H6 X/ n8 G
  68.         }
    7 e6 W0 A1 i8 L
  69.                 LCD_set_XY(70,2);
    ( I: a, W* T/ P; ]% _
  70.                 LCD_write_char(v+0x31);
    : Q6 X" o/ n, m
  71.                 LCD_set_XY(70,2);
    ( V) H' r0 `0 V  V& b+ c, M- @% b) {
  72.             LCD_write_char(3+0x30);
    ' E6 H% a; x& [
  73.                 for(m=0;m<v;m++)      // 运行时长控制1 q* i% n9 F' o0 I- D5 T4 j3 Z
  74.         {3 n4 h" w: V. i
  75.                MC_StartMotor();    //  启动电机        5 D$ d2 U+ ~5 I! F" D: l7 v  g
  76.                for(i=0;i<j;i++)% S% [5 u9 k+ A% O/ F
  77.                {- A" S$ C) {) X3 Z' F: b0 m
  78.                       LCD_set_XY(30,4);4 r  p( J, C: h- [% Q
  79.                         LCD_write_char(i+0x31);3 l* N4 v9 m5 h3 W$ Y- Y
  80.                         HAL_Delay(1000); // 时间基准4 l3 D  z! r9 C  C' Y. k7 p
  81.                }0 A1 G9 E$ p- t) [; ], `
  82. MC_StopMotor();     //  电机暂停$ Z3 ]2 Z9 {& l3 c
  83.                for(i=0;i<k;i++)2 f( G; C( o4 F- s# [
  84.                {
    8 z* a0 P) r4 C7 _) n# D# y/ a* N
  85.                       LCD_set_XY(50,4);) g  m. k6 A" E) i
  86.                         LCD_write_char(i+0x31);
    . y/ s4 O& T3 L, F3 |
  87.                 HAL_Delay(1000);
    - i$ Q9 f! h4 p' t7 S3 x: I, e
  88.                }' M+ c% t- c6 o
  89.                    LCD_set_XY(70,4);' N$ t8 v" ]4 o
  90.                    LCD_write_char(m+0x31);
    : h) r$ u& i2 P9 W
  91.     }   " v3 m2 g' n9 X# {6 Z: g
  92.         goto loop;
复制代码
小结:
经实际测试,可达到对应的控制要求。但其最大的缺陷是由于电机的工作电流较大且带有一定的电磁干扰,从而导致在电机运行时会破坏LCD5110屏的正常显示,而在电机启动前的工作模式选择是不受影响的,故不适于在连续操作的场合使用。
6 U8 b2 g0 C7 i* T, R! }6 n

评分

参与人数 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

5 e* j5 I3 d4 _5 n( y学习了
jinglixixi 回答时间:2017-8-31 20:10:28
多谢支持!!!) O& Q' E5 N- g6 i" F5 s

所属标签

相似分享

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