上海妇科疾病研究所 上海女性不孕医院 上海引产医院 无痛引产痛不痛 上海人流医院 白癜风治疗医院 上海小儿脑瘫医院 上海女子医院
基于ADI的Blackfin 的大型货车超载超速实时检测系统-称重模块设计-Blackfin-技术中心-国内专业ADI仿真器,Blackfin开发板,DSP芯片,软件算法,解决方案提供商-北京四维卓信电子有限公司
用户名: 密码:
主页 设为首页 加入收藏
      产品中心       技术中心       下载中心        社区新闻        诚聘英才       大学计划        关于我们       技术论坛
  您的当前位置:ADSP开源社区 >> 技术中心 >> Blackfin 今天是:
技术中心  
SigmaDSP
SHARC
A2B音频总线
Blackfin
ADI操作系统
ADSP-218X
TigerSAHRC
ADI DSP仿真器
产品导航
ADI DSP仿真器
SigmaDSP开发板
ADI A2B总线开发板
SHARC DSP开发板
销售网络
Blackfin  
基于ADI的Blackfin 的大型货车超载超速实时检测系统-称重模块设计
[ 作者: ] [ 来源:ADSP开源社区 ] [ 发布时间:2011-11-22 ]
测重模块有硬件和软件部分,硬件部分负责采集车体重量数据和车体倾角数据,软件部分负责对数据进行预处理和处理,硬件部分这里不多介绍,主要说软件部分,对预处理数据的处理流程如下:

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

}

联系我们 | 关于我们 | 免责声明 | 诚征英才 | 友情链接
Copyright 2019 All rights reserved  本网页版权属Open ADSP所有
北京海淀区中关村大街32号新中发市场3659 邮编100100
电话 18611096839 
粤ICP备14035876号-1