大型货车超载超速实时检测系统

时间:2014-04-18来源:网络

4.2.2软件设计

软件采用C语言程序,定时采用低频定时器,用2Hz时基定时,定时周期为1s(定时时长0.5s),同时要用外部中断2对OUT脉计数。使用一个标志(signal)显示计时长度(第几个0.5s)。当signal为1时,启动外部中断计数;当signal为3时,关闭外部中断,同时关闭定时中断,完成一次计数[30]

(1)函数流程图分析

测速度模块主要由三个子函数组成:测速主函,定时中断子函数,外部中断子函数。

数测速函数是测速模块的主体,是主函数直接调用的子函数,流程图如图4.3所示。

图4.6 测速函数流程图

定时子程序是用于给定准确的时间,以便能够计算出精准的速度,定时使用2Hz低频时基计时。定时中断子函数流程图如图4.4所示。

图4.7 定时中断子函数流程图

为了能够及时的计下AH44E产生的每个负脉冲,必须采用外部中断计数。外部中断子函数流程图如图4.5所示。

图4.8 外部中断子函数流程图

(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_Ctrl0x0004)

{

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

{

*P_INT_Clear=0x0008; //清中断标志位

}

}

void IRQ3(void)

{

if(*P_INT_CtrlC_IRQ3_EXT1) //外部中断1

{

*P_INT_Clear=C_IRQ3_EXT1; //清中断标志位

}

else if(*P_INT_CtrlC_IRQ3_EXT2) //外部中断2

{

count++; //计数加1

*P_INT_Clear=C_IRQ3_EXT2; //清中断标志位

}

}

图4.9 GPRS程序流程图

1 2 3 4 5 6 7 8 9 10 11 12 13

关键词: 超载检测 超速检测 霍尔开关 ARM9

加入微信
获取电子行业最新资讯
搜索微信公众号:EEPW

或用微信扫描左侧二维码

相关文章

查看电脑版