17届技术报告|国防科技大学-多车一师

学 校:国防科技大学               
队伍名称:多车一师              
参赛队员:代宇翔,余皇志,杜肖,权与时,尚靖卓
带队教师:李健,范一鸣            

01   言


1.1 概述

  本报告主要反映了本组车模的技术指标和制作过程。

1.2 本报告结构

  为了更详尽地介绍本组车模的技术指标和制作过程,本报告分为六章:

  • 第一章 引言,对本方案的总体情况进行介绍
  • 第二章 机械结构,主要介绍了本组车模的机械结构的设计
  • 第三章 硬件设计,主要介绍课本组车模的硬件设计
  • 第四章 软件设计,主要介绍课本组车模的软件设计
  • 第五章 开发工具与调试,主要介绍了开发过程中使用的软件和环境
  • 第六章 总结,对全文进行总结

  附录部分包括程序源代码和PCB原理图。

02 械结构


2.1 车模选择

  本组选择三辆C型车模作为比赛用车,头车采用摄像头作为道路识别传感器,中间车和尾车采用电感作为道路识别传感器。

2.2 头车的设计

2.2.1前轮的改装

  采用主销内倾,即安装前轮时,通过调节使主销轴线上端在车的横向平面内向内倾斜。

▲ 图2.3.1 头车前轮

▲ 图2.3.1 头车前轮

2.2.2 舵机的安装

  舵机有两种安装方式,分别为立式安装和卧式安装。立式安装舵机转轴位于水平方向,卧式安装转轴位于竖直方向。这里采用了立式安装,避开了卧式安装的缺点,减小了车轮在同一平面上运动的死区。

▲ 图2.3.2 头车舵机

▲ 图2.3.2 头车舵机

2.2.3 摄像头的安装

  头车循迹的方式是借助摄像头采集赛道信息。摄像头支架安装在舵机后侧的车模底部,使用螺丝和热熔胶固定摄像头,保证机械强度。摄像头信号线缠绕在支架上连接至主板。

▲ 图2.3.3 头车摄像头

▲ 图2.3.3 头车摄像头

2.2.4 姿态传感器与红外测距模块的安装

  采用ICM20602姿态传感器,利用其体积小、通信量少优势,提高车模性能。姿态传感器使用热熔胶固定在车模底部摄像头支架右侧,通过信号线与主板连接。红外测距模块固定在车尾。

▲ 图2.3.4 头车姿态传感器与红外测距模块

▲ 图2.3.4 头车姿态传感器与红外测距模块

2.2.5 主板与驱动板、电池盒的安装

  中间车与尾车的主板与驱动板分别安装在车模中间底部和尾部电机上方,使用多种导线连接进行信号传递。

  电池盒安装在车模底部主板与电机之间。

  备用车的主板与电池盒位置互换。

▲ 图2.3.5 头车主板与电池盒布局

▲ 图2.3.5 头车主板与电池盒布局

2.3 中间车与尾车的设计

2.3.1 前轮的改装

  采用主销内倾,即安装前轮时,通过调节使主销轴线上端在车的横向平面内向内倾斜。

▲ 图2.4.1 中间车前轮

▲ 图2.4.1 中间车前轮

2.3.2 舵机的安装

  舵机有两种安装方式,分别为立式安装和卧式安装。立式安装舵机转轴位于水平方向,卧式安装转轴位于竖直方向。这里采用了立式安装,避开了卧式安装的缺点,减小了车轮在同一平面上运动的死区。

▲ 图2.4.2 中间车模舵机

▲ 图2.4.2 中间车模舵机

2.3.3 电磁传感器的安装

  中间车与尾车循迹的方式是借助电磁线,车模在安装电磁传感器时,使用碳素杆和金属杆将三对电感、电容支撑在车模前部。既保持了良好的转向能力又保证了机械强度,保证了测量到的电感值的稳定。

▲ 图2.4.3 中间车电磁传感器

▲ 图2.4.3 中间车电磁传感器

2.3.4 红外测距模块与CCD的安装

  通过CCD与红外测距模块组合使用来控制多车运行时中间车和尾车的跟车、停车问题。使用支架将CCD安装在电磁支架的横杆上,用螺丝和热熔胶加固。用热熔胶将红外测距模块安装在舵机前侧。

▲ 图2.4.4 中间车模与红外测距模块

▲ 图2.4.4 中间车模与红外测距模块

2.3.5 姿态传感器的安装

  采用ICM20602姿态传感器,利用其体积小、通信量少优势,提高车模性能。姿态传感器使用热熔胶固定在车模底部舵机后侧,通过信号线与主板连接。

▲ 图2.4.5 中间车模姿态传感器

▲ 图2.4.5 中间车模姿态传感器

2.3.6 主板与驱动板、电池盒的安装

  中间车与尾车的主板与驱动板分别安装在车模中间底部和尾部电机上方,使用多种导线连接进行信号传递。

  电池盒安装在车模底部主板与电机之间。

▲ 图2.4.6 中间车模主板与电池盒布局

▲ 图2.4.6 中间车模主板与电池盒布局

03 件设计


3.1 电路整体结构

3.1.1 头车主板电路整体结构

  使用CH32V307作为单片机最小系统,外部有舵机接口、摄像头接口、OLED接口、蜂鸣器、电机驱动接口、蓝牙串口、停车触发接口、按键、陀螺仪、电源模块、滤波电路、运放模块。

3.1.2 中间车与尾车主板电路整体结构

  使用STC16F40K128作为单片机最小系统,外部有舵机接口、CCD接口、OLED接口、蜂鸣器、电机驱动接口、蓝牙串口、停车触发接口、按键、陀螺仪、电源模块、滤波电路、运放模块。

3.1.3 驱动板电路整体结构

  驱动板使用HIP4082IBZT驱动芯片和IRLR7843TRPBF MOS管,输出两路PWM信号。

3.2 电源模块

  电源模块的作用是为其它各个模块提供电源,它包含多种电压值,设计时应考虑到散热、稳定、可靠等因素针对不同的电压合理设计各项参数。车模使用两节能提供4.2V电压的电池串联提供电压。
  车模使用SPX2940-5.0提供5V电压,使用RT9013-33GB提供3.3V电压。

▲ 图3.2.1 SPX2940-5.0 电路

▲ 图3.2.1 SPX2940-5.0 电路

▲ 图3.2.2 RT9013-33GB 电路

▲ 图3.2.2 RT9013-33GB 电路

3.3 驱动模块

  所有车模使用两个电机,使用型号为IRLR7843TRPBF的MOS管,使用驱动芯片HIP4082IBZT。
  MOS管需要12V的电压驱动工作,使用SX1308升压芯片提供。

▲ 图3.3.1 驱动模块电路

▲ 图3.3.1 驱动模块电路

▲ 图3.4.1 SX1308电路

▲ 图3.4.1 SX1308电路

3.4 摄像头模块

  选用总钻风摄像头作为传感设备,其接口电路如下。

▲ 图3.4.1 摄像头接口电路

▲ 图3.4.1 摄像头接口电路

3.5 运放模块

  电感得到的电磁的信号值很小,需要经过放大才能使用。运放电路解决电感信号值过小问题。

▲ 图3.5.1 运放接口电路

▲ 图3.5.1 运放接口电路

3.6 速度检测模块

  编码器通过齿轮与车轮连接,车轮转动带动编码器转动,编码器输出脉冲,将接口连接上单片机,可以获取车模速度。

▲ 图3.6.1 编码器接口电路

▲ 图3.6.1 编码器接口电路

3.7 隔离模块

  信号隔离使数字或模拟信号在发送时不存在穿越发送和接收端之间屏障的电流连接。使用SN74HC125PWR芯片作为隔离芯片。

▲ 图3.7.1 隔离模块电路

▲ 图3.7.1 隔离模块电路

3.8 调试电路模块

  使用OLED屏幕、五向开关、按钮作为可视化交互调试电路。

▲ 图3.8.1 交互调试电路

▲ 图3.8.1 交互调试电路

3.9 电路板外观与布局设计

  电路板设计时考虑了宽度和长度要能在车模中安放,打孔位置需要符合车模底部的槽。模块的布局要不能互相干扰。

▲ 图3.9.1 STC16F40K128主板

▲ 图3.9.1 STC16F40K128主板

▲ 图3.9.2 CH32V307主板

▲ 图3.9.2 CH32V307主板

04 件设计


4.1 软件系统设计及实现

  在设计软件时,采用PID算法。多车通信时通过串口发送的数据判断指令,执行相应操作。头车使用摄像头系列算法识别赛道模块,中间车和尾车使用电磁系列算法识别赛道模块。

4.2 各环控制

4.2.1 速度环

  通过编码器计算得到实际速度,通过转向环计算得到差速系数,对电机输出进行PID控制,程序见附录。

4.2.2 转向环

  通过电感值变化获得误差、误差变化率,转向角度进行PID控制,P和D通过模糊表获得,程序见附录。

4.3 元素处理

  对各个元素进行处理,实现成功识别。

4.3.1 坡道判断和处理

  两次识别进行不同的判断,程序见附录。

4.3.2 圆环判断和处理

  分为左圆环和又圆环单独判断,程序见附录。

4.3.3 斑马线判断和处理

  连续X行有A个跳变,则判断斑马线,程序见附录。

4.3.4 岔路判断和处理

  针对某一行进行判断,若为黑色判断进入时间,程序见附录。

4.4 PID控制

  使用自编的PID算法,程序见附录。

4.5 多车通信

  使用无线串口发送和接受特定数字实现不同场景的通信,统一多车行为,程序见附录。

05 发调试


5.1 软件环境

  CH32V307使用MounRiver Studio开发,STC16F40K128通过keil开发。

▲ 图5.1.1 MounRiver Studio开发界面

▲ 图5.1.1 MounRiver Studio开发界面

▲ 图5.1.2 Keil 开发界面

▲ 图5.1.2 Keil 开发界面

5.2 串口调试助手

  在使用串口时,需要用到串口调试助手。

▲ 图5.2.1 串口调试助手

▲ 图5.2.1 串口调试助手

5.3 人机交互

  使用OLED屏幕显示编写的菜单程序,可以使用五向开关和按键调节程序参数,通过单片机自带的Flash模块实现存储。

▲ 图5.2.2 中间车OLED屏幕

▲ 图5.2.2 中间车OLED屏幕

▲ 图5.3.2 头车OLED界面

▲ 图5.3.2 头车OLED界面

5.4 硬件环境

  使用立创EDA开发,绘制原理图与PCB图。

▲ 图5.4.1 立创EDA开发环境

▲ 图5.4.1 立创EDA开发环境

06   结


  模的制作过程经历了各种版本的迭代,在制作和调试中解决了一些问题。硬件上解决了电路板布局,形状、车模改装等问题,软件上解决了算法、结构等问题。

  录 ※


一、源代码

  对各个元素进行处理,实现成功识别。

1. 摄像头坡道判断和处理

uint8  Ramp_Judge(){
    
    
    if(have_podao ==0 && Statu==Normals //斑马线后打开第二次识别
            && ui8_LineWidth[5]>=30 && ui8_LineWidth[10]>=30 && ui8_LineWidth[15]>=30 && ui8_LineWidth[20]>=35)
    {
    
    
        flag_Ramp_1=1;
    }
    if(flag_Ramp_1==1 && street_len_40>=58
            && (ui8_LineWidth[20]-ui8_LineWidth[4]>=25) && (ui8_LineWidth[55]-ui8_LineWidth[20]<=20)
            //&& !DI.ui8_ImageArray[2][30] && !DI.ui8_ImageArray[3][30] && !DI.ui8_ImageArray[2][50] && !DI.ui8_ImageArray[3][50]
            &&  S_Left<=10 && S_Left>=-10 && S_Right<=10 && S_Right>=-10 ){
    
    
        BeeOn;
        Statu=Ramps;
        flag_Ramp_1=0;
        flag_Ramp_2=1;
        Distance=0;
        Record_Dis=1;
        return 1;
    }
    else {
    
    
        return 0;
    }
}

2. 摄像头圆环判断和处理

//圆环判定ui8_DisposeScopeUp=0;ui8_DisposeScopeDown=59;ui8_DisposeScopeLeft=5;ui8_DisposeScopeRight=74;
uint8 Ring_count=0;
void LRing_Judge (void)
{
    
    
      if(DI.ui8_ImageArray[DI.ui8_DisposeScopeDown-2][DI.ui8_DisposeScopeLeft+5] && DI.ui8_ImageArray[DI.ui8_DisposeScopeDown-4][DI.ui8_DisposeScopeLeft+5]
         &&DI.ui8_ImageArray[DI.ui8_DisposeScopeDown-6][DI.ui8_DisposeScopeLeft+5] && DI.ui8_ImageArray[DI.ui8_DisposeScopeDown-8][DI.ui8_DisposeScopeLeft+5]
          && DI.ui8_ImageArray[DI.ui8_DisposeScopeDown-10][DI.ui8_DisposeScopeLeft+5] && DI.ui8_ImageArray[DI.ui8_DisposeScopeDown-12][DI.ui8_DisposeScopeLeft+5]
            && DI.ui8_ImageArray[DI.ui8_DisposeScopeDown-14][DI.ui8_DisposeScopeLeft+5] && DI.ui8_ImageArray[DI.ui8_DisposeScopeDown-16][DI.ui8_DisposeScopeLeft+5]
              && DI.ui8_ImageArray[DI.ui8_DisposeScopeDown-18][DI.ui8_DisposeScopeLeft+5] && DI.ui8_ImageArray[DI.ui8_DisposeScopeDown-20][DI.ui8_DisposeScopeLeft+5]
                 && DI.ui8_ImageArray[DI.ui8_DisposeScopeDown-22][DI.ui8_DisposeScopeLeft+5] && DI.ui8_ImageArray[DI.ui8_DisposeScopeDown-24][DI.ui8_DisposeScopeLeft+5]
               //    && !DI.ui8_ImageArray[DI.ui8_DisposeScopeDown-45][DI.ui8_DisposeScopeLeft+5] && !DI.ui8_ImageArray[DI.ui8_DisposeScopeDown-43][DI.ui8_DisposeScopeLeft+5]
                      && !DI.ui8_ImageArray[DI.ui8_DisposeScopeDown-15][75] && !DI.ui8_ImageArray[DI.ui8_DisposeScopeDown-10][79]
                       && !DI.ui8_ImageArray[DI.ui8_DisposeScopeDown-20][75] && !DI.ui8_ImageArray[DI.ui8_DisposeScopeDown-25][75]
                        && DI.ui8_ScanLineToR[4]<78  && DI.ui8_ScanLineToR[5]<78 && DI.ui8_ScanLineToR[6]<78 && DI.ui8_ScanLineToR[7]<78
                         && S_Right<=10 && S_Right>=-5  && S_Left<=-10
                           &&street_len_40>=55
                             && Open_Ring && Statu==Normals )
        {
    
    
          BeeOn;
          Statu=LRing;  //Statu=4表示识别到左圆环
          L_Ring_flag1=1;
          Ring_count++;
        }
 }

uint8 RRing_count=0;
void RRing_Judge (void)
{
    
    
    if(!DI.ui8_ImageArray[30][1]&&!DI.ui8_ImageArray[30][3]&&!DI.ui8_ImageArray[30][6]&&!DI.ui8_ImageArray[30][8]//30行左半部分黑
         &&!DI.ui8_ImageArray[55][2]&&!DI.ui8_ImageArray[55][3]&&!DI.ui8_ImageArray[55][4]&&!DI.ui8_ImageArray[55][5]
         &&DI.ui8_ImageArray[50][75]&&DI.ui8_ImageArray[50][76]&&DI.ui8_ImageArray[50][77]
         &&DI.ui8_ImageArray[52][75]&&DI.ui8_ImageArray[52][76]&&DI.ui8_ImageArray[52][77]//7535-40行白
         //&&DI.ui8_ImageArray[3][60]&&DI.ui8_ImageArray[3][62]&&DI.ui8_ImageArray[3][64]&&DI.ui8_ImageArray[3][65]//7545-59行白
           && ui8_LineWidth[50]>=55  && ui8_LineWidth[55]>=55
                        && S_Left>=-6 && S_Left<=6 && S_Right>=10
                           &&street_len_40>=55
                              && Open_Ring && Statu==Normals)
            {
    
    
              BeeOn;
              Statu=RRing;  //Statu=5表示识别到右圆环
              R_Ring_flag1=1;
              RRing_count++;
            }
}

3. 摄像头斑马线判断和处理

//斑马线判定自写简单
void banmaxian_judge(void)
{
    
    
    if(Zebra_Count==0) ZEBRA_begin_2=ZEBRA_begin;//第一次斑马线识别行数
    else ZEBRA_begin_2=ZEBRA_begin;//第二次斑马线识别行数

  if(Statu==Normals)
  {
    
    
    for(ze_x1=ZEBRA_begin_2;ze_x1<=30;ze_x1++)//检测第几行到第几行有没有跳变
    {
    
    
      for(ze_y1=0;ze_y1<79;ze_y1++)
      {
    
    
        if(DI.ui8_ImageArray[ze_x1][ze_y1]==1 && DI.ui8_ImageArray[ze_x1][ze_y1+1]==0)
        {
    
    flag_zebra_1++;}
      }
      if(flag_zebra_1>=5)
      {
    
    flag_zebra_2++;}
      flag_zebra_1=0;
    }
    if(flag_zebra_2>=4)//连着x行有a个跳变,判定为斑马线
    {
    
    
        Zebra_Count++;//识别到斑马线的次数
        if(Zebra_Count>2) Zebra_Count=2;

        if(Zebra_Count==1)
        {
    
    
            BeeOn;
            Statu=Zebra;
            flag_zebra_2=0;
        }
        else if(Zebra_Count==2)
        {
    
    
            BeeOn;
            Statu=Zebra;
            Zebra_flag1=1;
            flag_zebra_2=0;
        }
    }
  }
}

4.摄像头岔路判断和处理

  //岔路判定
  //}
  uint8 ChaLu_Judge(void){
    
    
      uint8 Start_y1=59-street_len_40;  //Start_y1是第40列的反向可视距离
      uint8 Start_x1=40;
      Write_Point=0;
      if(street_len_40<=55 && Statu==Normals){
    
      //可视距离+状态限制
        Seek_point(Start_y1-2);
        if(Change_time<2){
    
    
            return 0;
        }
        Seek_point(Start_y1-4);
        if(Change_time<2){
    
    
            return 0;
        }
          //检测点下20行白点数
          for(uint8 Y=Start_y1;Y<=Start_y1+20;Y++){
    
       //20for (uint8 X=0;X<=DI.ui8_DisposeScopeRight;X=X+2){
    
    
                  if(DI.ui8_ImageArray[Y][X]){
    
    
                      Write_Point++;
                  }
              }
          }
          if(Write_Point<400) return 0;
          //检测向上是黑色
          for(uint8 Y=57-street_len_40;Y>DI.ui8_DisposeScopeUp;Y--){
    
    
              if(DI.ui8_ImageArray[Y][40]){
    
    
                  return 0;
              }
              else{
    
    
                  if(Y==DI.ui8_DisposeScopeUp+3
                      && !DI.ui8_ImageArray[58][3] && !DI.ui8_ImageArray[55][3] && !DI.ui8_ImageArray[53][3] && !DI.ui8_ImageArray[50][3]  //第三列黑
  //                    && !DI.ui8_ImageArray[58][78] && DI.ui8_ImageArray[55][78] && DI.ui8_ImageArray[53][78] && DI.ui8_ImageArray[50][78] //78列下面黑
                  )
                 {
    
    
                      ChaLu_flag_TEMP=1;
                      break;
                  }
//                      else{
    
    
//                          Statu=Xie_Cross;
//                          Xie_Cross_flag0=1;  //斜着进入十字
//                          Distance=0;
//                          Record_Dis=1;
//                      }
              }
          }
      }
      if(ChaLu_flag_TEMP==1
              && ui8_LineWidth[5]<=10 && ui8_LineWidth[10]<=10 && ui8_LineWidth[15]<=20 && ui8_LineWidth[20]<=25
               && DI.ui8_ImageArray[20][10] && DI.ui8_ImageArray[21][10] && DI.ui8_ImageArray[22][10] && DI.ui8_ImageArray[23][10]
                 && DI.ui8_ImageArray[25][70] && DI.ui8_ImageArray[26][70] && DI.ui8_ImageArray[27][70] && DI.ui8_ImageArray[28][70])
      {
    
    
          ChaLu_flag_TEMP=0;
          CHALU_count++;
          Statu=Lukou;
          ChaLu_flag0=1;
      }
      return 1;
  }

5.中间车速度环

if(DIR1 == 1)
	{
    
    
		speedr = ctimer_count_read(CTIM0_P34) * -1;
	}
	else
	{
    
    
		speedr = ctimer_count_read(CTIM0_P34) ;
	}
	ctimer_count_clean(CTIM0_P34);
	if(DIR2 == 1)  
	{
    
    
		speedl = ctimer_count_read(CTIM3_P04);
	}
	else        
	{
    
    
		speedl = ctimer_count_read(CTIM3_P04) * -1;
	}
	ctimer_count_clean(CTIM0_P34);
	ctimer_count_clean(CTIM3_P04);
	
	speed_n = (speedl + speedr)/2;
	speed_n = speed_n*20.4/(2355.2*0.02);
	
	speed_nl = speedl*20.4/(2355.2*0.02);
	speed_nr = speedr*20.4/(2355.2*0.02);
	
	if(Record_Road) Road += speed_n;
	if(jiao>=0)
	{
    
    
		speed_sl = speed_sr/(1+myabs(turn_tan));
		speed_sr = speed_s;
	}
	else
	{
    
    
		speed_sr = speed_sl/(1+myabs(turn_tan));
		speed_sl = speed_s;
	}
	speed_e = (int)(speed_s - speed_n);
	
	speed_el = (int)(speed_sl - speed_nl);
	speed_er = (int)(speed_sr - speed_nr);
	

	dutyR += (speed_er - speed_epr) * SPEEDPL + speed_er * SPEEDIL;
	speed_epr = speed_er;
	
	dutyL += (speed_el - speed_epl) * SPEEDPR + speed_el * SPEEDIR;
	speed_epl = speed_el;

	if(dutyL>=PWM_DUTY_MAX) dutyL=PWM_DUTY_MAX;
	else if(dutyL<=-PWM_DUTY_MAX) dutyL=-PWM_DUTY_MAX;
	if(dutyR>=PWM_DUTY_MAX) dutyR=PWM_DUTY_MAX;
	else if(dutyR<=-PWM_DUTY_MAX) dutyR=-PWM_DUTY_MAX;

6.中间车转向环

poserror_change = poserror - poserror_pre;
poserror_pre = poserror;
if(ER_Read)		
{
    
    
		poserror1 = 155*50*	(2000/550)*(sqrt(LB)-sqrt(RB))/(MB*(sqrt(LB)+sqrt(RB)));
		pos1 = 155*50*	(2000/550)*(sqrt(LB)-sqrt(RB));
	}
	else 
	{
    
    
		poserror1 = pos1/(MB*(sqrt(LB)+sqrt(RB)));
	}
kp = Fuzzy_Update(&Direct_P6,poserror,poserror_change);
kd = 25*(kp-1.44);
turn = DJMID + kp * poserror + kd * (poserror - poserror_pre);

7.头车PID控制

//增量式PID算法
void speed_PID(int32 GoalL,int32 GoalR){
    
    
    //LEFT
 float errors_L=0;
 float P_L,I_L,D_L;
  Out_PWM_pre_L=Out_PWM_L;
  errors_L=(float)(GoalL)-V_L;//原先是V_L
  P_L=DJ_kp*(errors_L-error_pres_L);
  I_L=DJ_ki*errors_L;
//  P=DJ_p*(errors-error_pres);
//  I=DJ_i*errors;
  D_L=DJ_kd*(errors_L-2*error_pres_L+error_pre_pres_L);
  if(I_L>=2000) I_L=0;
  else if(I_L<=-2000)  I_L=0;
  Out_PWM_L+=(int16)(P_L+I_L+D_L);
  error_pre_pres_L=error_pres_L;
  error_pres_L=errors_L;
  if(Out_PWM_L>8000){
    
    
    Out_PWM_L=8000;
  }
  else if(Out_PWM_L<-8000){
    
    
    Out_PWM_L=-8000;
  }
  //RIGHT
  float errors_R=0;
  float P_R,I_R,D_R;
   Out_PWM_pre_R=Out_PWM_R;
   errors_R=(float)(GoalR)-V_R;//原先是V_R
   P_R=DJ_kp*(errors_R-error_pres_R);
   I_R=DJ_ki*errors_R;
 //  P=DJ_p*(errors-error_pres);
 //  I=DJ_i*errors;
   D_R=DJ_kd*(errors_R-2*error_pres_R+error_pre_pres_R);
   if(I_R>=2000) I_R=0;
   else if(I_R<=-2000)  I_R=0;
   Out_PWM_R+=(int16)(P_R+I_R+D_R);
   error_pre_pres_R=error_pres_R;
   error_pres_R=errors_R;
   if(Out_PWM_R>8000){
    
    
     Out_PWM_R=8000;
   }
   else if(Out_PWM_R<-8000){
    
    
     Out_PWM_R=-8000;
   }
}

8.头车多车通信

if(ChuKu_flag)
            uart_write_byte(UART_2, 0x04);

        if(Car2Run_flag){
    
    
            uart_write_byte(UART_2, 0x01);
            Car2Run_flag=0;
        }
        if(Car3Stop)
            uart_write_byte(UART_2, 0x05);
        //            if(InChaLu)
            //                uart_write_byte(UART_2, 0x06);

        if(E5_flag==1)
        {
    
    
            tft180_displayimage032(image[0], 80, 60);
            tft180_show_int16(0,70, Statu);                 //小车状态
            tft180_show_int16(0,90,Flash_yuzhi_value);      //图象阈值
            tft180_show_int16(0,110,Motor.i32_GoalPulseL);  //目标速度
            tft180_show_int16(0,130,poserror);            //舵机pwm
            ////
            tft180_show_int16(70,70,SumAngle);
            tft180_show_int16(70,90,Distance);
            tft180_show_int16(70,110,ui8_LineWidth[10]);
            tft180_show_int16(70,130,ui8_LineWidth[15]);
//            tft180_show_int16(70,110,S_Left);
//            tft180_show_int16(70,130,S_Right);
            ////            tft180_show_int16(50,110,View3);
            ////            tft180_show_float(50,130,View4,1,4);
            ////
            //        }
        }

二、原理图




● 相关图表链接:

猜你喜欢

转载自blog.csdn.net/zhuoqingjoking97298/article/details/126769997