智能车制作

 找回密码
 注册

扫一扫,访问微社区

12
返回列表 发新帖
楼主: 夏沫Shannon
打印 上一主题 下一主题

摄像头组

[复制链接]

14

主题

232

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2184
威望
970
贡献
544
兑换币
603
注册时间
2015-10-20
在线时间
335 小时
毕业学校
菏泽学院
11#
发表于 2017-3-30 20:34:59 | 只看该作者
夏沫Shannon 发表于 2017-3-30 19:08
总体的程序写好了,但是运行的时候总会出现问题,程序没错,但是有时候电机不转,有时候是舵机没反应.现在 ...

程序有漏洞,你需要把你写的程序贴上来才好给你解答。根据你文字描述卡死,应该是你采集上出错了你上程序就有人帮你解答了。
回复 支持 反对

使用道具 举报

13

主题

36

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
398
威望
213
贡献
101
兑换币
117
注册时间
2017-2-8
在线时间
42 小时
12#
 楼主| 发表于 2017-3-30 21:09:22 | 只看该作者
void main(void)
{   
  DisableInterrupts;   //禁止总中断
  uart_init (UART3 , 115200);//串口初始化 串口:UART0 波特率:115200
  //uart_init (UART5 , 115200);//串口初始化 串口:UART0 波特率:115200
  //  pit_init_ms(PIT0,5); //周期中断定时器PIT0 定时5ms  
  //  set_irq_priority((INT_PIT0+INC_IRQ),2);//设置中断优先级 2
  //  setIRQadrr(INT_PIT0,PIT0_IRQHandler);  //设置PIT1定时器中断地址函数
  
  OLED_Init();    //OELD显示
  
  OV7725_INC();                            //设置行场中断
  IICWriteGpio_inintOV();                  //设置SCCB引脚
  while((ov7725_probe()==0));          //初始化寄存器
  ov7725_set_image_size(H_80_W_60);       //设置图像大小
  PWM_peizhi();
// zhengzhuan_dj(400,400);

  
  EnableInterrupts;   //开启总中断  
  for(;;)
  {
   
     //COMS_print();   //串口发数及显示
    //  OledPrint(80,40,100,(uint8 *)Buffer);
   // EnableInterrupts;
    zhengzhuan_dj(400,400);
    vedge();
   imageProc();
   
   //  xianshi();
  }
}
这是主程序的一段,舵机一直好着,有时候电机转,有时候不转,但是不加其他程序时电机就好着.而且有时候程序会卡到寄存器配置的地方,不知道这是什么问题,求高数赐教
回复 支持 反对

使用道具 举报

13

主题

36

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
398
威望
213
贡献
101
兑换币
117
注册时间
2017-2-8
在线时间
42 小时
13#
 楼主| 发表于 2017-3-30 21:13:51 | 只看该作者
编译的时候也无错,但是就感觉程序整合不到一起,下面是主函数前面的子函数,高手帮忙看一下,被这个问题困扰太久了
#include "include.h"  // Include.h 包含用户自定义的头文件
#include  "Landzo_Calculation.h"

/***********************定义变量***************************/
uint8 TIME0flag_5ms=0;
uint8 TIME0flag_10ms=0;
uint8 TIME0flag_20ms=0;
uint8 TIME0flag_50ms=0;
uint8 TIME0flag_80ms=0;
uint8 TIME0flag_100ms=0;
uint8 TIME0flag_1s =0;
uint8 TIME1flag_20ms=0;

uint8 adCHE ;
uint8 let[128] ={0};
uint8 Pixel[128];
uint8 Pixel2[128];
uint8 Pixel3[128];
extern uint8 USART_RX_BUF[USART_REC_LEN];     //接收缓冲,最大USART_REC_LEN个字节.
extern uint16 USART_RX_STA;   


extern  uint8  DMA_Over_Flg ;            //采集完成标志位
extern  uint8  LinADCout ;
extern  uint8_t  LandzoRAM[ ];
extern  vuint8 key5,key4,key3,key2,key1 ;
/*****************颜色值*********************/
#define black 0
#define white 1
#define line 80               
#define hang 60
#define lilun 40               //摄像头理论中心位置60

int32 left,right,mid,leftblack,rightblack;   
int32 Imagesum;
int32 Imageave;
int32 error0=0,error1=0,error;
uint16 LinCout =0;
uint8 Atem8B0 = 0 ;
uint8 ALineOverCout = 0 ;                 //采集完成黑线行数
uint8 ALineCal = 0 ;         
uint8 ADdata[DATALINE][DATACOUNT] ={0} ;        //黑线AD数组存储
uint8 Buffer[hang][line]={0};                       //解压后的数组
uint16 Atemp0 ;
uint8  checkflg = 0 ;     
uint16 i=0,j=0;
uint8  ii ;
uint8 steer_turn;
uint16  black_zuo[line],black_you[line];   //只能看到一条线时的数组
uint8 left_flag [30]={0},right_flag[30]={0};
uint16  Line_Center[60];       //计算出来的中线值存放数组
uint16 lineable=0;       //有效行
uint16 temp=0;
uint8 zuo,  you;
uint8 hang1=20,line1=20;
uint8 err_cnt;
uint8 Road_mid[ hang ][line]={0,0};//赛道中心 【显示用】
int32 search_end_flg=0;
int32 controler_steer;  
vuint8 right_lose=1;
vuint8 left_lose=1;
/***************image process***************************/

int8 err[ 60 ]={0};
int8 slop1;//斜率
int8 slop2;//
int8 slop_add;//


#define STEER_LEFT 166//100 左极限
#define STEER_RIGHT 130//50 右极限
#define STEER_CENTER 145  //舵机中值


vuint8 H_youwan=0,H_zuowan=0,L_youwan=0,L_zuowan=0;

/******************加速度模块变量****************/
uint16 AAngleAcce[6] ;
uint8  AangleCount ;
/****************速度变量****************/
int16 speedcout1,speedcount2 ;
extern SPEEDCOUT speed1[10],speed2[10];
extern uint8  turncount1 ,turncount2  ;
extern vuint8 LPT_INT_count ;  //速度2的count
extern vuint8 DMA_count_Flg  ; //速度1的count
extern vint16 DMALastValue;

float ultrlen ;
extern int32 ultrtime;
/***********************图像处理的行数***************************/

uint8 table[20]={3,6,9,12,15,18,
                 21,24,27,30,33,
                 36,39,42,45,48,
                 51,54,57,60};
//将图像解压扩张
void Imge_Extend()  //字节扩张,1字节8位,以位显示
{
   uint8 i,j;
  for(i=0;i<=60;i++)
    {
              for(j=0;j<DATACOUNT;j++)
                 {
                         if(ADdata[i][j]&0x80) Buffer[i][j*8+0]=0;
                         else Buffer[i][j*8+0]=1;
                         if(ADdata[i][j]&0x40) Buffer[i][j*8+0]=0;
                         else Buffer[i][j*8+0]=1;
                         if(ADdata[i][j]&0x20) Buffer[i][j*8+0]=0;
                         else Buffer[i][j*8+0]=1;
                         if(ADdata[i][j]&0x10) Buffer[i][j*8+0]=0;
                         else Buffer[i][j*8+0]=1;
                         if(ADdata[i][j]&0x08) Buffer[i][j*8+0]=0;
                         else Buffer[i][j*8+0]=1;
                         if(ADdata[i][j]&0x04) Buffer[i][j*8+0]=0;
                         else Buffer[i][j*8+0]=1;
                         if(ADdata[i][j]&0x02) Buffer[i][j*8+0]=0;
                         else Buffer[i][j*8+0]=1;
                         if(ADdata[i][j]&0x01) Buffer[i][j*8+0]=0;
                         else Buffer[i][j*8+0]=1;                    
                 }
    }
}
/*****************PWM波的配置*****************************/
void PWM_peizhi(void)
{
  
  FTM_PWM_init(FTM1, CH1 , 100,145);                           //舵机占空比设置初始化   MOD =19531 ;
  
  FTM_PWM_init(FTM0 , CH0, 80000,0);                        //电机占空比设置初始化   MOD =313 ;  占空比 = duty /(MOD +1 ) ;FTM_CnV_REG(FTMx[ftmn], ch) = cv;
  FTM_PWM_init(FTM0 , CH1, 80000,0);                        //电机占空比设置初始化   MOD =313 ;  占空比 = duty /(MOD +1 ) ;FTM_CnV_REG(FTMx[ftmn], ch) = cv;
  FTM_PWM_init(FTM0 , CH2, 80000,0);                        //电机占空比设置初始化   MOD =313 ;  占空比 = duty /(MOD +1 ) ;FTM_CnV_REG(FTMx[ftmn], ch) = cv;
  FTM_PWM_init(FTM0 , CH3, 80000,0);                        //电机占空比设置初始化   MOD =313 ;  占空比 = duty /(MOD +1 ) ;FTM_CnV_REG(FTMx[ftmn], ch)
}
/*************舵机打中***********************/
void duoji(uint16 dj )
{ steer_turn=dj;
FTM_PWM_Duty(FTM2, CH0,steer_turn);  
}
/*************电机正转***********************/
void zhengzhuan_dj(uint32 D1,uint32 D2)
{
  FTM_PWM_Duty(FTM0, CH0,D1);    //PWM2
  FTM_PWM_Duty(FTM0, CH1,0);     //PWM1
  FTM_PWM_Duty(FTM0, CH2,D2);   //PWM2
  FTM_PWM_Duty(FTM0, CH3,0);    //PWM1
  
}
/*************电机反转***********************/
void fanzhuan_dj(uint32 D1,uint32 D2)
{
  FTM_PWM_Duty(FTM0, CH0,0);    //PWM2
  FTM_PWM_Duty(FTM0, CH1,D1);     //PWM1
  FTM_PWM_Duty(FTM0, CH2,0);    //PWM2
  FTM_PWM_Duty(FTM0, CH3,D2);     //PWM1
  
}
/*************电机停止***********************/
void stop_dj()
{
  
  FTM_PWM_Duty(FTM0, CH0,0);    //PWM2
  FTM_PWM_Duty(FTM0, CH1,0);     //PWM1
  FTM_PWM_Duty(FTM0, CH2,0);    //PWM2
  FTM_PWM_Duty(FTM0, CH3,0);     //PWM1
}




uint16 steer_value,last_steer_value;



uint16  m=0;                 //换行变量
//***************************************************************************************************************
//没有偏振片  实验室里屋桌子内侧三个灯亮,外侧一个灯亮   内侧 阈值最好为191  舵机>1500中间值向左打角,<1500右打角   左偏减小 右偏增大
//****************************************************************************************************

//************* 黑线的中值滤波辅助程序***********************//
int get_mid(unsigned int a,unsigned int b,unsigned int c) //三个数排序  取最大和最小之间的中间值
{ int32 x=0;
if(a>b){x=b;b=a;a=x;}     
if(b>c){x=c;c=b;b=x;}   
if(a>b){x=b;b=a;a=x;}  
return b ;
}
//************* 求绝对值***********************//
uint16 f_abs(int16 t)
{
  if(t>0)
    return t;
  else
  {
    t=-t;
    return t;
  }
}
uint8 n=0;
///////////////////找黑线算法///////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
void vedge()
{     
  
  static u8 i;
  static u8 left=0,right=0;


   
   H_youwan=0;
   H_zuowan=0;
   L_youwan=0;
   L_zuowan=0;
   
   err_cnt=0;

  Imge_Extend();
  for(hang1=0;hang1<60;hang1++)
  {
    right=0;
    left=0;
    right_lose=0;
    left_lose=0;
   
    for(line1=40;line1<80;line1++) //两边向中间找 扫描范围比较宽  要求图像质量要非常好。
    {  
      if((Buffer[hang1][line1-2]==white)&&
         (Buffer[hang1][line1-1]==white)&&
           Buffer[hang1][line1]==white&&
             Buffer[hang1][line1+1]==black&&
               Buffer[hang1][line1+2]==black )
      {
        right=j;
        right_lose=1;
        break;
      }        
              
    }
    for(line1=40;line1>0;line1--)
    {  
      if((Buffer[hang1][line1+2]==black)&&
         (Buffer[hang1][line1+1]==black)&&
           Buffer[hang1][line1]==white&&
             Buffer[hang1][line1-1]==white&&
               Buffer[hang1][line1-2]==white )
      {
        left=j;
        left_lose=1;
        break;
      }
  
    }
   
    if((left_lose==1)&&(right_lose==1)) //  (左边界+右边界)/2
    {  
      Line_Center[n]=(right+left)>>1;    //((right+left)>>1);       表示除以2            
    }
    /*右弯*/if((left_lose==1 )&&(right_lose==0)) //可能的情况是弯道一边全丢,只扫描到一边另外一边扫描到赛道外面的白点干扰
    {
      H_youwan++;
    }     
    /*左弯*/if((left_lose==0 )&&(right_lose==1)) //可能的情况是弯道一边全丢,只扫描到一边另外一边扫描到赛道外面的白点干扰
    {
      H_zuowan++;
    }  
    if((left_lose==0 )&&(right_lose==0))
    {
      Line_Center[n]=40;
      err_cnt++;
    }
  }
  ////////////////////////////////////////一行图像的信息处理完毕///////////////////////////// ////////////
  //分段部分     
  /////////////////////////////黑线的中值滤波程序////////////////// /////////////////////////////////////////   
for(i=1;i<=19;i++)   
{  
         if(f_abs(Line_Center[i]-Line_Center[i+1])>=3)  
         {
           Line_Center[i]=(Line_Center[i-1]+Line_Center[i+1]*3)<<2;      
         }
         Line_Center[i]=get_mid(Line_Center[i-1],Line_Center[i],Line_Center[i+1]);
         Road_mid[i][ Line_Center[i] ]=black;//中心线显示用     
}   

}
//////////////////////////找黑线完毕///////////////////////////////////////////////////
/*
void shi()
{
  uint8 i;
  vedge();
  for(i=0;i<=20;i++)
  {
    Line_Center[i]=black;
  }
}
void xianshi()
{
  uint8 i,j;
  
  shi();
  for(i=0;i<20;i++)
  {
    for(j=0;j<20;j++)
    {
       uart_putchar(UART3,Buffer[i][Line_Center[j]]);
    }
  }
  
}*/

//-----根据处理的中心线数据控制------------------------------------------------------
void imageProc(void)
{

unsigned int mm=0; // unsigned int sum;
/* 计算小车偏离象素点个数 */
for(mm=0;mm<hang;mm++)
{
    err[mm]=lilun-Line_Center[mm]; /*40 为摄像头象素中间位置 */  
}
slop1 = Line_Center[5]-Line_Center[20];//远端斜率  
slop2 = Line_Center[20]-Line_Center[35];//近端斜率  
slop_add = slop1+slop2;   
if(H_youwan<10&&H_zuowan<10)//直道或小S弯
{
    if(slop1*slop2<0)     //判断赛道类型为小S
    {
        if (slop_add>=-3&&slop_add<=3)        
        {  
          controler_steer=err[9];     
        }  
         else if((slop_add>=-7&&slop_add<-3)||(slop_add>3&&slop_add<=7))      
         {
           controler_steer=err[15];  
         }
         else if((slop_add>=-10&&slop_add<-7)||(slop_add>7&&slop_add<=10))     
         {  
          controler_steer=(3*err[0]+4*err[15]+3*err[30])/10;              
         }     
          else if((slop_add>=-20&&slop_add<-10)||(slop_add>10&&slop_add<=20))     
          {
          controler_steer=(5*err[0]+3*err[15]+2*err[30])/10;      
          }   
     }   
   else     
   {   
     if(slop_add>=-5&&slop_add<=5) // 直道     
     {
      controler_steer=err[0];  
      }   
    else if ((slop_add>-8&&slop_add<-5)||(slop_add>5&&slop_add<8))     
    {
       controler_steer=err[0];  
    }
      else if((slop_add>=-15&&slop_add<=-8)||(slop_add>=8&&slop_add<=15))   
      {
      controler_steer=(3*err[0]+4*err[15]+3*err[30])/10;      
      }  
    else if((slop_add>=-25&&slop_add<=-15)||(slop_add>=15&&slop_add<=25))   
    {
      controler_steer=err[0];   
    }
      else if((slop_add>=-40&&slop_add<=-25)||(slop_add>=25&&slop_add<=40))
    {
      controler_steer=(6*err[0]+4*err[30])/10;   
    }
   }   
}   
else //大S
  {
      if(H_youwan>=10 )  //S右偏  有出赛道情况     
      
      {
         controler_steer=-(H_youwan*2+L_youwan);   
      }     
      if(H_zuowan>=10 ) //S左偏      
      {
         controler_steer=H_zuowan*2+L_zuowan;  
      }  
      if(err_cnt>=10)
      {
           stop_dj();
      }
      else
      {
           zhengzhuan_dj(300,300);//1500
      }   
      // 舵机控制
      if (controler_steer >  15)  
      {
        controler_steer=15;
      }
      if (controler_steer < -15)
      {
        controler_steer=-15;
      }
      steer_turn=(int)(controler_steer*5+STEER_CENTER);//  
      
      if(steer_turn<=STEER_RIGHT)
      {
        steer_turn=STEER_RIGHT;
      }
      if(steer_turn>=STEER_LEFT)  
      {
        steer_turn=STEER_LEFT;
      }
      duoji(steer_turn);
  }

}   


回复 支持 反对

使用道具 举报

13

主题

36

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
398
威望
213
贡献
101
兑换币
117
注册时间
2017-2-8
在线时间
42 小时
14#
 楼主| 发表于 2017-3-30 21:16:48 | 只看该作者


/***********************定义变量***************************/#define black 0
#define white 1
#define line 80               
#define hang 60
#define lilun 40               //摄像头理论中心位置60

int32 left,right,mid,leftblack,rightblack;   
int32 Imagesum;
int32 Imageave;
int32 error0=0,error1=0,error;
uint16 LinCout =0;
uint8 Atem8B0 = 0 ;
uint8 ALineOverCout = 0 ;                 //采集完成黑线行数
uint8 ALineCal = 0 ;         
uint8 ADdata[DATALINE][DATACOUNT] ={0} ;        //黑线AD数组存储
uint8 Buffer[hang][line]={0};                       //解压后的数组
uint16 Atemp0 ;
uint8  checkflg = 0 ;     
uint16 i=0,j=0;
uint8  ii ;
uint8 steer_turn;
uint16  black_zuo[line],black_you[line];   //只能看到一条线时的数组
uint8 left_flag [30]={0},right_flag[30]={0};
uint16  Line_Center[60];       //计算出来的中线值存放数组
uint16 lineable=0;       //有效行
uint16 temp=0;
uint8 zuo,  you;
uint8 hang1=20,line1=20;
uint8 err_cnt;
uint8 Road_mid[ hang ][line]={0,0};//赛道中心 【显示用】
int32 search_end_flg=0;
int32 controler_steer;  
vuint8 right_lose=1;
vuint8 left_lose=1;
/***************image process***************************/

int8 err[ 60 ]={0};
int8 slop1;//斜率
int8 slop2;//
int8 slop_add;//


#define STEER_LEFT 166//100 左极限
#define STEER_RIGHT 130//50 右极限
#define STEER_CENTER 145  //舵机中值


vuint8 H_youwan=0,H_zuowan=0,L_youwan=0,L_zuowan=0;

/******************加速度模块变量****************/
uint16 AAngleAcce[6] ;
uint8  AangleCount ;
/****************速度变量****************/
int16 speedcout1,speedcount2 ;
extern SPEEDCOUT speed1[10],speed2[10];
extern uint8  turncount1 ,turncount2  ;
extern vuint8 LPT_INT_count ;  //速度2的count
extern vuint8 DMA_count_Flg  ; //速度1的count
extern vint16 DMALastValue;

float ultrlen ;
extern int32 ultrtime;
/***********************图像处理的行数***************************/

uint8 table[20]={3,6,9,12,15,18,
                 21,24,27,30,33,
                 36,39,42,45,48,
                 51,54,57,60};
//将图像解压扩张
void Imge_Extend()  //字节扩张,1字节8位,以位显示
{
   uint8 i,j;
  for(i=0;i<=60;i++)
    {
              for(j=0;j<DATACOUNT;j++)
                 {
                         if(ADdata[i][j]&0x80) Buffer[i][j*8+0]=0;
                         else Buffer[i][j*8+0]=1;
                         if(ADdata[i][j]&0x40) Buffer[i][j*8+0]=0;
                         else Buffer[i][j*8+0]=1;
                         if(ADdata[i][j]&0x20) Buffer[i][j*8+0]=0;
                         else Buffer[i][j*8+0]=1;
                         if(ADdata[i][j]&0x10) Buffer[i][j*8+0]=0;
                         else Buffer[i][j*8+0]=1;
                         if(ADdata[i][j]&0x08) Buffer[i][j*8+0]=0;
                         else Buffer[i][j*8+0]=1;
                         if(ADdata[i][j]&0x04) Buffer[i][j*8+0]=0;
                         else Buffer[i][j*8+0]=1;
                         if(ADdata[i][j]&0x02) Buffer[i][j*8+0]=0;
                         else Buffer[i][j*8+0]=1;
                         if(ADdata[i][j]&0x01) Buffer[i][j*8+0]=0;
                         else Buffer[i][j*8+0]=1;                    
                 }
    }
}
/*****************PWM波的配置*****************************/
void PWM_peizhi(void)
{
  
  FTM_PWM_init(FTM1, CH1 , 100,145);                           //舵机占空比设置初始化   MOD =19531 ;
  
  FTM_PWM_init(FTM0 , CH0, 80000,0);                        //电机占空比设置初始化   MOD =313 ;  占空比 = duty /(MOD +1 ) ;FTM_CnV_REG(FTMx[ftmn], ch) = cv;
  FTM_PWM_init(FTM0 , CH1, 80000,0);                        //电机占空比设置初始化   MOD =313 ;  占空比 = duty /(MOD +1 ) ;FTM_CnV_REG(FTMx[ftmn], ch) = cv;
  FTM_PWM_init(FTM0 , CH2, 80000,0);                        //电机占空比设置初始化   MOD =313 ;  占空比 = duty /(MOD +1 ) ;FTM_CnV_REG(FTMx[ftmn], ch) = cv;
  FTM_PWM_init(FTM0 , CH3, 80000,0);                        //电机占空比设置初始化   MOD =313 ;  占空比 = duty /(MOD +1 ) ;FTM_CnV_REG(FTMx[ftmn], ch)
}
/*************舵机打中***********************/
void duoji(uint16 dj )
{ steer_turn=dj;
FTM_PWM_Duty(FTM2, CH0,steer_turn);  
}
/*************电机正转***********************/
void zhengzhuan_dj(uint32 D1,uint32 D2)
{
  FTM_PWM_Duty(FTM0, CH0,D1);    //PWM2
  FTM_PWM_Duty(FTM0, CH1,0);     //PWM1
  FTM_PWM_Duty(FTM0, CH2,D2);   //PWM2
  FTM_PWM_Duty(FTM0, CH3,0);    //PWM1
  
}
/*************电机反转***********************/
void fanzhuan_dj(uint32 D1,uint32 D2)
{
  FTM_PWM_Duty(FTM0, CH0,0);    //PWM2
  FTM_PWM_Duty(FTM0, CH1,D1);     //PWM1
  FTM_PWM_Duty(FTM0, CH2,0);    //PWM2
  FTM_PWM_Duty(FTM0, CH3,D2);     //PWM1
  
}
/*************电机停止***********************/
void stop_dj()
{
  
  FTM_PWM_Duty(FTM0, CH0,0);    //PWM2
  FTM_PWM_Duty(FTM0, CH1,0);     //PWM1
  FTM_PWM_Duty(FTM0, CH2,0);    //PWM2
  FTM_PWM_Duty(FTM0, CH3,0);     //PWM1
}




uint16 steer_value,last_steer_value;



uint16  m=0;                 //换行变量
//***************************************************************************************************************
//没有偏振片  实验室里屋桌子内侧三个灯亮,外侧一个灯亮   内侧 阈值最好为191  舵机>1500中间值向左打角,<1500右打角   左偏减小 右偏增大
//****************************************************************************************************

//************* 黑线的中值滤波辅助程序***********************//
int get_mid(unsigned int a,unsigned int b,unsigned int c) //三个数排序  取最大和最小之间的中间值
{ int32 x=0;
if(a>b){x=b;b=a;a=x;}     
if(b>c){x=c;c=b;b=x;}   
if(a>b){x=b;b=a;a=x;}  
return b ;
}
//************* 求绝对值***********************//
uint16 f_abs(int16 t)
{
  if(t>0)
    return t;
  else
  {
    t=-t;
    return t;
  }
}
uint8 n=0;
///////////////////找黑线算法///////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
void vedge()
{     
  
  static u8 i;
  static u8 left=0,right=0;


   
   H_youwan=0;
   H_zuowan=0;
   L_youwan=0;
   L_zuowan=0;
   
   err_cnt=0;

  Imge_Extend();
  for(hang1=0;hang1<60;hang1++)
  {
    right=0;
    left=0;
    right_lose=0;
    left_lose=0;
   
    for(line1=40;line1<80;line1++) //两边向中间找 扫描范围比较宽  要求图像质量要非常好。
    {  
      if((Buffer[hang1][line1-2]==white)&&
         (Buffer[hang1][line1-1]==white)&&
           Buffer[hang1][line1]==white&&
             Buffer[hang1][line1+1]==black&&
               Buffer[hang1][line1+2]==black )
      {
        right=j;
        right_lose=1;
        break;
      }        
              
    }
    for(line1=40;line1>0;line1--)
    {  
      if((Buffer[hang1][line1+2]==black)&&
         (Buffer[hang1][line1+1]==black)&&
           Buffer[hang1][line1]==white&&
             Buffer[hang1][line1-1]==white&&
               Buffer[hang1][line1-2]==white )
      {
        left=j;
        left_lose=1;
        break;
      }
  
    }
   
    if((left_lose==1)&&(right_lose==1)) //  (左边界+右边界)/2
    {  
      Line_Center[n]=(right+left)>>1;    //((right+left)>>1);       表示除以2            
    }
    /*右弯*/if((left_lose==1 )&&(right_lose==0)) //可能的情况是弯道一边全丢,只扫描到一边另外一边扫描到赛道外面的白点干扰
    {
      H_youwan++;
    }     
    /*左弯*/if((left_lose==0 )&&(right_lose==1)) //可能的情况是弯道一边全丢,只扫描到一边另外一边扫描到赛道外面的白点干扰
    {
      H_zuowan++;
    }  
    if((left_lose==0 )&&(right_lose==0))
    {
      Line_Center[n]=40;
      err_cnt++;
    }
  }
  ////////////////////////////////////////一行图像的信息处理完毕///////////////////////////// ////////////
  //分段部分     
  /////////////////////////////黑线的中值滤波程序////////////////// /////////////////////////////////////////   
for(i=1;i<=19;i++)   
{  
         if(f_abs(Line_Center[i]-Line_Center[i+1])>=3)  
         {
           Line_Center[i]=(Line_Center[i-1]+Line_Center[i+1]*3)<<2;      
         }
         Line_Center[i]=get_mid(Line_Center[i-1],Line_Center[i],Line_Center[i+1]);
         Road_mid[i][ Line_Center[i] ]=black;//中心线显示用     
}   

}
//////////////////////////找黑线完毕///////////////////////////////////////////////////
/*
void shi()
{
  uint8 i;
  vedge();
  for(i=0;i<=20;i++)
  {
    Line_Center[i]=black;
  }
}
void xianshi()
{
  uint8 i,j;
  
  shi();
  for(i=0;i<20;i++)
  {
    for(j=0;j<20;j++)
    {
       uart_putchar(UART3,Buffer[i][Line_Center[j]]);
    }
  }
  
}*/

//-----根据处理的中心线数据控制------------------------------------------------------
void imageProc(void)
{

unsigned int mm=0; // unsigned int sum;
/* 计算小车偏离象素点个数 */
for(mm=0;mm<hang;mm++)
{
    err[mm]=lilun-Line_Center[mm]; /*40 为摄像头象素中间位置 */  
}
slop1 = Line_Center[5]-Line_Center[20];//远端斜率  
slop2 = Line_Center[20]-Line_Center[35];//近端斜率  
slop_add = slop1+slop2;   
if(H_youwan<10&&H_zuowan<10)//直道或小S弯
{
    if(slop1*slop2<0)     //判断赛道类型为小S
    {
        if (slop_add>=-3&&slop_add<=3)        
        {  
          controler_steer=err[9];     
        }  
         else if((slop_add>=-7&&slop_add<-3)||(slop_add>3&&slop_add<=7))      
         {
           controler_steer=err[15];  
         }
         else if((slop_add>=-10&&slop_add<-7)||(slop_add>7&&slop_add<=10))     
         {  
          controler_steer=(3*err[0]+4*err[15]+3*err[30])/10;              
         }     
          else if((slop_add>=-20&&slop_add<-10)||(slop_add>10&&slop_add<=20))     
          {
          controler_steer=(5*err[0]+3*err[15]+2*err[30])/10;      
          }   
     }   
   else     
   {   
     if(slop_add>=-5&&slop_add<=5) // 直道     
     {
      controler_steer=err[0];  
      }   
    else if ((slop_add>-8&&slop_add<-5)||(slop_add>5&&slop_add<8))     
    {
       controler_steer=err[0];  
    }
      else if((slop_add>=-15&&slop_add<=-8)||(slop_add>=8&&slop_add<=15))   
      {
      controler_steer=(3*err[0]+4*err[15]+3*err[30])/10;      
      }  
    else if((slop_add>=-25&&slop_add<=-15)||(slop_add>=15&&slop_add<=25))   
    {
      controler_steer=err[0];   
    }
      else if((slop_add>=-40&&slop_add<=-25)||(slop_add>=25&&slop_add<=40))
    {
      controler_steer=(6*err[0]+4*err[30])/10;   
    }
   }   
}   
else //大S
  {
      if(H_youwan>=10 )  //S右偏  有出赛道情况     
      
      {
         controler_steer=-(H_youwan*2+L_youwan);   
      }     
      if(H_zuowan>=10 ) //S左偏      
      {
         controler_steer=H_zuowan*2+L_zuowan;  
      }  
      if(err_cnt>=10)
      {
           stop_dj();
      }
      else
      {
           zhengzhuan_dj(300,300);//1500
      }   
      // 舵机控制
      if (controler_steer >  15)  
      {
        controler_steer=15;
      }
      if (controler_steer < -15)
      {
        controler_steer=-15;
      }
      steer_turn=(int)(controler_steer*5+STEER_CENTER);//  
      
      if(steer_turn<=STEER_RIGHT)
      {
        steer_turn=STEER_RIGHT;
      }
      if(steer_turn>=STEER_LEFT)  
      {
        steer_turn=STEER_LEFT;
      }
      duoji(steer_turn);
  }

}   

这是主函数上面的子函数,求高手帮忙分析下,被这个问题困扰太久了
回复 支持 反对

使用道具 举报

0

主题

15

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
391
威望
184
贡献
131
兑换币
110
注册时间
2016-4-5
在线时间
38 小时
毕业学校
5555
15#
发表于 2017-4-16 15:33:26 | 只看该作者
lineable=0;       //有效行
楼主这么取得
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

注册会员

Rank: 2

积分
52
威望
36
贡献
10
兑换币
11
注册时间
2016-11-14
在线时间
3 小时
毕业学校
西安文理学院
16#
发表于 2017-5-13 22:14:21 | 只看该作者
同求  1316653743@qq.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-12-26 03:10 , Processed in 0.093398 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表