snifer

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

0
阅读(3599)

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

  图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;

}