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

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

[复制链接]
jinglixixi 发布时间:2017-8-31 10:13
本帖最后由 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.png
图1 用F302实现LCD5110屏显示
  v' s9 W& f  Q3 c8 O. t! E! ?2 |
图片2.png
图2 用F302实现RTC计时
; q8 S% _3 D( I8 |& S9 ?
    随后以LCD5110液晶屏、软按键及电机套件构建了一个简单测试环境,如图3所示。在未启动电机的情况下,能进行模拟运行,即开机后可通过按键来设置电机运行的模式,为简化设计电机工作节拍内的运行时间t1和停止时间t2是由程序固定设置好的,工作时长n,也由程序来指定,其界面如图4所示。为便于验证,最后一行为运行状态指示行以供对比。
图片3.png
图3 验证环境构成
5 f! [2 v+ G& a
图片4.png
图4 设置运行模式
  @3 b% {! f( z3 R6 H! Z+ N
图片5.png
图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屏的初始化函数如下:
  1. void LCD_Init(void)
    " e4 p$ p% D; b3 Q5 l& |+ F; @
  2. {) y' c# d( b( ?' Z* e# ^0 A
  3.         SetLCD_RST_Low();    ) o2 `! G6 D9 l* E. B9 i
  4.         delay_1us();3 x& S( w/ _2 [9 R' R
  5.         SetLCD_RST_High();   
    " {3 b& j4 ?6 ]% f, ~
  6.         delay_1us();
      J7 S8 o  z3 p" K
  7.         delay_1us();7 y- n$ ?7 y% }4 h% Y9 F
  8.         LCD_write_CMD(0x21);7 O/ y5 I0 u7 w5 }2 {7 R6 w
  9.         LCD_write_CMD(0xc0);
    4 D" ]  J$ E# v' g/ B1 N  |
  10.         LCD_write_CMD(0x06);
    4 G  `) ]. F5 d$ x  c7 v
  11.         LCD_write_CMD(0x13);. i( a* v; C( ]: Y5 d# `7 a
  12.         LCD_write_CMD(0x20);- S. x- n) V$ M  k6 M( ~/ N
  13.         LCD_Clear();           
    6 V: n" n% o9 ^: l
  14.         LCD_write_CMD(0x0c);        " f# M/ L  v$ u- K4 k7 t
  15. }
复制代码
       实现设计功能的主程序如下:
  1. int main(void)
    ' Y' n7 p! {4 e& b; F7 G3 R
  2. {8 s. y* D# E4 |" I
  3. uint n,i,j,k,m,v;& I$ N! t9 `8 M: R& c  ^' P
  4.     HAL_Init();. O& X6 i" e- b# r6 o  s# A
  5.     SystemClock_Config();
    7 j: G* ?" F* E$ G
  6. MX_GPIO_Init();
    6 e0 V# [$ s' B0 H5 D4 p* d
  7.     MX_ADC1_Init();
    : r, ]8 \$ x( ~8 l- K5 [4 p
  8.     MX_DAC_Init();( w- Y# E: t. |( D' [
  9.     GPIO_Configuration();        
    & x+ L& ^0 y1 D- f7 b. t
  10.     LCD_Init();& L; J5 O. S" B: ^; K
  11. LCD_Clear();7 J9 f5 U& k. }- I* l  z+ S
  12. LCD_write_english_string(0,0,"NUCLEO-F302R8");
    ' Q4 b. j# d& L" z/ F% t: y2 A
  13. LCD_write_english_string(0,2,"NUCLEO-IHM07M1");
    5 P& N' `: `- v" u$ m, x) V6 o
  14. LCD_write_english_string(0,4,"X-CUBE-SPN7");
    ' [! c3 Y: p6 C* v- L4 N
  15.     HAL_Delay(1000);: }4 h3 d% Y+ M- a  x! \. W
  16. MX_TIM1_Init();7 x7 w1 t) `5 h6 y
  17.     MX_TIM6_Init();
    ; F3 @- w. I- p! }: Z1 G+ Y# O
  18.     MX_TIM16_Init();
    # e6 h1 s& r8 y6 t( Q" L- _6 Q9 N
  19. MC_SixStep_INIT();
    , X1 t2 r* h4 i$ L) }9 K  X
  20. loop:        
    % |. c; s2 _2 o9 K3 I
  21.     LCD_Clear();. b7 A" Q' j$ ]
  22.         LCD_write_english_string(10,0,"M");  //   工作模式- O# }- T" z4 _4 }) w$ e2 z
  23.         LCD_write_english_string(30,0,"t1");  //   启动时间. y5 {3 @4 w5 I; Y, s8 v
  24.         LCD_write_english_string(50,0,"t2");  //   暂停时间
    1 s  ]7 A) e( n
  25.         LCD_write_english_string(70,0,"n");   //   运行时长2 k6 ~! ]% }# _) `
  26.         n=0;+ X9 @: D1 O* ?% O: l6 r
  27.         i=1;
    $ v8 a7 b* l; u: q* ]& w) A
  28.         v=3;# e! e6 Y5 c, n& p0 W8 H
  29.         while(i)% v( O" J& x' i- x. m$ P& `. K( o9 c
  30.         {   //   选取工作模式, K8 X( x4 M. D+ N: t
  31.                 if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_14)==0)  n=1;! D# @' {& ~) f/ b+ q, M4 Q& Q
  32.                 if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_15)==0)  n=2;7 U# p2 n+ V( }4 f0 R* I
  33.                 if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_13)==0)  n=4;
    ' ]/ r9 @; l& p( f$ u3 z" [! X
  34.                 LCD_set_XY(10,2);
    4 a4 V* M4 l/ b3 d- e& V  K
  35.                 LCD_write_char(n+0x30);
    . x  Z3 m4 [- V' D" X
  36.                 if(n>0) i=0;& z6 y$ g5 ?  t5 p6 k
  37.                 if(n==1)
    2 c, o5 J/ k3 O& k  Y% I8 T
  38.                 {   //  设置模式参数. @( L. H- C; b8 u6 W! `
  39.         j=3;) a+ W$ h1 k) L$ X9 \  N
  40.                         k=2;- C- T# z6 I) a* W
  41.                         MC_Set_Speed(4000);  //   指定转速+ p% y. v' x9 j) \- J! p. j/ w
  42.             LCD_set_XY(30,2);
    7 K; d# U% |, \- Z. z
  43.                         LCD_write_char(j+0x30);
    ( N. r8 _6 V% Z1 R* R& w
  44.                         LCD_set_XY(50,2);
    " B$ O$ ~( O+ ]
  45.                     LCD_write_char(k+0x30);* W9 t  i' C$ T& r1 _1 q
  46.                 }
    - E; ~' _1 L9 ^" L
  47.                 7 \) M5 K$ `5 S0 ~) r
  48.                 if(n==2)
    4 `1 W2 m( n# ^) \$ T! ^
  49.                 {4 K9 [3 d( I1 E" I6 E3 E
  50.                     j=2;
    . m$ o9 s( c3 w9 K+ f
  51.                         k=3;) w3 C! P' R4 q; c% n2 g# K
  52.                         MC_Set_Speed(6000);+ Y$ [0 E' ?$ k  H
  53.                         LCD_set_XY(30,2);
    6 e  C2 u# l/ ]9 F6 W
  54.                     LCD_write_char(j+0x30);% H& N. G* v, D! o6 W
  55.                         LCD_set_XY(50,2);
    ! o9 j) d2 F( H( [' x
  56.                     LCD_write_char(k+0x30);% ]! q2 B& [2 U5 Q  n4 n
  57.                 }
    . ~' T# e* R2 M9 T
  58.                 if(n==4)
    ( R  ]) A. t5 O" c. Z1 h
  59.                 {, ^( U# q) O* a. N
  60.                     j=3;
    # s# n: D' Z" D. l( S
  61.                         k=3;
    " E. |* |4 S4 Z- ]4 E9 q
  62.             MC_Set_Speed(10000);
    5 q2 S* `3 Z, N! d/ P, P
  63.                         LCD_set_XY(30,2);# {# Z- [% ?$ B% ~8 I$ T# o
  64.                         LCD_write_char(j+0x30);
    5 g3 S7 t5 j9 d) r
  65.                         LCD_set_XY(50,2);
    - ^+ \. y) j/ t9 x& Q
  66.                     LCD_write_char(k+0x30);6 D: D% o! l) A! R
  67.                 }4 o4 T6 \, @$ Q# g: l
  68.         }: ^" m4 E3 V( X7 v
  69.                 LCD_set_XY(70,2);
    ( O3 o$ [! B& ^7 I! R8 R, Z
  70.                 LCD_write_char(v+0x31);
    5 e7 G  \# F$ X4 J
  71.                 LCD_set_XY(70,2);
    / {! o! F4 V, }2 B+ R
  72.             LCD_write_char(3+0x30);3 f3 H" Q: @, s/ F9 o
  73.                 for(m=0;m<v;m++)      // 运行时长控制
    $ r: f1 H& T5 G( H3 Y
  74.         {$ v5 ^# b- g! S4 f; n: ?
  75.                MC_StartMotor();    //  启动电机        
    / z" U! D; ]" Z6 y+ l
  76.                for(i=0;i<j;i++)' |+ v, h6 Y' M
  77.                {
    / K7 R+ x: I, \, M8 v: ]
  78.                       LCD_set_XY(30,4);
    8 }) ~$ t6 I. m' y8 F+ ?
  79.                         LCD_write_char(i+0x31);  `" J  @+ E7 T# G' _6 H! N  B$ Q
  80.                         HAL_Delay(1000); // 时间基准
    ' D) S6 B1 g, b& r$ [
  81.                }
    ! z0 c1 ^% G$ V8 J* I: {
  82. MC_StopMotor();     //  电机暂停! p7 z: _& l1 k& a% w9 O) F
  83.                for(i=0;i<k;i++)" A0 r: H% {  ?4 N
  84.                {5 a, z' P/ f5 j% B
  85.                       LCD_set_XY(50,4);
    3 h5 D- _! Y  p" f: w
  86.                         LCD_write_char(i+0x31);
    ! ?. q$ h% \4 K- y( _
  87.                 HAL_Delay(1000);; R/ E7 l- Y' g, q: {+ b9 Q+ B
  88.                }$ [0 b$ A4 o' s, e
  89.                    LCD_set_XY(70,4);! L! p7 K6 O1 a
  90.                    LCD_write_char(m+0x31);3 R" f) d6 B( M
  91.     }     w/ |  a' r: i
  92.         goto loop;
复制代码
小结:
经实际测试,可达到对应的控制要求。但其最大的缺陷是由于电机的工作电流较大且带有一定的电磁干扰,从而导致在电机运行时会破坏LCD5110屏的正常显示,而在电机启动前的工作模式选择是不受影响的,故不适于在连续操作的场合使用。
. ]5 I" t2 Q2 p# {1 q- A* \5 p  A' t

评分

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

; i# e5 ^' P, k" Z6 p0 ]学习了
jinglixixi 回答时间:2017-8-31 20:10:28
多谢支持!!!) _$ O. b8 U! ~) |0 j) A
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版