1. 设计要求 如右图所示,以MCS-51系列单片机为核心设计一个具有独创功能的计量控制系统,控制瓶装产品包装生产流水线,每计满一定瓶数产品时发出一个包装控制信号,通过相关电路驱动包装机完成一次包装动作。要求: 1. 每箱产品的瓶数为51瓶,可记录已封装箱数; 2. 系统具有人机交互功能,可由用户控制流水线工作速度,并实时显示已计量瓶数和封装箱数; 3. 流水线使用48V 2000W直流电机进行传动,设计MCU与该电机的接口电路,实现流水线传动的启停和速度 控制,并仿真其可行性; 4. 设计用于检测瓶子的 传感器应用电路,实现对瓶数的感测; 5. 包装机数据接口为 RS-485接口,设计MCU与包装机的接口电路; 6. 包装机的数据通信采用 10位异步串行通信帧标准格式,即1位起始位、8 位数据位、1 个停止位,无奇偶校验和硬件数据流控制,通信波特率为 4800 bps,帧格式为:
每帧包含3个字节,第1个字节为同步头字节“0xAA”,第2个字节为命令字节(“0x33”启动包装,“0x55”停机),第3个字节为校验和(前面两个字节的无符号代数和),设计、 编写具体的通信程序并仿真; 7. 创新功能:在达到51瓶是蜂鸣器鸣叫提醒; 8. 设计、绘制系统电路PCB,手写签名在Top Layer的正中位置。 2. 硬件总体设计 2.1 总体设计方案 由设计要求可知,需使用MCS-51系列单片机,构建控制系统,实现系统的控制。所以采用AT89C52 单片机为核心,以6个弹跳按钮和光电传感器作为输入端,达到控制直流电机的正转、反转、停止、加速、减速、数据清除及瓶子数量采集功能,并且由LCD1602显示模块可以显示瓶子数量、箱子数量以及电机转速。在设计中,采用 PWM 技术对电机进行控制,并通过485通讯协议控制包装机的启停。 该直流电机控制系统的设计,在总体上大致可分为以下8个部分组成:AT89C52单片机最小系统,按键输入模块,瓶数检测模块,1602显示模块,电机驱动模块,包装机控制模块,包装机控制模块以及直流电机。系统总体方案图如图 1 所示。 图 1 系统总体方案图 2.2 工作原理 2.2.1 电机控制原理 根据励磁方式不同, 直流电机分为自励和他励两种类型。 不同励磁方式的直流电机机械特性曲线有所不同。对于直流电机来说,认为机械特性方程式为: (公式1) 式中U N,φN----------额定电枢电压、额定磁通量; Ke,Kt ---与电机有关的常数; Rad,Ra -----电枢外加电阻、电枢内电阻; n,△n—理想空载转速、转速降。 分析公式1可得,当分别改变UN、φN和Rad时,可以得到不同的转速n,从而实现对速度的调节。由于φ=T,当改变励磁电流If时,可以改变磁通量φ的大小,从而达到变磁通调速的目的。但由于励磁线圈发热和电动机磁饱和的限制,电动机的励磁电流If和磁通量φ只能在低于其额定值的范围内调节,故只能弱磁调速。而对于调节电枢外加电阻 Rad时,会使机械特性变软,导致电机带负载能力减弱。 PWM是通过控制固定电压的直流电源开关频率,从而改变负载两端的电压,进而达AT89C52输入模块电源模块驱动模块直流电机达到控制要求的一种电压调整方法。PWM可到控制要求的一种电压调整方法。PWM 可以应用在许多方面,如电机调速、温度控制、压力控制等。 在 PWM 驱动控制的调整系统中,按一个固定的频率来接通和断开电源,并根据需要改变一个周期内“接通”和“断开”时间的长短。通过改变直流电机电枢上电压的“占空比”来改变平均电压的大小,从而控制电动机的转速。因此,PWM 又被称为“开关驱动装置”。在脉冲作用下,当电机通电时,速度增加;电机断电时,速度逐渐减少。只要按一定规律,改变通、断电的时间,即可让电机转速得到控制。当我们改变占空比时,可以得到不同的电机平均速度,从而达到调速的目的。以应用在许多方面,如电机调速、温度控制、压力控制等。在PWM 驱动控制的调整系统中,按一个固定的频率来接通和断开电源,并根据需要改变一个周期内“接通”和“断开”时间的长短。通过改变直流电机电枢上电压的“占空比”来改变平均电压的大小,从而控制电动机的转速。因此,PWM又被称为“开关驱动装置”。在脉冲作用下,当电机通电时,速度增加;电机断电时,速度逐渐减少。只要按一定规律,改变通、断电的时间,即可让电机转速得到控制。当我们改变占空比时,可以得到不同的电机平均速度,从而达到调速的目的。 2.2.2 光电传感器原理 光电传感器是通过把光强度的变化转换成电信号的变化来实现控制的。 光电传感器在一般情况下,有三部分构成,它们分为:发送器、接收器和检测电路。 发送器对准目标发射光束,发射的光束一般来源于半导体光源,发光二极管(LED)、激光二极管及红外发射二极管。光束不间断地发射,或者改变脉冲宽度。接收器有光电二极管、光电三极管、光电池组成。在接收器的前面,装有光学元件如透镜和光圈等。在其后面是检测电路,它能滤出有效信号和应用该信号。 此外,光电开关的结构元件中还有发射板和光导纤维。 三角反射板是结构牢固的发射装置。它由很小的三角锥体反射材料组成,能够使光束准确地从反射板中返回,具有实用意义。它可以在与光轴0到25的范围改变发射角,使光束几乎是从一根发射线,经过反射后,还是从这根反射线返回。 2.3 AT89C52最小系统 2.3.1 AT89C52芯片简介 采用AT89C52是MSC-51系列单片机的升级版,由世界著名半导体公司 ATMEL在购买MSC-51设计结构后,利用自身优势技术——闪存生产技术对旧技术进行改进和扩展,同时使用新的半导体生产工艺,最终得到成型产品。与此同时,世界上其他的著名公司也通过基本的51内核,结合公司自身技术进行改进生产,推广了一批如51F020等高性能单片机。AT89C52片内集成256字节程序运行空间, 8K字节Flash存储空间,支持最大64k外部存储扩展。根据不同的运行速度和功耗的要求,时钟频率可以设置在0-33M之间。片内资源有4组I/O控制端口、3个定时器、8个中断、软件设置低耗能模式、看门狗和断电保护。可以在4V到5.5V宽电压范围内正常工作。不断发展的半导体工艺也让该单片机的功耗不断降低。同时,该单片机支持计算机并口下载,简单的数字芯片就可以制成下载线,仅仅几块钱的价格让该型号单片机畅销 10 年不衰。根据不同场合的要求,这款单片机提供了多种封装,本次设计根据最小系统有时需要更换单片机的具体情况,使用双列直插PID-40 的封装。 2.3.2 AT89C52最小系统组成 AT89C52最小系统由AT89C52芯片、复位电路和时钟电路组成。复位电路和时钟电路是维持单片机最小系统运行的基本模块。时钟电路采用12M晶振组成。复位电路通常分为两种:上电复位和手动复位。有时系统在运行过程中出现程序跑飞的情况,在程序开发过程中,经常需要手动复位,所以本次设计选用手动复位。 图2 AT89C52最小系统图 2.4输入模块 正转、反转、停止、加速、减速、清除数据六个按钮分别与单片机的 P1.0、P1.1、P1.2、P1.3、P1.4、P1.5相连,然后再与地相连,当按钮被按下时51芯片管脚电压被拉低,检测管脚电平实现按钮检测。正转实现直流电机的正转,反转实现直流电机的反转,停止实现直流电机的停转,加速实现直流电机的加速,减速实现直流电机的减速,清除数据实现瓶子数量和箱子数量的清除,具体输入模块如下: 图3 按键输入模块 2.5 LCD1602显示模块 2.5.1 LCD1602简介 点阵图形式液晶由M×N个显示单元组成,假设LCD显示屏有64行,每行有128列,每8列对应1字节的8位,即每行由16字节,共16×8=128个点组成。显示屏上64×16个显示单元与显示RAM区的1024字节相对应,每一字节的内容与显示屏上相应位置的亮暗对应。例如显示屏第一行的亮暗由RAM区的000H~00FH的16字节的内容决定,当(000H)=FFH时,屏幕左上角显示一条短亮线,长度为8个点;当(3FFH)=FFH时,屏幕右下角显示一条短亮线;当(000H)=FFH,(001H)=00H,(002H)=00H…,(00EH)=00H,(00FH)=00H时,在屏幕的顶部显示一条由8条亮线和8条暗线组成的虚线。这就是LCD显示的基本原理。 字符型液晶显示模块是一种专门用于显示字母、数字和符号等的点阵式LCD,目前常用16×1,16×2,20×2和40×2等的模块。一般的LCD1602字符型液晶显示器的内部控制器大部分为HD44780,能够显示英文字母、阿拉伯数字、日文片假名和一般性符号。 2.5.2 LCD1602连接与控制 LCD1602显示模块与单片机P2.5、P2.6、P2.7以及P0口连接,通过单片机编写LCD控制子程序,实现LCD1602的数据传输和显示控制。 图4 转速显示模块 2.6 包装机控制模块 通过两片MAX487芯片连接构成485通信模块,通过单片机P3.0和P3.1实现单片机与MAX487芯片的串口通信传输数据,以实现包装机的启停控制。 通过51单片机自带的串口通讯实现连接,设置定时器1实现串口通讯的控制,定时器1设置工作于方式2,开启定时器的串口通信的相关寄存器,通过SBUF寄存器发送数据。 定时器1寄存器设置: TMOD=0x21;//定时器1工作于方式2 TL1=0xfa;//波特率设置为4800 TH1=0xfa;//波特率设置为4800 SCON=0x50;//串行口设置为方式1,REN置1时允许接收数据 PCON &= 0xef;//PCON寄存器设置 TR1=1;//开定时器1
图5 包装机控制模块
2.7 蜂鸣器控制模块 通过三极管控制电路的通断以实现蜂鸣器的鸣叫控制,实现包装机开动提醒。通过P1.6的通断时间控制蜂鸣器的鸣叫? 图6蜂鸣器控制模块 2.8电机驱动模块 由设计要求可知,电机为额定电压为48V的直流电机,PWM的频率为50HZ,电机控制的最高转速为450rpm,最低转速为50rpm。采用L6203芯片驱动直流电机,连接单片机的P3.0、P3.1、P3.7口,P3.0、P3.1分别控制电机的正反转,P3.7控制L6203芯片的通断。当P3.0=1,P3.1=0时,电机正转,当P3.0=0,P3.1=1时,电机反转。为了控制直流电机的转速,为1的单片机I/O口采用PWM控制的方法控制电机的电压,以控制电机的转速。 PWM的实现:通过单片机的定时中断,实现频率为50HZ,即周期接近0.02s的PWM。为了实现占空比控制,将中断的时间设置为.1ms,通过20次的中断实现以频率为50HZ。 中断的初值: ;// 1ms中断 ; 转速计算:转速 = 占空比*500 图7电机驱动模块
2.9瓶子检测模块 由于PROTUES没有光电传感器的仿真模型,只能使用光耦模拟瓶子经过是遮住光电传感器,通过单片机P1.7口检测瓶子经过时的电平拉高,实现瓶数计数。 图8 瓶子检测模块 3. 程序设计 3.1主程序:
- ///*************************************************************************
- /// 工业生产中的产品数量自动计量系统创新设计
- ///功能:流水线电机控制,产品数量检测,LCD1602显示以及包装机控制
- ///*************************************************************************
- #include<reg52.h> ///包含头文件
- #include<MAIN.h>
- #include<lcd1602.h>
-
- //#define uint unsigned int
- //#define uchar unsigned char
- //#define ulong unsigned long
-
- sbit zheng = P1^0;
- sbit fan = P1^1;
- sbit ting = P1^2;
- sbit jia = P1^3;
- sbit jian = P1^4;
- sbit clear = P1^5;
- sbit bee = P1^6;
- sbit pingzi = P1^7;
- sbit PWM1 = P2^0;
- sbit PWM2 = P2^1;
- sbit ena = P2^2;
- sbit max = P2^3;
-
-
- uint bottle=0;
- uint box=0;
- uint zhuansu[4]={0,0,0,0};
- uint PZ[4]={0,0,0,0};
- uchar str1[16]="bottle:00 box:00";
- uchar str2[16]="speed:0000 ";
- uchar time;
- uchar count;
- ulong zhuan;
- flag=1;
-
- ///*************************************************************************
- /// MAIN函数
- ///功能:
- ///*************************************************************************
- void main()
- {
- timer_init();
- LCD_Init();
- ena=0;
- bee=0;
- max=1;
- while(1)
- {
- cleardate();
- zhengz();
- fanz();
- tingz();
- jias();
- jians();
- LCD();
- pingshu();
-
- }
- }
- ///*************************************************************************
- /// 延时函数
- ///功能:
- ///*************************************************************************
- void delay1(uint z)// 延时程序,zms.
- {
- uint x,y;
- for(y=z;x>0;x--)
- for(y=110;y>0;y--);
- }
-
-
- ///*************************************************************************
- /// 数据计算函数
- ///功能:
- ///*************************************************************************
- void chuli()
- {
-
- zhuan=count*500/20;
- zhuansu[0]=(count*10/1000); //转换转速的千位
- zhuansu[1]=(zhuan/100%10); //转换转速的百位
- zhuansu[2]=(zhuan/10%10); //转换转速的十位
- zhuansu[3]=(zhuan%10); //转换转速的个位
- PZ[0]= (bottle/10%10); //瓶数十位
- PZ[1]= (bottle%10);//瓶数个位
- PZ[2]= (box/10%10);// 箱数十位
- PZ[3]= (box%10); // 箱数个位
-
- }
-
- ///*************************************************************************
- /// 清除数据函数
- ///功能:
- ///*************************************************************************
- void cleardate()
- {
- if(clear==0)
- {
- delay1(2);
- if(clear==0)
- {
- LCD_Clear();
- LCD_Init();
- bottle=0;
- box=0;
- chuli();
- }
- }
- }
-
-
-
- ///*************************************************************************
- /// LCD显示函数
- ///功能:
- ///*************************************************************************
- void LCD()
- {
- LCD_Manifest(1,7,PZ[0]);
- LCD_Manifest(1,8,PZ[1]);
- LCD_Manifest(1,14,PZ[2]);
- LCD_Manifest(1,15,PZ[3]);
-
- LCD_Manifest(2,6,zhuansu[0]);
- LCD_Manifest(2,7,zhuansu[1]);
- LCD_Manifest(2,8,zhuansu[2]);
- LCD_Manifest(2,9,zhuansu[3]);
-
- }
- ///*************************************************************************
- /// 蜂鸣器控制函数
- ///功能:
- ///*************************************************************************
- void beebee()
- {
- bee=0;
- delay(100);
- bee=1;
- delay(100);
- bee=0;
-
- }
-
- //*************************************************************************
- /// rs485发送
- ///功能:
- ///*************************************************************************
- void rs485send(uchar date) //rs485发送
- {
- SBUF=date;
- while(!TI);
- TI=0;
- }
-
- void rs485open() //包装机rs485开启指令
- {
- rs485send((uchar)0xAA);
- delay1(100);
- rs485send((uchar)0x33);
- delay1(100);
- rs485send((uchar)0xDD);
- delay1(100);
- }
-
- void rs485stop() //包装机rs485停止指令
- {
- rs485send((uchar)0xAA);
- delay1(100);
- rs485send((uchar)0x55);
- delay1(100);
- rs485send((uchar)0xFF);
- delay1(100);
- }
-
- ///*************************************************************************
- ///流水线控制
- ///功能:流水线瓶子数量测量,箱数测量及包装机控制
- ///*************************************************************************
-
- void pingshu()
- {
- if(pingzi==1)
- {
- delay1(2);
- if(pingzi==1)
- {
- bottle+=1;
- if(bottle>51)
- {
- ulong i;
- beebee();
- bottle=1;
- if(box<=99) {box+=1;}
- else box=0;
- delay1(100);
- rs485open();
- for(i=0;i<1000;i++)
- {delay1(200);}
- rs485stop();
- }
- chuli();
- }
- while(!pingzi);
- }
- }
-
-
- ///*************************************************************************
- ///按键输入模块
- ///功能:实现正转,反转,启停,加速,减速、清除数据
- ///*************************************************************************
- void zhengz()
- {
- if(zheng==0)
- {
- delay1(2);
- if(zheng==0)
- {
- flag=1;
- }
- while(!zheng);
- }
- }
-
- void fanz()
- {
- if(fan==0)
- {
- delay1(2);
- if(fan==0)
- {
- flag=0;
- }
- while(!fan);
- }
- }
-
- void tingz()
- {
- if(ting==0)
- {
- delay1(2);
- if(ting==0)
- {
- ena=~ena;
- if(ena==0)
- {
- count=0;
- }
- else count=10;
- chuli();
- }
- while(!ting);
- }
- }
-
- void jias()
- {
- if(jia==0)
- {
- delay1(2);
- if(jia==0)
- {
- if(count<18)
- {
- count+=2;
- }
- else
- {
- count=18;
- }
- chuli();
- }
- while(!jia);
- }
- }
-
- void jians()
- {
- if(jian==0)
- {
- delay1(2);
- if(jian==0)
- {
- if(count>2)
- {
- count-=2;
- }
- else
- {
- count=2;
- }
- chuli();
- }
- while(!jian);
- }
- }
- ///*************************************************************************
- /// 定时器0初始化
- ///功能:
- ///*************************************************************************
- void timer_init(void)
- {
- TMOD=0x21;//定时器0工作于方式1,定时器1工作于方式2
- TH0=(65536-1000)/256;//1ms中断
- TL0=(65536-1000)%256;
- TL1=0xfa;//波特率设置为4800
- TH1=0xfa;//波特率设置为4800
- SCON=0x50;//串行口方式设置为方式1,REN置1时允许接收数据
- PCON &= 0xef;//PCON寄存器设置
- TR0=1;
- TR1=1;
- ET0=1;
- EA=1;
- }
-
- ///*************************************************************************
- /// 定时器0中断程序
- ///功能:
- ///*************************************************************************
- void timer0_int(void) interrupt 1
- {
- TR0=0;//设置定时器初值期间,关闭定时器
- TH0=(65536-1000)/256;//1ms中断
- TL0=(65536-1000)%256;
- TR0=1;
- time++;
- if(flag==1)// 电机正转
- {
- PWM2=0;
- if(time<count)
- {
- PWM1=1;
- }
- else
- PWM1=0;
- if(time>20)
- {
- time=0;
- }
- }
- else // 电机反转
- {
- PWM1=0;
- if(time<count)
- {
- PWM2=1;
- }
- else
- PWM2=0;
- if(time>20)
- {
- time=0;
- }
- }
- }
-
- 3.2 LCD1602子程序:
- ///*************************************************************************
- /// LCD1602子程序
- ///功能:实现LCD1602的控制程序集成
- ///*************************************************************************
- #include<lcd1602.h>
-
-
- sbit LCD_RS=P2^6;//数据命令选择端
- sbit LCD_WR=P2^5;//数据读写端
- sbit LCD_E=P2^7;//液晶使能端
-
-
- void delay(uchar z)//延时函数
- {
- unsigned char x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
-
- void LCD_Write_Cmd(uchar com)//液晶写命令
- {
- LCD_RS=0;//选择写命令模式
- LCD_WR=0;
- delay(1);
- LCD_E=1;//使能端给一高脉冲,高脉冲有效
- delay(1);
- LCDdate=com;//将要写的命令字送到数据总线上
- delay(1);
- LCD_E=0;
- }
-
- void LCD_Write_Data(uchar date)//数据写命令
- {
- LCD_RS=1;//选择写数据模式
- LCD_WR=0;
- delay(1);
- LCD_E=1;//使能端给一高脉冲,高脉冲有效
- delay(1);
- LCDdate=date;
- delay(1);
- LCD_E=0;
- }
-
- void LCD_Clear(void) // 清屏函数
- {
- LCD_Write_Cmd(0x01);
- delay(5);
- }
-
- void LCD_Init()//液晶初始化
- {
- uchar i;
- LCD_Write_Cmd(0x38);//设置16*2显示,5*7点阵,8位数据接口
- delay(5);
- LCD_Write_Cmd(0x08); //设置显示关闭
- LCD_Clear();//清屏
- LCD_Write_Cmd(0x06);//写一个字符后地址指针自动加1
- delay(5);
- LCD_Write_Cmd(0x0c);//设置开显示,不显示光标
- LCD_Write_Cmd(0x80);//数据指针定位到第一行第一个字处
- for(i=0;i<16;i++)
- LCD_Write_Data(str1[i]);//液晶显示第一行写数据
- LCD_Write_Cmd(0x80+0x40);//将数据指针定位到第二行第一个
- for(i=0;i<16;i++)
- LCD_Write_Data(str2[i]);//液晶显示第二行写数据
- }
-
- void LCD_Manifest(uchar row,uchar add,uchar date)
- {
- if(row==1) LCD_Write_Cmd(0x80+add);
- if(row==2) LCD_Write_Cmd(0xc0+add);
- LCD_Write_Data(0x30+date);
- }
复制代码
4. 系统仿真 4.1系统仿真图: 图9 系统仿真图 4.2 PCB图 图10 PCB图
4.3 3D视图
图11 3D视图 5. 元器件清单列表
6. 设计总结 设计之中,我遇到了很多现实的问题, PROTUES中的没有仿真模型,以及AD16软件中有些元件没有原理图和PCB封装,需要自己按照手册自己画出来,所以自己需要想办法进行模拟仿真,AD16没有的封装需要去网上寻找别人的设计的,实在找不到的只能自己画PCB。在10天的时间,经过查阅资料,发现拥有驱动48V3A的直流电机的芯片非常少,很不容易才找到了L6203芯片,但是也没能达到合适的要求,经过自己搭建H桥,但是三极管的查找花费了许多的时间。所以最终只能实现电机的启停控制,正反转控制,加减速控制,数据清除。在这次的设计中,发现一个简单的系统并不容易实现,需花费大量时间在查阅资料上面,并且最好将系统分成小块来一个一个解决,这样才能思路清晰,所以要加强自己的基础知识积累以及学习的方式方法。
全部资料51hei下载地址:
工厂自动化.zip
(588.75 KB, 下载次数: 43)
|