关键词: 单片机 转速测量 柴油机 消息
前言
柴油机的转速是一个较为重要的运行参数,也有很多种用于测量转速的仪表,如:机械软轴式转速表、频率-电压转换式转速表、数字式转速表等,它们中间有的成本很高而且精度较差、有的工艺复杂而且可靠性不高。本文介绍了一种利用单片机技术制成的智能转速表,不仅精度高、工艺简单、线路简洁,而且可靠性高、功能强。其不仅可以测量转速,而且可以统计机器运行的累计时间,当柴油机超速时,还可发出报警信号,切断油路,保护机器不发生飞车事故。
1 测量原理
在测量柴油机转速时我们采用了电磁感应式传感器,这种传感器可将转速信号转变成一个脉冲信号输出,而脉冲信号的频率与柴油机的转速是一种线性的正比关系。因此对柴油机转速的测量,实质上是对脉冲信号的频率的测量,可以采用闸门法进行测量。
2 线路设计
智能转速表的框图如图1所示
智能转速表主要由脉冲放大及整形电路、单片机(AT90S2313)、多路动态扫描LED显示电路和报警信号输出电路组成。
在设计中我们采用了ATMEL的AVR系列单片机中的AT90S2313,该单片机有如下特点:
(1) 片内有2K字节可在线编程(ISP编程)的FLASH存贮器。
(2) 片内有128字节SRAM和128字节EEPROM存贮器。
(3) 精简指令集结构单片机,尤其内部32个寄存器全部与ALU直接连接,突破传统瓶颈限制,每MHZ时钟具有1MIPS的性能。
(4) 内含带预分频的8位和16位的定时器各一个,16位定时器还具有捕捉、比较及PWM功能。
(5) 一个片内WatchDog定时器。
(6) 除具有普通UART串行口外,还具有高速SPI接口。
(7) AVR的输出端口可直接驱动LED。
AT90S2313的定时器0(8位)工作于定时器方式,用来产生定时闸门信号;而定时器1(16位)工作于计数器方式,对整形电路送来的脉冲信号进行计数;片内的EEPROM用于保存机器运行累计时间,在断电时可以保持数据不丢失。
3 程序设计
在AVR单片机的程序设计中,我们采用了ImageCraft的C语言编译器ICCAVR,并在单片机程序设计中引入了WINDOWS系统中消息的概念。主要程序流程图如图二所示。
主程序 中断服务程序
定时器0以中断方式工作,其负责采集定时器1 的计数值、对运行时间累计和发送消息。由于在仪表中对采集到的定时器1 的计数值,需要进行一些处理,如:判断是否超过额定速度、将16位二进制数转换成BCD码、为动态LED显示电路进行软件译码及扫描控制等等。如果所有工作全部放在中断程序中完成,就会导致中断服务程序执行时间过长。由于仪表还要完成运行时间的累计工作,尽管中断服务程序执行时间过长对转速的测量不会有太大影响,但势必会给时间累计造成过大的累积误差,影响累计时间的精度。为了解决这个问题,我们采取了下面的方法:
借鉴windows 编程的原理,在单片机编程中引入消息的概念,将中断产生的标志作为消息,而数据处理则放在消息循环中进行。在这个例子中中断服务程序中只进行数据的采集和标志位的设置(发送消息),而将数据的处理放到运行时间要求不很精确的中断服务程序之外的主程序循环中(消息循环)。这样一方面减少了中断服务程序的长度,缩短了中断服务程序执行的时间,提高了中断处理的实时性,另一方面又不影响数据的处理。从而很好地解决了数据采集的实时性和数据处理耗时多而影响时间累计之间的矛盾。
和PC机相比,单片机资源十分有限。因此,单片机系统不可能象windows系统那样建立庞大的消息循环机制,将消息分发给各个程序并行处理。在基于消息的单片机编程中,采取一种简化的方式,消息可以这样来定义:当某个事件(例如中断)发生时,事件处理程序(例如中断服务程序)设置相应的标志,不同的标志即代表不同的消息;而主程序所进行的消息循环就是主程序不断地判断这些标志,以决定启动哪一个处理函数(即将消息发送给特定的消息处理函数)。这种方法在多中断系统中使用,可以明显地提高中断的实时性;另外,由于在中断服务程序中不需要调用数据处理程序,也有效地防止了代码重入带来的问题。
如下面的T0中断服务程序,发送消息:
void timer0()
{
if (——timercount==0)
{
TCCR1B = 0x00;
count=TCNT1; //采集数据
second++; //运行时间累计
flag=1; //发送消息
WDR();
TCNT1H = 0x00;
TCNT1L = 0x00; //清除T1
TCCR1B = 0x06;
timercount=20;
}
TCNT0 = 76; //重装T0
}
而下面这段程序是主程序消息循环中一部分,对T0发送的消息进行检查,如果没有消息产生则跳过数据处理部分:
if (flag==1)//检查是否有消息产生
{
hextobcd(count);//16位二进制数转换成BCD码数
if (count>1134) //当转速超过1134转/分时,输出报警信号
{
asm("cbi 0x12,4");
}
else
{
asm ("sbi 0x12,4");
}
flag=0; //清除消息
}
4 总结比较
我们这个系列的转速表是在上一代转速表(采用AT89C2051单片机)的基础上改造过来的,经过比较我们认为AVR单片机有以下优点:
(1)AVR是一种功能强大、集成度较高的新型单片机。譬如在这个例子中,一片AT90S2313代替了AT89C2051、AT24C01(EEPROM)和外置WatchDog三片集成电路,从而大大地简化了装配工艺和流程。由于AT90S2313与AT89C2051单片机的管脚基本兼容,最终我们把前者做成为后者的增强型,在同一个转速表上可以做成两个版本的产品。
(2)AVR支持在线编程(ISP下载),对芯片的编程可以放在整机装配完成后进行。这样不仅节省了购买万用编程器的费用,而且为现场调试及以后的软件升级带来了极大的便利。
(3)AVR的运行速度快、处理能力强。在这个例子中,中断服务程序执行时间更短了,中断的实时性提高了,对时间累计的累积误差也变小了。
(4)AVR对采用C语言编程提供了较好的支持。当我们将原来用KEIL51写的程序转换成AVR的C程序时,只需要修改有关硬件操作部分和KEIL51中bit及sbit类型的数据操作,其余均不需修改。
另外,在单片机的编程中引入消息的概念,一方面提高了中断处理的实时性,另一方面也解决了中断服务程序中代码重入的问题。