基于ADI的Blackfin 16/32-Bit Processor的大型货车超载超速实时检测系统-称重模块设计(原创)
0赞测重模块有硬件和软件部分,硬件部分负责采集车体重量数据和车体倾角数据,软件部分负责对数据进行预处理和处理,硬件部分这里不多介绍,主要说软件部分,对预处理数据的处理流程如下:
图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;
}