snifer

基于ADI的Blackfin 16/32-Bit Processor的大型货车超载超速实时检测系统-称重模块设计(原创)

0
阅读(2841)

测重模块有硬件和软件部分,硬件部分负责采集车体重量数据和车体倾角数据,软件部分负责对数据进行预处理和处理,硬件部分这里不多介绍,主要说软件部分,对预处理数据的处理流程如下:

图1 数据处理流程

(1)预处理程序:

asm("INT OFF"); //A0口发送脉冲,A1口接收DOUT的数据,A2是转换完成标志位

*P_IOA_Dir=0x0001;

*P_IOA_Attrib=0x0001;

*P_IOA_Data=0x0002;

*P_INT_Ctrl=C_IRQ1_TMA;

*P_TimerA_Ctrl=C_SourceA_Fosc256+C_SourceB_1;

*P_TimerA_Data=0xFFFB; //

//Ltmp=*P_IOA_Data&0x0002;

while(*P_IOA_Data&0x0002);

delay();

asm("INT IRQ");

while(1)

{

*P_Watchdog_Clear = C_WDTCLR;

if(*P_IOA_Data&0x0004)//A2为输出数据完成标志位

{

asm("INT OFF");// IRQ_OFF();

dout=*P_IOA_Data>>4;//取A口高12位的数据

*P_IOA_Data=0x0002;//DOUT重新置数

while(*P_IOA_Data&0x0002);//等待DOUT高电平变为低电平

delay();//延迟函数

asm("INT IRQ");

}

}

}

void IRQ1(void)

{

if(k<=48)

{k++;

if(!(*P_IOA_Data&0x0002)) Ltmp++;

}

if(*P_IOA_Data&0x0001)//下降沿取DOUT

{

*P_IOB_Data=*P_IOB_Data+1;//记录产生一个脉冲

if((*P_IOB_Data<=12))//下降沿取DOUT

{

tmp=*P_IOA_Data&0xFFF0;//取A口的高12位

tmp=tmp<<1;

//如果DOUT为高电平则加1

if(*P_IOA_Data&0x0002)

tmp=tmp+0x0010;

*P_IOA_Data=(*P_IOA_Data&0x000f)+tmp;

}

if(*P_IOB_Data==25)

{

*P_IOA_Data=*P_IOA_Data|0x0004; //置标志位A2口

*P_IOB_Data=0x0000;

}

}

c_flag^= 0xFFFF; //电平标志寄存器取反

*P_IOA_Data=(c_flag&0x0001)|(*P_IOA_Data&0xFFF6);

*P_INT_Clear=C_IRQ1_TMA;

}

(2)主程序相关程序流程图

停止后超载处理流程图如图2:

相关说明:

标志K

K= -1 静止且不超载 K=0 初次静止超载

K=1 运动超载 K=2 停车后超载

countR 取数据次数

countW, 超载次数

v 车速度

m 车载重量

tR 车启动时间

tS 停车时间 图2 超载处理流程图

运动前超载处理程序图如图3:

运动中超载处理流程图如图.4:

相关说明:

标志K

K= -1 静止且不超载 K=0 初次静止超载

K=1 运动超载 K=2 停车后超载

countR取数据次数

countW, 超载次数

v 车速度

m 车载重量

tR 车启动时间

tS 停车时间

图3 运动前超载处理程序图 图4 运动中超载处理流程图

小车运动前超载处理程序如下:

Void BeforeTheStateDidNotExercise(float* parameter,float weight,int *countR,int *countW)

{ (*countR)++;

if(*countR>=17)

*countR=0;

if(weight>M)

{

(*countW)++;

if(*countW>=12)

{

*parameter=0;

*countW=0;

printf("报警函数 ");

}

}

}

运动前超载处理程序:

void campaignStatus(float* parameter,float weight,int *countR,int *countW,clock_t *start)

{

if(* parameter!=1)

(*countR)++;

//记录当前时间

momentNow();

*start=clock();

printf(" 记录当前时间t1");

if(weight>M)

(*countW)++;

if(*countR>=100)

{

if( *countW>=70)

{

printf("报警程序 ");

* parameter=1;

}

*countR=0;

*countW=0;

}

}

运动中超载处理:

void afterStoppingState(float* parameter,float weight,int *countR,int *countW,clock_t *finish)

{

(*countR)++;

//记录当前时间t2

*finish=clock();

if(weight>M)

(*countW)++;

if(*countR>=100)

{

if(*countW<30)

{*parameter=-1;

printf("发送相关信息到主机");

}

*countR=0;

*countW=0;

}

}

//根据速度和参数K和parameter确定车体状态

void carStatus(float speed,float* parameter,float weight,int *countR,int *countW)

{

//超载持续时间

clock_t start, finish;

double duration;

if(speed==0)

{

if(*parameter<=0)

BeforeTheStateDidNotExercise(parameter,weight,countR,countW);

else afterStoppingState(parameter,weight,countR,countW,clock_t &finish);

}

else campaignStatus(parameter,weight,countR,countW,clock_t &start);

//超重持续时间

duration = (double)(finish - start) / CLOCKS_PER_SEC;

printf( "%f seconds\n", duration );

}

//获取当前时间

int momentNow(void)

{

time_t t;

t=time(0);

local=localtime(&t);

printf(" %d-%d-%d\n%d:%d:%d\n",local->tm_year+1900,local->tm_mon,local->tm_mday,local->tm_hour,local->tm_min,local->tm_sec);

return 0;

}

Baidu
map