其结构原理如下:
这样的机构虽然原理非常简单,设计也比较方便,但其缺点也是显而易见的。例如:
·机械接触式设计会影响被测件的正常工作,低速运转时会产生较大影响
·传动式结构使测量器件寿命变短,间接提高了产品价格,影响其市场占有率
·采用测速电机,增加了整个系统的成本降低了测量精度
·功率消耗大,无便携性可言
可见,这样的设计给市场推广带来了很大的阻碍,而且降低了测量精度。从而给很难占领市场。
相比之下本文介绍的智能转速计避免了老式转速计的以上缺点。采用光电测量的方法。
结构框图如下:
光电测量部分原理:
检测齿轮上有10个齿均匀分布在轮盘周围,并被直接固定在被测轴上,安装时光电耦合器的发光二极管和光敏三极管正对齿轮上的齿,当被测轴转动时带动检测齿轮转动,光电耦合器通过对检测齿轮上的齿进行耦合从而产生数字脉冲。脉冲经过放大送向单片机的计数端。
单片机部分工作原理:
本文采用的单片机为AT89C51,内有两个定时/计数器。在程序设计时笔者将T0定时/计数器作为1秒定时使用,将T1定时/计数器作对脉冲的计数器使用。单片机计数端在接收到脉冲后对脉冲进行计数,每隔1秒提取TH1和TL1中的计数数据,并进行相应的运算,对16进制数据进行处理,得到10进制数据,送显示缓存进行显示输出。
在对TH1和TL1数据整合处理时使用到了C程序中的结构和共用的概念
union
{ unsigned int word;
struct
{ unsigned char high;
unsigned char low;
} bytes;
} result;
…
result.bytes.high=TH1;
result.bytes.low=TL1;
counter=result.word;
这样一来就可以把两个无符号字符型变量数据按高低字节合并成一个整型变量来处理了。在本文中四位7段LED能够显示0~9999的数值,根据下文提供的计数值与转速之间的关系可确定计数值范围必须达到0~1667,很显然这样的数据通过字节来处理是非常不方便的,但如果通过上述方法转化成整型变量来处理值域变为0~65535,足以容纳0~1667中的任何一个整型数值。
具体计数值与转速之间的数学关系如下:
转速(round/minute)=
并将转速值通过动态扫描电路和程序显示在4位7段LED数码管上。
其优点如下:
·采用单片机控制,精度高,稳定性好,测量范围大
·功率小,易于提高其便携性能,突出产品优势
·产品成本低廉,整套系统价格不超过15元人民币
·抗干扰能力强,可避免外界电磁干扰和其他干扰因素的影响
·非接触式测量,采用光电器件测量,无连接轴,对被测件无任何影响,提高测量精度
·电子式测量方法缩小整个系统的体积,使便携式产品的开发更具可操作性
·非机械式测量方法,采用电子器件,提高设备的寿命,间接降低成本
通过以上比较不难看出智能转速计不管从成本上、精度上还是便携性能上都比原有的机电式设备好得多。从市场开发的角度来看各方面都比较出色。
该产品通过改进还可以做成出租车里程计、水文监测以及气象监测的有关仪器仪表。
#include "reg51.h"
#define uchar unsigned char
#define uint unsigned int
uchar code disptab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar code bittab[]={0x01,0x02,0x04,0x08};
uchar data dispbuf[]={0,0,0,0};
void main(void)
{
void disp();
EA=1;ET0=1;
TMOD=0x51;
TH0=0x3c;TL0=0xb0;
TR0=1;TR1=1;
for(;;)
{
disp();
}
}
void disp(void)
{
uchar i,deley;
for(i=0;i<4;i++)
{P1=bittab[i];
P2=disptab[dispbuf[i]];
for(deley=0;deley<200;deley++);
}
}
void timer(void) interrupt 1 using 1
{
static uchar i;
uint counter;
union
{uint word;
struct
{uchar high;
uchar low;
} byte;
} result;
TH0=0x3c;TL0=0xb0;
i++;
if(i==10)
{result.byte.high=TH1;
result.byte.low=TL1;
counter=result.word;
counter*=6;
dispbuf[0]=counter%10;
dispbuf[1]=counter%100/10;
dispbuf[2]=counter%1000/100;
dispbuf[3]=counter/1000;
}
}