不开心

一、设计目标:

设计以单片机为下位机,PC机为上位机的模拟转辙机控制系统。

二、设计内容和要求:

  1. 运行控制转辙机定位或反位操作及转辙机状态检测软件,根据上位机的指令,改变转辙机的定反位状态并将转辙机的状态反馈给上位机。
  2. 界面程序:上位PC机,运行转辙机控制界面程序。界面显示转辙机当前定反位状态。并可通过发送指令给下位机,实现转辙机位置的变化。
  3. 上位下位机通过RS232串口进行通信。

三、设计内容:

  1. 硬件设计:在proteus中绘制以单片机为核心的模拟转辙机仿真电路。
  2. 软件设计:keilC中设计下位机控制软件和串行通信软件、基于C#的上位PC机串行通信软件和控制界面软件。

四、方案设计

以下内容摘取自本人课设论文

(一)、系统总体结构

系统总体框架

单片机模拟转辙机控制系统由三部分组成:上位机、下位机和转辙机。上位机为搭载有配套控制软件的计算机,下位机为AT89C51单片机,上位机通过RS232总线与下位机通信,下位机通过电力电缆、通信电缆控制转辙机动作及监测转辙机的状态。

(二)、转辙机仿真结构图

仿真结构图

转辙机仿真模型由单片机、步进电机、步进电机驱动器、模拟限位开关、RS232串行接口、转辙机状态表示灯等组成。
单片机通过RS232接收到上位机发出的控制信号后,经过逻辑处理,输出驱动信号,信号经过ULN2003A芯片放大后驱动步进电机转动,完成转辙机转换道岔的动作。道岔转换完毕后,单片机将检测转辙机当前的状态,并回传到上位机中。也可以从上位机发送转辙机状态查询指令,单片机接收到查询指令后,将查询转辙机的状态并将结果回传到上位机中。
模拟限位开关可模拟转辙机是否转动到了相应的位置,到达正确的位置后,相应的表示灯将点亮。

(三)RS232串口通信模块COMPIM简介

RS232模块

RS-232是美国电子工业协会EIA(Electronic Industry Association)制定的一种串行物理接口标准。RS是英文“推荐标准”的缩写,232为标识号。RS-232是对电气特性以及物理特性的规定,只作用于数据的传输通路上,它并不内含对数据的处理方式。RS232电缆通常由9条不同的电线组成,尽管在某些连接器中使用了25条电线。 每条线在数据传输中都有不同的用途。 RS485电缆只有三根电线,两根用于数据传输,另一根用于接地。双向传输-RS232是全双工的,这意味着它可以双向发送和接收数据。RS232的通信距离一般在15m以内,超过这个距离可能会导致通信失败。
COMPIM模型是串口的物理接口模型,里面封装了RS232串行端口和电平转换芯片,可以直接与单片机相连而不需要额外的元器件辅助。传入的串行数据被缓冲并呈现给电路作为数字信号,同时在PC的物理COM端口处出现CPU或UART模型生成的串行数字数据。 COMPIM有八个引脚:TXD,RXD,CTS,RTS,DSR,DTR,DCD和RI,TXD,RTS和DTR输入设备,并在物理端口上变为输出。各个引脚的定义如下表所示。

COMPIM引脚功能

(四)ULN2003A步进电机驱动器简介

ULN2003A结构图

ULN2003A,是一种高压大电流的共发射极达林顿晶体管数组集成电路,内含7组达林顿对管,如图5(a)所示,每组对管的电流容量是500mA,输出的电压最高50V。该集成电路还集成了7只共阴极形式连接的续流二极管,用于电感性负载的开关动作的电流续流。ULN2003的引脚功能如表3所示。
ULN2003在电子电路里的主要特点是大电流容量和高电压输出。常作为驱动器使用,每组达林顿对管可并联使用以达成更大的电流容量,甚至可以几颗集成电路芯片堆叠并联使用。步进马达一般需要驱动器件有大电流输出的能力,而微控制器等小电流的集成电路是不能直接驱动马达的,因此可用作步进马达的驱动器。ULN2003内部的7组达林顿对管可以独立操作,因为它们的电路连接上除了发发射极是一并接地共享E/GND引脚、续流二极管是共阴极接法共享一个COM引脚以外,集电极
1C-7C以及基极1B-7B的引脚都是独立对应的7组。若作为步进马达驱动器,则COM一端需要与步进马达的公共供电端连接,为马达的反电动势提供电流续流能力。

ULN2003A引脚功能

器件主要参数:
(1)、单个集电极电流容量有500mA
(2)、输出电压达50V(另有支持100V输出的版本)
(3)、集成续流二极管
(4)、输出可兼容于TTL以及5V的CMOS逻辑电平
(5)、基极最低输入电压仅0.7V,常规也仅需2V左右

(五)步进电机

1、步进电机简介

步进电机是将电脉冲信号转变为角位移或线位移的开环控制元件。在非超载情况下,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,即给电机加一个脉冲信号,电机则转过一个步距角。这一线性关系的存在,加上步进电机只有周期性的误差而无累积误差等特点,使得步进电机在速度、位置等控制领域的控制操作非常简单。虽然步进电机应用广泛,但它并不像普通的直流和交流电机那样在常规状态下使用,它必须由双环形脉冲信号、功率驱动电路等组成控制系统方可使用。
(1)步进电机的静态指标
1)相数—电机内部的线圈组数。目前常用的有二相、三相、四相、五相步进电机。电机相数不同,其步距角也不同。一般二相电机的步距角为0.9°/1.8°,三相为0.75°/1.5°、五相为0.36°/0.72°。在没有细分驱动器时,用户主要靠选择不同相数的步进电机来满足自己步距角的要求.如果使用细分驱动器,则“相数”将变得没有意义,用户只需在驱动器上改变细分数,就可以改变步距角。
2)步距角—表示控制系统每发一个步进脉冲信号,电机所转动的角度。电机出厂时给出了一个步距角的值,如86BYG250A型电机的值为0.9°/1.8°(表示半步工作时为0.9°、整步工作时为1.8°),这个步距角可称为“电机固有步距角”,它不一定是电机实际工作时的真正步距角,真正的步距角和驱动器有关。
3)拍数—完成一个磁场周期性变化所需脉冲数或导电状态.或指电机转过一个步距角所需脉冲数。以四相电机为例,有四相四拍运行方式,即AB-BC-CD-DA-AB:四相八拍运行方式,即A-AB-B-BC-C-CD-D-DA-A
4)定位转矩—电机在不通电状态下,转子自身的锁定力矩(由磁场齿形的谐波以及机械误差造成)。
5)保持转矩—步进电机通电但没有转动时,定子锁住转子的力矩。它是步进电机最重要的参数之一,通常步进电机在低速时的力矩接近保持转矩。由于步进电机的输出力矩随速度的增大而不断衰减,输出功率也随速度的增大而变化,所以保持转矩就成了衡量步进电机最重要参数之一。比如,当人们说2N·m的步进电机时,在没有特殊说明的情况下,是指保持转矩为2N·m的步进电机。
(2)本项目中应用的步进电机
在本项目中的步进电机是四相步进电机。为了使步进电机的带负载能力更强,并且运行能够做到又平又稳,选用八拍驱动方式。四相八拍方式的通电顺序为:A相线圈最先开始通电,随后转换为A、B两相线圈同时通电,再单独通电给B相,之后对BC两相线圈同时通电……即按A→AB→B→BC→C→CD→D→DA→A…顺序进行。当步进电机定子绕组按一定顺序轮流通电时,转子就沿一定方向一步步转动起来。

2、步进电机驱动电路

步进电机驱动电路

如图8所示,四相步进电机的A、B、C、D四相分别接入单片机的P2.0、P2.1、P2.2、P2.3接口。步进电机采用四相步进电机,工作方式为八拍驱动。如表4所示,单片机P2口输出脉冲序列{0x02,0x06,0x04,0x0c,0x08,0x09,0x01,0x03},经过ULN2003A放大后即可使步进电机转动一圈。当需要反转时,只需反序列输出脉冲信号即可实现步进电机反向旋转。

驱动控制字

(六)模拟限位开关

在实际应用中,单片机通过检测转辙机上的限位开关状态判断转辙机是否转动到位,在仿真模拟中,模拟限位开关的动作是困难的。这里用到的方法是,单片机经过端口输出高电平,经过Q1、Q2放大器放大信号后使继电器RL1、R2吸合。

模拟限位开关结构

如图9所示,继电器RL1的励磁电路与单片机P3.2口相连接,继电器触点一端接地,另外一端与单片机P3.4相连接。当转辙机转动到定位时,单片机P3.2置“1”,输出的高电平经过Q1放大器放大后,电流流过继电器RL1的线圈,驱动继电器吸合。继电器动静触点相连接,单片机的P3.4口经过继电器的接点接地,变为“0”,此时检测P3.4的状态,如果P3.4为低电平,说明转辙机已经转动到了定位,表示灯电路动作,定位表示灯亮起。反位的模拟限位开关同理。

(七)程序设计

1、程序流程图

程序流程图

2、程序代码
[hide]

/**************************************************************************************
基于单片机和RS232串行通信的模拟转辙机设计仿真                
作者:Kanoer  日期:2021年07月07日                             
***************************************************************************************/

#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define OUT P2

sbit dw_out = P3^2;  //模拟定位到达输出口
sbit fw_out = P3^3;  //模拟反位到达输出口
sbit dw_over = P3^4;  //限位开关定位到达
sbit fw_over = P3^5;  //限位开关反位到达
sbit dwd = P1^0;  //定位表示灯
sbit fwd = P1^1;  //反位表示灯
uchar a,b,rec;
uchar code turn[] = {0x02,0x06,0x04,0x0c,0x08,0x09,0x01,0x03};    //电机旋转一周脉冲组  //code,将数组turn存储在ROM中,节省RAM资源
uchar code turnres[] = {0x03,0x01,0x09,0x08,0x0c,0x04,0x06,0x02};  //反转

void delay(unsigned int n) //延迟函数,用于步进电机调速
{
    unsigned i=0,j=0;
    for(i=0;i<n;i++)
    {
        for(j=0;j<120;j++);
    }
}

void forward() //电机正转(反位转定位)
{
    if (fw_over==0)   //如果转辙机处于反位状态
     { 
        fwd=0;           //转辙机动作,反位表示灭灯
        for (b=0;b<=4;b++)
         {
          for(a=0;a<=7;a++) 
           {            
            OUT = turn[a];
            delay(100);
           }
         }
        fw_out=0; 
        dw_out=1;  //转辙机转到定位                          
     }
}

void reverse() //电机反转(定位转反位)
{
    if (dw_over==0)  //如果转辙机处于定位状态
     { 

          dwd=0;           //转辙机动作,定位表示灭灯
          for (b=0;b<=4;b++)
          {
              for(a=0;a<=7;a++) 
              {            
                 OUT = turnres[a];
                 delay(100);
              }
          }
          dw_out=0; 
          fw_out=1;  //转辙机转到了反位                             
     }
}

void com_start() //串口通信初始化,波特率9600,晶振11.0592 MHz
{
    TMOD = 0x20;
    PCON = 0x00;
    SCON = 0x50;
    TH1 = 0xFd;
    TL1 = 0xFd;
    TR1 = 1;
}

void machine_status() //模拟转辙机初始状态设定
{
    dw_out=0;
    fw_out=0; 
    fwd=0; 
    dwd=0; 
    fw_out=1;  //设定转辙机初始状态为反位
} 

void light() //转辙机状态表示灯
{
  if (dw_over==0) {dwd=1;} else {dwd=0;} //定位表示判断
  if (fw_over==0) {fwd=1;} else {fwd=0;} //反位表示判断                 
} 

void main()   
{
    com_start();
    machine_status();
    while(1)
     { 
       light();         
       if(RI)  
          {    
            RI=0;
            rec=SBUF;  //读取接收到的串口数据
            if (rec=='D') {forward();light();SBUF='D';while(TI==0);TI=0;} //反位转定位
            if (rec=='F') {reverse();light();SBUF='F';while(TI==0);TI=0;} //定位转反位    
            if (rec=='C')  //查询转辙机状态
            {
                if (dwd==1)    //定位灯亮起
                {
                    SBUF='D';
                    while(TI==0);
                    TI=0;
                }
                if (fwd==1)     //反位灯亮起
                {
                    SBUF='F';
                    while(TI==0);
                    TI=0;
                }
            }    
          }

     } 

}

[/hide]

五、仿真结果

(一)上电初始化

上电初始化

(二)反位转定位

反位转定位

(三)定位转反位

定位转反位

(四)状态查询

状态查询

六、参考文献及资料

石斐. 基于Keil的永磁减速步进电机控制系统的设计及实现[D].苏州大学,2015.
余逸风. 二相混合式步进电机细分控制技术研究及驱动器的设计[D].广西科技大学,2015.
袁晓溪. 基于单片机的LED显示系统[D].吉林大学,2015.
化腾飞. 基于高性能单片机的无线LED彩灯控制系统的设计与实现[D].太原理工大学,2015.
古志坚. 基于单片机的步进电机控制系统研究[D].华南理工大学,2013.
王静. 基于单片机的数据串口通信[D].长江大学,2013.
马晓云. 基于串口通信的上/下位机控制系统软硬件设计[D].苏州大学,2013.
汪姝. 基于单片机的步进电机驱动控制系统的设计与实现[D].南昌大学,2012.
蔡晶晶. 基于单片机的步进电机伺服控制器的设计[D].内蒙古农业大学,2012.
周建春. 基于单片机和PC串口通信的温度采集系统设计[D].苏州大学,2010.
方爱平. 基于单片机的步进电机控制系统的设计与实现[D].浙江工业大学,2009.
PC 机与单片机通信(RS232 协议):https://blog.csdn.net/m0_46202433/article/details/109085815
51单片机+ESP8266-01通过串口通信控制LED灯:https://blog.csdn.net/qq_41984175/article/details/104566513
实验二:串行通信实验:

51单片机串口通信的发送与接收:http://www.51hei.com/bbs/dpj-78339-1.html
C51语言:https://blog.csdn.net/mars_ljh/article/details/106049555
51单片机实验1——串行通信(TX/RX)——数码管显示串行口接收的字符的ASCII码:https://blog.csdn.net/weixin_42532989/article/details/107526004
【实验】实验课总结4 实验三:https://blog.csdn.net/qq_43710355/article/details/106223124
keil中C51关键字code用法:https://blog.csdn.net/m0_46559794/article/details/108006698

七、感谢

https://convertio.co 提供了MP4转GIF转换服务
https://www.online-convert.com/fr 提供了PDF转SVG服务
https://app.diagrams.net 提供了流程图在线绘制服务

この素晴らしい世界に祝福を!
最后更新于 2023-10-07