第一部分培训软件简介Proteus软件是英国Lab Center Electronics公司出版的EDA工具软件(该软件中国总代理为广州风标电子技术有限公司)。
它不仅具有其它EDA工具软件的仿真功能,还能仿真单片机及外围器件。
它是目前比较好的仿真单片机及外围器件的工具。
虽然目前国内推广刚起步,但已受到单片机爱好者、从事单片机教学的教师、致力于单片机开发应用的科技工作者的青睐。
Proteus是世界上著名的EDA工具(仿真软件),从原理图布图、代码调试到单片机与外围电路协同仿真,一键切换到PCB设计,真正实现了从概念到产品的完整设计。
是目前世界上唯一将电路仿真软件、PCB设计软件和虚拟模型仿真软件三合一的设计平台,其处理器模型支持8051、HC11、PIC10/12/16/18/24/30/DsPIC33、AVR、ARM、8086和MSP430等,2010年又增加了Cortex和DSP系列处理器,并持续增加其他系列处理器模型。
在编译方面,它也支持IAR、Keil和MATLAB等多种编译器。
Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。
Keil提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(μVision)将这些部分组合在一起。
运行Keil软件需要WIN98、NT、WIN2000、WINXP等操作系统。
如果你使用C语言编程,那么Keil几乎就是你的不二之选,即使不使用C语言而仅用汇编语言编程,其方便易用的集成环境、强大的软件仿真调试工具也会令你事半功倍。
第二部分培训项目实例培训项目一:基于单片机的步进电动机控制器的设计项目要求:采用单片机对步进电机进行控制,包括正转、反转、加速、减速和停止,同时采用液晶显示屏显示步进电动机的运行情况。
培训目的:1.掌握步进电机的工作原理;步进电机是将电脉冲信号转变为角位移或线位移的开环控制元步进电机件。
在非超载的情况下,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度。
可以通过控制脉冲个数来控制角位移量,从而达到准确定位的目的;同时可以通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。
当电流流过定子绕组时,定子绕组产生一矢量磁场。
该磁场会带动转子旋转一角度,使得转子的一对磁场方向与定子的磁场方向一致。
当定子的矢量磁场旋转一个角度。
转子也随着该磁场转一个角度。
每输入一个电脉冲,电动机转动一个角度前进一步。
它输出的角位移与输入的脉冲数成正比、转速与脉冲频率成正比。
改变绕组通电的顺序,电机就会反转。
所以可用控制脉冲数量、频率及电动机各相绕组的通电顺序来控制步进电机的转动。
通常见到的各类电机,内部都是有铁芯和绕组线圈的。
绕组有电阻,通电会产生损耗,损耗大小与电阻和电流的平方成正比,这就是我们常说的铜损,如果电流不是标准的直流或正弦波,还会产生谐波损耗;铁心有磁滞涡流效应,在交变磁场中也会产生损耗,其大小与材料,电流,频率,电压有关,这叫铁损。
铜损和铁损都会以发热的形式表现出来,从而影响电机的效率。
步进电机一般追求定位精度和力矩输出,效率比较低,电流一般比较大,且谐波成分高,电流交变的频率也随转速而变化,因而步进电机普遍存在发热情况,且情况比一般交流电机严重。
步进电机在结构上也是由定子和转子组成,可以对旋转角度和转动速度进行高精度控制。
当电流流过定子绕组时,定子绕组产生一矢量磁场,该矢量场会带动转子旋转一角度,使得转子的一对磁极磁场方向与定子的磁场方向一着该磁场旋转一个角度。
因此,控制电机转子旋转实际上就是以一定的规律控制定子绕组的电流来产生旋转的磁场。
每来一个脉冲电压,转子就旋转一个步距角,称为一步。
根据电压脉冲的分配方式,步进电机各相绕组的电流轮流切换,在供给连续脉冲时,就能一步一步地连续转动,从而使电机旋转。
电机将电能转换成机械能,步进电机将电脉冲转换成特定的旋转运动。
每个脉冲所产生的运动是精确的,并可重复,这就是步进电机为什么在定位应用中如此有效的原因。
通过电磁感应定律我们很容易知道激励一个线圈绕组将产生一个电磁场,分为北极和南极,见图1所示。
定子产生的磁场使转子转动到与定子磁场对直。
通过改变定子线圈的通电顺序可使电机转子产生连续的旋转运动。
2. 掌握控制器硬件组成及原理;本设计的硬件电路只要包括控制电路、最小系统、驱动电路、显示电路四大部分。
最小系统只要是为了使单片机正常工作。
控制电路只要由开关和按键组成,由操作者根据相应的工作需要进行操作。
显示电路主要是为了显示电机的工作状态和转速。
驱动电路主要是对单片机输出的脉冲进行功率放大,从而驱动电机转动。
根据系统的控制要求,控制输入部分设置了顺时针控制,逆时针控制,加速控制,减速控制和停止按键。
控制电路如图2所示。
当按下按键,内部程序检测P0.1-P0.4的状态变化来调用相应的启动和换向程序,从而实现系统的电机的启动和正反转控制。
根据步进电机的工作原理可以知道,步进电机转速的控制主要是通过控制通入电机的脉冲频率,从而控制电机的转速。
对于单片机而言,主要的方法有:软件延时和定时中断在此电路中电机的转速控制主要是通过定时器的中断来实现的,该电路控制电机加速度主要是通过按键的断开和闭合,从而控制外部中断。
根据按键次数,改变速度值存储区中的数据(该数据为定时器的中断次数),这样就改变了步进电机的输出脉冲频率,从而改变了电机的转速。
图1 激励线圈产生电磁场图2 控制电路原理图单片机最小系统或者称为最小应用系统,就是用最少的元件组成的单片机可以工作的系统,对51系列单片机来说,最小系统一般应该包括:单片机、复位电路、晶振电路。
复位电路:使用了独立式键盘,单片机的P1口键盘的接口。
该设计要求只需4个键对步进电机的状态进行控制,但考虑到对控制功能的扩展,使用了6路独立式键盘。
复位电路采用手动复位,所谓手动复位,是指通过接通一按钮开关,使单片机进入复位状态,晶振电路用22PF的电容和一12M晶体振荡器组成为整个电路提供时钟频率。
如图3示。
晶振电路:8051单片机的时钟信号通常用两种电路形式电路得到:内部震荡方式和外部中断方式。
在引脚XTAL1和XTAL2外部接晶振电路器(简称晶振)或陶瓷晶振器,就构成了内部晶振方式。
由于单片机内部有一个高增益反相放大器,当外接晶振后,就构成了自激振荡器并产生振荡时钟脉冲。
内部振荡方式的外部电路如图5示。
其电容值一般在5~30pf,晶振频率的典型值为12MHz,采用6MHz的情况也比较多。
内部振荡方式所得的时钟信号比较稳定,实用电路实用较多。
图3复位及时钟振荡电路本次设计用ULN2003来驱动步进电机,电路图如图4所示。
通过单片机的P2.0~P2.3输出脉冲到ULN2003的1B~4B口,经信号放大后从1C~4C口分别输出到电机的ABCD四相。
图4 步进电机驱动电路在该步进电机的控制器中,电机可以正反转,可以加速、减速,其中电机转速的等级分为十级,为了方便知道电机转速的等级,这里设计了电机转速和电机的工作状态的显示电路。
在显示电路中,主要是利用了单片机的P0口接一个两位的共阳极数码管。
数码管a、b、c、d、e、f、g、dp分别接P0.0~P0.7口.数码管的公共角1,2分别接p2.0,p2.1。
图5 步进电机显示电路把各个部分的电路图组合成总电路图,如图6所示。
图6 总体电路图3.掌握控制器的软件组成及原理;C语言程序如下:#include <reg52.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intuchar code ccw[]={0x08,0x04,0x02,0x01}; //逆时针旋转相序//uchar code cw[]={0x01,0x02,0x04,0x08}; //顺时针旋转相序//uchar code speed[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d};//uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,//0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//共阴极数码管显示表uchar code table_anode[]={ //共阳极0~f数码管编码0xc0,0xf9,0xa4,0xb0,//0~30x99,0x92,0x82,0xf8,//4~70x80,0x90,0x88,0x83,//8~b0xc6,0xa1,0x86,0x8e //c~f};uchar code ccw8[]={0x08,0x0c,0x04,0x06,0x02,0x03,0x01,0x09}; //8拍旋转相序表uint time,show1,show2,sym,temp,t,a,flag,i,j,rpm,n;sbit inc=P3^2;//加速sbit dec=P3^3;//减速sbit keyccw=P3^4;//逆时针转sbit keycw=P3^5;//顺时针转sbit pause=P3^6;//暂停sbit fir=P2^0;//第一数码管sbit sec=P2^1;//第二数码管void init();//初始化定时器0,1,串口void direc();//按键控制转向void speedctl();//按键控制转速void display();//速度显示函数void delaynms(uint aa);//1ms延时函数void main(){init();while(1){speedctl( );direc();display();}}void wind_init(){TMOD=0X21;//定时器1为方式2,定时器0为方式1TH1=0xFD;TL1=0xFD;TH0=(65536-1000)/256;//1毫秒定时中断TL0=(65536-1000)%256;TR1=1;//启动定时器1EA=1;//打开总中断ET0=1;//允许定时器0中断TR0=1;//启动定时器0}void speedctl(){if(inc==0) //加速{n++;if(n==11)while(!inc)display();time=0;}else if(dec==0) //减速{n--;if(n==0)n=1;while(!dec)display();time=0;}switch(n){case 1:t=937; //60/64转速一分钟一圈里面转一圈937ms,基准速度一分钟一圈rpm=1;break;case 2:t=312;rpm=3;break;case 3:t=187;rpm=5;break;case 4:rpm=7;break;case 5:t=104;rpm=9;break;case 6:t=85;rpm=11;break;case 7:t=72;rpm=13;break;case 8:t=62;rpm=15;break;case 9:t=55;rpm=17;break;case 10:t=49;rpm=19;break;}}void direc(){if(keyccw==0){flag=1;time=0;}else if(keycw==0){flag=2;time=0;}else if(pause==0)flag=0;}void display(){fir=1;sec=0;P0=table_anode[rpm/10];delaynms(17);fir=0;sec=1;P0=table_anode[rpm%10];delaynms(20);}void delaynms(uint aa){uchar bb;while(aa--){for(bb=0;bb<250;bb++); //1ms基准延时程序}}void timer0() interrupt 1{TH0=(65536-1000)/256;TL0=(65536-1000)%256;time++;if(flag==1)//逆时针转{if(time==t){time=0;P1=ccw[i];i++;if(i==4)i=0;}}else if(flag==2)//顺时针转{if(time==t){time=0;if(i>0)i--;else if (i==0)i=3;P1=ccw[i];}}}4.分析仿真结果。