课程设计直流电动机测速系统设计Word格式文档下载.docx
《课程设计直流电动机测速系统设计Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《课程设计直流电动机测速系统设计Word格式文档下载.docx(16页珍藏版)》请在冰豆网上搜索。
(3)撰写报告:
3.总体设计方案
总体设计方案的硬件部分详细框图如图一所示:
单片机
PWM电机驱动
数码管显示
按键控制
一、转速测量方法
转速是指作圆周运动的物体在单位时间内所转过的圈数,其大小及变化往往意味着机器设备运转的正常与否,因此,转速测量一直是工业领域的一个重要问题。
按照不同的理论方法,先后产生过模拟测速法(如离心式转速表)、同步测速法(如机械式或闪光式频闪测速仪)以及计数测速法。
计数测速法又可分为机械式定时计数法和电子式定时计数法。
本文介绍的采用单片机和光电传感器组成的高精度转速测量系统,其转速测量方法采用的就是电子式定时计数法。
对转速的测量实际上是对转子旋转引起的周期脉冲信号的频率进行测量。
在频率的工程测量中,电子式定时计数测量频率的方法一般有三种:
①测频率法:
在一定时间间隔t内,计数被测信号的重复变化次数N,则被测信号的频率fx可表示为
fx=Nt
(1)
②测周期法:
在被测信号的一个周期内,计数时钟脉冲数m0,则被测信号频率fx=fc/m0,其中,fc为时钟脉冲信号频率。
③多周期测频法:
在被测信号m1个周期内,计数时钟脉冲数m2,从而得到被测信号频率fx,则fx可以表示为fx=m1fcm2,m1由测量准确度确定。
电子式定时计数法测量频率时,其测量准确度主要由两项误差来决定:
一项是时基误差;
另一项是量化±
1误差。
当时基误差小于量化±
1误差一个或两个数量级时,这时测量准确度主要由量化±
1误差来确定。
对于测频率法,测量相对误差为:
Er1=测量误差值实际测量值×
100%=1N×
100%
(2)
由此可见,被测信号频率越高,N越大,Er1就越小,所以测频率法适用于高频信号(高转速信号)的测量。
对于测周期法,测量相对误差为:
Er2=测量误差值实际测量值×
100%=1m0×
100%(3)
对于给定的时钟脉冲fc,当被测信号频率越低时,m0越大,Er2就越小,所以测周期法适用于低频信号(低转速信号)的测量。
对于多周期测频法,测量相对误差为:
Er3=测量误差值实际测量值100%=1m2×
100%(4)
从上式可知,被测脉冲信号周期数m1越大,m2就越大,则测量精度就越高。
它适用于高、低频信号(高、低转速信号)的测量。
但随着精度和频率的提高,采样周期将大大延长,并且判断m1也要延长采样周期,不适合实时测量。
根据以上的讨论,考虑到实际应用中需要测量的转速范围很宽,上述的转速测量方法难以满足要求,因此,研究高精度的转速测量方法,以同时适用于高、低转速信号的测量,不仅具有重要的理论意义,也是实际生产中的需要。
二、转速测量原理
一般的转速长期测量系统是预先在轴上安装一个有60齿的测速齿盘,用变磁阻式或电涡流式传感器获得一转60倍转速脉冲,再用测频的办法实现转速测量。
而临时性转速测量系统,多采用光电传感器,从转轴上预先粘贴的一个标志上获得一转一个转速脉冲,随后利用电子倍频器和测频方法实现转速测量。
不论长期或临时转速测量,都可以在微处理器的参与下,通过测量转轴上预留的一转一齿的鉴相信号或光电信号的周期,换算出转轴的频率或转速。
即通过速度传感器,将转速信号变为电脉冲,利用微机在单位时间内对脉冲进行计数,再经过软件计算获得转速数据。
即:
n=N/(mT)
(1)
◆n———转速、单位:
转/分钟;
◆N———采样时间内所计脉冲个数;
◆T———采样时间、单位:
分钟;
◆m———每旋转一周所产生的脉冲个数(通常指测速码盘的齿数)。
如果m=60,那么1秒钟内脉冲个数N就是转速n,即:
n=N/(mT)=N/60×
1/60=N
(2)
◆通常m为60。
在对转速波动较快系统或要求动态特性好而精度高的转速测控系统中,调节周期一般很短,相应的采样周期需取得很小,使得脉冲当量增高,从而导致整个系统测量精度降低,难以满足测控要求。
提高采样速率通常就要减小采样时间T,而T的减小会使采到的脉冲数值N下降,导致脉冲当量(每个脉冲所代表的转速)增高,从而使得测量精度变得粗糙。
通过增加测速码盘的齿数可以提高精度,但是码盘齿数的增加会受到加工工艺的限制,同时会使转速测量脉冲的频率增高,频率的提升又会受到传感器中光电器或磁敏器或磁电器件最高工作频率的限制。
凡此种种因素限制了常规智能转速测量方法的使用范围。
而采用本文所提出的定时分时双频率采样法,可在保证采样精度的同时,提高采样速率,充分发挥微机智能测速方法的优越性及灵活性。
系统原理图
各部分模块的功能:
①传感器:
用来对信号的采样。
②放大、整形电路:
对传感器送过来的信号进行放大和整形,在送入单片机进行数据的处理转换。
③单片机:
对处理过的信号进行转换成转速的实际值,送入LED
④LED显示:
用来对所测量到的转速进行显示。
三、最小系统的设计
1、复位电路:
MCS-51
单片机复位电路是指单片机的初始化操作。
单片机启运运行时,都需要先复位,其作用是使CPU和系统中其他部件处于一个确定的初始状态,并从这个状态开始工作。
因而,复位是一个很重要的操作方式。
但单片机本身是不能自动进行复位的,必须配合相应的外部电路才能实现。
图1复位电路
2、晶振电路:
晶振(图2)是晶体振荡器的简称,在电气上它可以等效成一个电容和一个电阻并联再串联一个电容的二端网络,电工学上这个网络有两个谐振点,以频率的高低分其中较低的频率是串联谐振,较高的频率是并联谐振。
AT89C52单片机内部有一个用于构成振荡器的高增益反相放大器。
引脚XTAL1和XTAL2分别是此放大器的输入端和输出端。
这个放大器与作为反馈元件的片外晶体谐振器一起构成一个自激振荡器。
外接晶体谐振器以及电容C1和
C2构成并联谐振电路,接在放大器的反馈回路中。
对外接电容的值虽然没有严格的要求,但电容的大小会影响震荡器频率的高低、震荡器的稳定性、起振的快速性和温度的稳定性。
因此,此系统电路的晶体振荡器的值为12MHz,电容应尽可能的选择陶瓷电容,电容值约为30μF。
在焊接刷电路板时,晶体振荡器和电容应尽可能安装得与单片机芯片靠近,以减少寄生电容,更好地保证震荡器稳定和可靠地工作。
晶振有一个重要的参数,那就是负载电容值,选择与负载电容值相等的并联电容,就可以得到晶振标称的谐振频率。
图2晶振电路
3、电机控制部分:
(如下图)
图3:
控制电机部分
4、最小系统的仿真:
图4:
最小系统的仿真
5、总体电路图:
图五:
总体电路图
四、电机转速控制系统软件设计:
程序用C语言编写如下:
#include<
reg52.h>
///包含头文件
#defineunintunsignedint///自定义变量
#defineucharunsignedchar
sbitin1=P3^0;
///控制位定义
sbitin2=P3^1;
bitway=0;
//正反转标志位
uchartemp;
unintcount=0;
//计数定时中断累积次数
ucharcodezm[12]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x00};
///在程序存储区定义字型码表
ucharcodewm[4]={0xfe,0xfd,0xfb,0xf7};
///在程序存储区定义字位控制码表(千、百、十、个)
unintdisp_buf[4]={11,11,11,11};
///显示缓冲器
uninta;
///占空比控制字
unintspeedbuf;
///速度值
uninthigh1,low1,high2,low2;
voiddisplay();
///子函数声明
voidpwm_out();
voiddelays(ucharn);
voidspeedscan();
voidspeedscan()
{
if(count==500)
{
TR0=0;
speedbuf=(TH0*256+TL0)*60;
TH0=0;
TL0=0;
TR0=1;
}
}
voiddisplay()
ucharj;
speedbuf=a*4/10;
if(way)disp_buf[0]=10;
elsedisp_buf[0]=0;
disp_buf[1]=speedbuf/100%10;
disp_buf[2]=speedbuf/10%10;
disp_buf[3]=speedbuf%10;
for(j=0;
j<
4;
j++)
P2=wm[j];
P0=zm[disp_buf[j]];
delays(20);
voiddelays(ucharn)
uchari,j;
for(i=0;
i<
5;
i++)
n;
j++);
voidmain()
{
P0=0xff;
P2=0xff;
speedbuf=0;
in1=0;
///电机控制的初始化
in2=0;
a=950;
TMOD=0X15;
///定时器1为定时模式,使用方式2;
定时器0为计数模式,使用方式2
TH1=0Xfe;
///装定时器初值
TL1=0X0c;
///装计数器初值
EA=1;
///开总中断
ET0=1;
///允许定时器0中断
ET1=1;
///允许定时器1中断
///开计数器
TR1=1;
///开定时器
while
(1)
P1=0xff;
//拉高P1口电平,读数据
temp=P1;
if(temp>
0xEF)
{in1=0;
ET1=0;
}
else
{
ET1=1;
if(temp==0xEE)
{delays(40);
{in1=1;
in2=0;
way=0;
}
if(temp==0xED)
{in1=0;
in2=1;
way=1;
if(temp==0xEB)
{a=a+50;
if(a>
=950)
a=950;
if(temp==0xE