本方法采用测量一个转盘的转速间接地测出货车的速度,因此转盘要与货车的转轴相连,转盘的转速与车轴的转速成一定的关系。将转盘等分为四等份,在每等份的分界线上安装一块磁钢,如图1所示。
图1 测速硬件原理
霍尔开关的VCC端接5~12V直流电源,OUT端接到SPCE061A的IOB3(外部中断2输入口),另一端接公共地。每次磁钢经过霍尔开关下方时,OUT端都会产生一个脉宽的负脉冲。
4.2.2软件设计
软件采用C语言程序,定时采用低频定时器,用2Hz时基定时,定时周期为1s(定时时长0.5s),同时要用外部中断2对OUT脉计数。使用一个标志(signal)显示计时长度(第几个0.5s)。当signal为1时,启动外部中断计数;当signal为3时,关闭外部中断,同时关闭定时中断,完成一次计数。
(1)函数流程图分析
测速度模块主要由三个子函数组成:测速主函,定时中断子函数,外部中断子函数。
数测速函数是测速模块的主体,是主函数直接调用的子函数,流程图如图2所示。
图2 定时中断子函数流程图
为了能够及时地计下AH44E产生的每个负脉冲,必须采用外部中断计数。外部中断子函数流程图如图3所示。
图3 外部中断子函数流程图
定时子程序是用于给定准确的时间,以便能够计算出精准的速度,定时使用2Hz低频时基计时。定时中断子函数流程图如图4所示。
图4定时中断子函数流程图
(2)部分程序代码
unsigned int signal=0; //计时标志
unsigned int count=0; //计外部脉冲数
double speed(void)
{
unsigned int uiDelay=0xffff;
__asm("INT OFF"); //关闭中断
*P_INT_Ctrl=C_IRQ3_EXT2 | C_IRQ5_2Hz; //设置中断IRQ3_EXT1、IRQ5_2Hz
__asm("INT IRQ"); //开中断
while(uiDelay--)
*P_Watchdog_Clear = C_WDTCLR; //延时等待
uiDelay=0xffff;
while(uiDelay--)
*P_Watchdog_Clear = C_WDTCLR; //延时等待
return (double)count/(signal-1)*2; //计算速度
}
//中断服务子程序代码如下:
void IRQ5(void)
{
if(*P_INT_Ctrl&0x0004)
{
signal++;
if(signal==1){ count=0; //signal=1时计数开始
*P_IOB_Dir=0x00; //设IOB3为上拉电阻输入
*P_IOB_Attrib=0x00;
*P_IOB_Data=0x08;
} else if(signal==3) //signal=3时计数结束
(*P_INT_Ctrl)&=~(C_IRQ3_EXT2 | C_IRQ5_2Hz); //关IRQ3_EXT1、IRQ5_2Hz中断
*P_INT_Clear=C_IRQ5_2Hz; //清中断标志位
} else
{ //IRQ5_4Hz
*P_INT_Clear=0x0008; //清中断标志位
}
}
void IRQ3(void)
{
if(*P_INT_Ctrl&C_IRQ3_EXT1) //外部中断1
{ //IRQ3_Ext1
*P_INT_Clear=C_IRQ3_EXT1; //清中断标志位
}
else if(*P_INT_Ctrl&C_IRQ3_EXT2) //外部中断2
{ //IRQ3_Ext2
count++; //计数加1
*P_INT_Clear=C_IRQ3_EXT2; //清中断标志位
}
}