请选择 进入手机版 | 继续访问电脑版
查看: 6107|回复: 3

[原创] 恩智浦智能车电磁组分区算法介绍

[复制链接]

该用户从未签到

7

主题

193

帖子

0

中级会员

Rank: 3Rank: 3

积分
399
最后登录
2018-5-3
发表于 2016-9-8 13:30:58 | 显示全部楼层 |阅读模式
恩智浦智能车分为三组:摄像头、光电、电磁,我做的是电磁车,三种车队区别在于传感器的不同,所以获得路径信息的方法也不一样,摄像头和光电识别的是赛道上的黑线(白底赛道),而电磁车则是检测埋在赛道下的通入100mh电流的漆包线,摄像头和光电采用的是摄像头和ccd作为传感器,电磁则是用电感放在漆包线周围,则电感上就会产生感应电动势,且感应电动势的大小于通过线圈回路的磁通量成正比,又因为漆包线周围的磁感应强度不同,因此不同位置的电感的感应电动势就不同,因此就可以去确定电感位置;因此在车子前面设置了50cm的前瞻,电感布局如下(怎么发不了图片):分为两排,前排3个,编号0,1,2(前期还加了两个竖直电感用来帮助过直角弯,后来改为了八字电感);后排2个,编号3,4;现在车子获得了不同位置的感应电动势的大小了,但这些值是不能处理的:1、感应电动势太微弱;2、是模拟信号,信号太微弱就放大它;这就涉及到模拟电路的知识了,就不多说了(因为要把这讲完到PCB绘制的篇幅就足够写另开一号专门写这些方面来(PS:题外话(我的题外话比较多)):放大部分外围你设计的再好也抵不过一个更好的芯片,有两个例子,一个是我自己的:之前用的是NE5532,但是效果不理想,加了好多什么滤波,补偿,都用上,没用,软件里处理后面再说,后来一狠心换了AD620,感觉像是春天来了,因为它是仪用放大器,还有就是贵。。。,效果是超级赞,去掉了许多附加电路,板子简洁多了,(器件多,故障率也会提高,到后期查故障简直是恶心(能想象拿着万用表和示波器在实验室纠结的样子吗?感觉怎样处理故障还可以专门总结一下))另一个是学长的例子:他参加电子设计竞赛时,有一组(同一学校的)和他题目一样,东西做出来后基本差不多,但是他拿了一等奖,而另一组是二等奖,差别就在于当时的一个滤波,本校指导老师说可以加一个简单电容就行,而他用的则是一款新的滤波芯片,信号最后出来的波形差距挺大的),(我负责的主要是软件部分,但是硬件电路也全程涉及了,不过终究还是不太熟)。

  解决完放大就是把模拟信号转换为数字信号了,我们直接用的是芯片上的AD模块,(题外话又来啦:我开始用的是K60是飞思卡尔Kinetis微控制器ARM Cortex®-M4系列,其实就是把它当成了一款高性能的单片机了,实在是浪费,(现在在学嵌入式开发,希望有高手来指导我),后来改为s12了,因为与别的组冲突,感觉K60确实比s12更容易上手,s12还要自己配置寄存器,级联,计算超频,外部时钟频率,k60别人写好了库,就是在不断调用),不过看论坛上有人说飞思卡尔的AD转换有问题,而飞思卡尔也不公开它AD模块具体细节,不过要是自己做ad模块,那对于整车布局就十分麻烦,所以只好用啦(别人都在用,一起跳坑);处理完了,接下来关门放算法。

二、核心路径算法

  1. /******************** (C) COPYRIGHT 2011 ********************* ********************
  2. * 文件名       :Date_analyse.c
  3. * 描述         :电感数据采集与分析
  4. *
  5. * 实验平台     :野火kinetis开发板
  6. * 库版本       :
  7. * 嵌入系统     :
  8. *
  9. * 作者         :oО殇のSo
  10. **********************************************************************************/   
  11. #include "include.h"
  12. #define   NM    3

  13. int16  AD_valu[5],AD_V[5][NM],chazhi,chazhi_old;
  14. float  AD[5],sensor_to_one[5];
  15. float  Slope_AD_1;  // 用于坡道检测
  16. int16  max_v[5],min_v[5];  //电感标定 采集值
  17. int16  Position_transit[4];  //记录过渡点归一化的值
  18. int16  AD_sum[5];
  19. int16  AD_MAX_NUM;   //
  20. int16  position = 2,position_back = 1;
  21. float  max_value,AD_0_max,AD_1_max,AD_2_max,AD_3_max;


  22. /*************************************************************************
  23. *  函数名称   SC_black_Init
  24. *  功能说明: 最大值采样
  25. *  参数说明:         
  26. *  函数返回: 无
  27. *  修改时间:
  28. *  备    注:
  29. *************************************************************************/
  30. void SC_black_Init(void)
  31. {
  32.    uint16  i,j;
  33.    int16   Position_transit_short[4];
  34.    float   sensor_1,sensor_2,sensor_3,sensor_4;
  35.    if(K2)
  36.    {
  37.        LCD_Print(25,2,"Collecting");
  38.        LCD_Print(28,4,"samples...");
  39.    
  40.        max_v[0] = max_v[1] = max_v[2] = max_v[3] = max_v[4] = 0;
  41.        min_v[0] = min_v[1] = min_v[2] = min_v[3] = min_v[4] = 7;  
  42.        for(i=0;i<1200;i++)
  43.        {
  44.            AD_valu[0] = ad_ave(ADC1,AD9,ADC_10bit,6);  //PTC0  通道      
  45.            AD_valu[1] = ad_ave(ADC1,AD8,ADC_10bit,6);  //PTC1  通道     
  46.            AD_valu[2] = ad_ave(ADC1,AD15,ADC_10bit,6); //PTE25 通道     
  47.            AD_valu[3] = ad_ave(ADC1,AD11,ADC_10bit,6); //PTE24 通道
  48.            AD_valu[4] = ad_ave(ADC1,AD13,ADC_10bit,6); //PTE24 通道
  49.            for(j=0;j<5;j++)
  50.            {      
  51.                if(AD_valu[j] > max_v[j])
  52.                {
  53.                    max_v[j] = AD_valu[j];
  54.                    if(j==0)    Position_transit_short[0] =  AD_valu[1];  //记录过渡点 电感值
  55.                    if(j==2)    Position_transit_short[1] =  AD_valu[1];  
  56.                    if(j==3)    Position_transit_short[2] =  AD_valu[4];  
  57.                    if(j==4)    Position_transit_short[3] =  AD_valu[3];  
  58.                }
  59.            }
  60.            delayms(1);           //延时   
  61.        }
  62.        /***************              记录的过渡点归一化                     ******************/
  63.        sensor_1 = (float)(Position_transit_short[0] - min_v[1])/(float)(max_v[1] - min_v[1]);
  64.        if(sensor_1 <= 0.0)  sensor_1 = 0.001;
  65.        if(sensor_1 >= 1.0)  sensor_1 = 1.0;
  66.       
  67.        sensor_2 = (float)(Position_transit_short[1] - min_v[1])/(float)(max_v[1] - min_v[1]);
  68.        if(sensor_2 <= 0.0)  sensor_2 = 0.001;
  69.        if(sensor_2 >= 1.0)  sensor_2 = 1.0;
  70.       
  71.        sensor_3 = (float)(Position_transit_short[2] - min_v[4])/(float)(max_v[4] - min_v[4]);
  72.        if(sensor_3 <= 0.0)  sensor_3 = 0.001;
  73.        if(sensor_3 >= 1.0)  sensor_3 = 1.0;
  74.       
  75.        sensor_4 = (float)(Position_transit_short[3] - min_v[3])/(float)(max_v[3] - min_v[3]);
  76.        if(sensor_4 <= 0.0)  sensor_4 = 0.001;
  77.        if(sensor_4 >= 1.0)  sensor_4 = 1.0;
  78.       
  79.        Position_transit[0] = (int16)(100 * sensor_1);
  80.        Position_transit[1] = (int16)(100 * sensor_2);
  81.        Position_transit[2] = (int16)(100 * sensor_3);
  82.        Position_transit[3] = (int16)(100 * sensor_4);
  83.       
  84.       
  85.        flash_erase_sector(SECTOR_ADM);       //擦除254扇区   
  86.        for(i=0; i<5; i++)                    //电感标定的最大值写入扇区
  87.        {
  88.            flash_write(SECTOR_ADM,i*4,max_v[i]);     
  89.        }  
  90.        for(i=0;i<4;i++)                     //过渡点归一化值写入扇区
  91.        {
  92.           flash_write(SECTOR_ADM,20+i*4,Position_transit[i]);  
  93.        }
  94.    }
  95.    else
  96.    {
  97.        for(i=0;i<3;i++)
  98.        {
  99.           for(j=0;j<5;j++)   //读取五个电感的采样标定的最大值
  100.           {
  101.               max_v[j] = flash_read(SECTOR_ADM,j*4,int16);
  102.           }
  103.           for(j=0;j<4;j++)  //读取过渡点
  104.           {
  105.              Position_transit[j] = flash_read(SECTOR_ADM,20+j*4,int16);
  106.           }
  107.             
  108.           LCD_Print(29,2,"Reading");
  109.           LCD_Print(28,4,"samples...");
  110.           delayms(10);           
  111.        }
  112.    }
  113.    LCD_CLS();            
  114.    Beer_ON;
  115.    delayms(25);  
  116.    Beer_OFF;
  117. }

  118. /*************************************************************************
  119. *  函数名称   Read_ADC
  120. *  功能说明: AD采集
  121. *  参数说明:         
  122. *  函数返回: 无
  123. *  修改时间:
  124. *  备    注:
  125. *************************************************************************/
  126. void Read_ADC(void)
  127. {
  128.      int16  i,j,k,temp;
  129.      int16  ad_valu[5][5],ad_valu1[5],ad_sum[5];
  130.      
  131.      for(i=0;i<5;i++)
  132.      {
  133.          ad_valu[0][i]=ad_ave(ADC1,AD9,ADC_10bit,7);     // ADC0 通道
  134.          ad_valu[1][i]=ad_ave(ADC1,AD8,ADC_10bit,7);     // ADC0 通道
  135.          ad_valu[2][i]=ad_ave(ADC1,AD15,ADC_10bit,7);     // ADC0 通道
  136.          ad_valu[3][i]=ad_ave(ADC1,AD11,ADC_10bit,7);     // ADC0 通道
  137.          ad_valu[4][i]=ad_ave(ADC1,AD13,ADC_10bit,7);     // ADC0 通道
  138.      }
  139.   //////////////////////冒泡排序///////////////////////////////////
  140.      for(i=0;i<5;i++)     //5个电感     
  141.      {
  142.         for(j=0;j<4;j++)  //五个数据排序
  143.         {
  144.            for(k=0;k<4-j;k++)
  145.            {
  146.               if(ad_valu[i][k] > ad_valu[i][k+1])  //前面的比后面的大  则进行交换
  147.               {
  148.                  temp = ad_valu[i][k+1];
  149.                  ad_valu[i][k+1] = ad_valu[i][k];
  150.                  ad_valu[i][k] = temp;
  151.               }
  152.            }
  153.         }
  154.      }
  155.      for(i=0;i<5;i++)    //求中间三项的和
  156.      {
  157.         ad_sum[i] = ad_valu[i][1] + ad_valu[i][2] + ad_valu[i][3];      
  158.         ad_valu1[i] = ad_sum[i] / 3;
  159.      }
  160.   ////////////////////////滑动平均滤波/////////////////////////////
  161.      for(i = 0;i < NM-1;i ++)
  162.      {
  163.          AD_V[0][i] = AD_V[0][i + 1];
  164.          AD_V[1][i] = AD_V[1][i + 1];
  165.          AD_V[2][i] = AD_V[2][i + 1];
  166.          AD_V[3][i] = AD_V[3][i + 1];
  167.          AD_V[4][i] = AD_V[4][i + 1];
  168.      }
  169.      for(i=0;i<5;i++)
  170.      {
  171.          AD_V[i][NM-1] =  ad_valu1[i];
  172.      }
  173.    
  174.      for(i = 0;i < NM;i ++)
  175.      {
  176.          AD_sum[0] += AD_V[0][i];
  177.          AD_sum[1] += AD_V[1][i];
  178.          AD_sum[2] += AD_V[2][i];
  179.          AD_sum[3] += AD_V[3][i];
  180.          AD_sum[4] += AD_V[4][i];
  181.      }
  182.      for(i=0;i<5;i++)  //求平均
  183.      {
  184.          AD_valu[i] = AD_sum[i] / NM;
  185.          AD_sum[i] = 0;   
  186.      }   
  187. }

  188. /*************************************************************************
  189. *  函数名称   Date_analyse
  190. *  功能说明: 数据分析
  191. *  参数说明:         
  192. *  函数返回: 无
  193. *  修改时间:
  194. *  备    注:
  195. *************************************************************************/
  196. void Date_analyse()
  197. {
  198.     int16  i,max_front=0,max_back;
  199.     static int16 max_old = 1,max_crosstalk = 1;
  200.     static int16 position_last = 2;
  201.     float  sensor_1;
  202.    
  203.     Read_ADC();
  204.    
  205.     /*********************归一化处理********************/
  206.     for(i=0;i<5;i++)
  207.     {
  208.        sensor_to_one[i] = (float)(AD_valu[i] - min_v[i])/(float)(max_v[i] - min_v[i]);
  209.        if(sensor_to_one[i]<=0.0)  sensor_to_one[i]=0.001;
  210.        if(sensor_to_one[i]>1.0)  sensor_to_one[i]=1.0;
  211.       
  212.        AD[i] = 100 * sensor_to_one[i];     //AD[i]为归一化后的值  范围为0-100
  213.     }      
  214.        /*******1号电感特殊归一化,用于坡道检测********/
  215.      sensor_1 = (float)(AD_valu[1] - min_v[1])/(float)(max_v[1] - min_v[1]);  
  216.      if(sensor_1 <= 0.0)  sensor_1 = 0.001;
  217.      Slope_AD_1 = 100 * sensor_1;
  218.   ////////////////////////////////////////////////////////////////////
  219.    
  220.       for(i=0;i<3;i++)                 //找出最强的传感器
  221.       {  
  222.         if(AD[max_front]<AD[i]-2)
  223.           max_front=i;
  224.       }
  225.       max_value=AD[max_front];
  226.       
  227.       max_back = (AD[3]>AD[4])? 3:4;  //找后排最强电感
  228.       
  229.       if(max_value < 43)            //丢线时最大值取旧值
  230.       {
  231.         max_front=max_old;
  232.         max_value=AD[max_front];
  233.       }
  234.       else
  235.         max_old=max_front;
  236.       
  237.       if(abs(max_front - max_crosstalk) < 2)  //防串道
  238.       {
  239.            max_crosstalk = max_front;
  240.       }
  241.       else
  242.            max_front = max_crosstalk;
  243.       AD_MAX_NUM = max_front;        //传送速度控制
  244.       
  245.       /****************位置解算************************/
  246.       if(max_front==0 && (AD[1] <= Position_transit[0] - 1))  //已经偏离0号传感器   63为偏离0号传感器时1号传感器的值
  247.       {
  248.             position=0;  
  249.       }   
  250.       else if((max_front==0 && (AD[1] > Position_transit[0] + 1)) || (max_front==1 && (AD[0] - AD[2]) > 1))  //左侧位置  0-1号传感器之间
  251.       {   
  252.             position=1;
  253.             AD_0_max = AD[0];  //记录下此时的3号传感器的值
  254.       }
  255.       else if((max_front==1 && (AD[2] - AD[0]) > 1) || (max_front==2 && (AD[1] > Position_transit[1] + 1)))  //右侧位置  1-2号传感器之间
  256.       {
  257.             position=2;
  258.             AD_2_max = AD[2];  //记录下此时的3号传感器的值
  259.       }
  260.       else if(max_front==2 && (AD[1] <= Position_transit[1] - 1))  //已经偏离3号传感器    70为偏离3号传感器时2号传感器的值
  261.       {        
  262.             position = 3;  
  263.       }  
  264.       //~~~~~~~~~~~~~~~~~~~~~~~ 后排位置解算~~~~~~~~~~~~~~~~~~~//
  265.       if(max_back == 3 && AD[4] <= Position_transit[2] - 1)
  266.       {
  267.            if(AD[4] <= Position_transit[2] - 22)
  268.               position_back = 0;
  269.            if(AD[4] >= Position_transit[2] - 20)
  270.               position_back = 1;
  271.       }
  272.       else  if(max_back == 3 && AD[4] > Position_transit[2] + 1 || max_back == 4 && AD[3] > Position_transit[3] + 1)
  273.       {
  274.            position_back = 2;
  275.       }
  276.       else if(max_back == 4 && AD[3] <= Position_transit[3] - 1)
  277.       {
  278.            if(AD[3] >= Position_transit[3] - 20)
  279.               position_back = 3;
  280.            if(AD[3] <= Position_transit[3] - 22)
  281.               position_back = 4;
  282.       }
  283.       
  284.       if(abs(position - position_last) == 2)  //位置防跳变
  285.            position = position_last;
  286.       position_last = position;
  287.       
  288.      //////弯道内和导线夹角过大导致后面转向不足,此时过渡点强制增大//////////////  
  289.       if(position == 0 && AD_0_max < 75)
  290.       {
  291.           AD_0_max = 75 + abs_f(75 - AD_0_max);   
  292.       }
  293.       else if(position == 3 && AD_2_max < 75)
  294.       {
  295.           AD_2_max = 75 + abs_f(75 - AD_2_max);
  296.       }
  297.       
  298.       /*************计算偏移量*************/
  299.       if(position == 0)   //左侧丢线  
  300.       {
  301.            chazhi = (int16)((AD[1] - abs_f(AD_0_max-AD[0]) - AD_0_max)*1.3)-25;
  302.       }
  303.       else if(position == 1 || position == 2) //处于中间位置
  304.       {
  305.                chazhi = (int16)(AD[2] - AD[0]);           
  306.       }
  307.       else if(position == 3)  //右侧丢线
  308.       {
  309.            chazhi = (int16)((abs_f(AD_2_max-AD[2]) + AD_2_max - AD[1] )*1.5)+30;
  310.       }
  311.       if(Stright_Flag)
  312.       {
  313.           chazhi = (int16)(((AD[2]-AD[0])-(AD[4]-AD[3])/10)*1.3);  //长直道用斜率控制舵机
  314.       }
  315.       if(UPhill_flag)  //上坡时 强制用两侧电感偏移量
  316.       {
  317.           chazhi = (int16)((AD[2] - AD[0]));
  318.       }
  319.       
  320. }
复制代码

三、算法解读
  1. 38    if(K2)
  2. 39    {
  3. 40        LCD_Print(25,2,"Collecting");
  4. 41        LCD_Print(28,4,"samples...");
  5. 42   
  6. 43        max_v[0] = max_v[1] = max_v[2] = max_v[3] = max_v[4] = 0;
  7. 44        min_v[0] = min_v[1] = min_v[2] = min_v[3] = min_v[4] = 7;  
  8. 45        for(i=0;i<1200;i++)
  9. 46        {
  10. 47            AD_valu[0] = ad_ave(ADC1,AD9,ADC_10bit,6);  //PTC0  通道      
  11. 48            AD_valu[1] = ad_ave(ADC1,AD8,ADC_10bit,6);  //PTC1  通道     
  12. 49            AD_valu[2] = ad_ave(ADC1,AD15,ADC_10bit,6); //PTE25 通道     
  13. 50            AD_valu[3] = ad_ave(ADC1,AD11,ADC_10bit,6); //PTE24 通道
  14. 51            AD_valu[4] = ad_ave(ADC1,AD13,ADC_10bit,6); //PTE24 通道
  15. 52            for(j=0;j<5;j++)
  16. 53            {      
  17. 54                if(AD_valu[j] > max_v[j])
  18. 55                {
  19. 56                    max_v[j] = AD_valu[j];
  20. 57                    if(j==0)    Position_transit_short[0] =  AD_valu[1];  //记录过渡点 电感值
  21. 58                    if(j==2)    Position_transit_short[1] =  AD_valu[1];  
  22. 59                    if(j==3)    Position_transit_short[2] =  AD_valu[4];  
  23. 60                    if(j==4)    Position_transit_short[3] =  AD_valu[3];  
  24. 61                }
  25. 62            }
复制代码
图1.gif
没有这个图还真不好讲,了解之前最好要有一定物理认知,图中蓝线为电磁线(实际只有一条,我画了三种位置),1、电磁线与电感(图中红色)垂直有最大感应电动势,平行时最小;2、赛车采集电感值时图中两条黑线(前瞻)左右最大赛道范围摆动,即一定会得到垂直位置,就能得到最大值。
PS:K2是一个按键,即一个io口
检测到k2闭合,(配置初始低电平(下拉),K2按下,接到高电位,检测为高电平1,开始执行)

40        LCD_Print(25,2,"Collecting");
41        LCD_Print(28,4,"samples...");
在OLED显示,提示作用,(25,2):坐标

45        for(i=0;i<1200;i++)

采集执行的时间

47            AD_valu[0] = ad_ave(ADC1,AD9,ADC_10bit,6);  //PTC0  通道      
48            AD_valu[1] = ad_ave(ADC1,AD8,ADC_10bit,6);  //PTC1  通道     
49            AD_valu[2] = ad_ave(ADC1,AD15,ADC_10bit,6); //PTE25 通道     
50            AD_valu[3] = ad_ave(ADC1,AD11,ADC_10bit,6); //PTE24 通道
51            AD_valu[4] = ad_ave(ADC1,AD13,ADC_10bit,6); //PTE24 通道
五个电感采集数值放大后送入AD口,

ad_ave(ADC1,AD9,ADC_10bit,6) 采集6次取均值

重要部分:
  1. 52            for(j=0;j<5;j++)
  2. 53            {      
  3. 54                if(AD_valu[j] > max_v[j])
  4. 55                {
  5. 56                    max_v[j] = AD_valu[j];
  6. 57                    if(j==0)    Position_transit_short[0] =  AD_valu[1];  //记录过渡点 电感值
  7. 58                    if(j==2)    Position_transit_short[1] =  AD_valu[1];  
  8. 59                    if(j==3)    Position_transit_short[2] =  AD_valu[4];  
  9. 60                    if(j==4)    Position_transit_short[3] =  AD_valu[3];  
  10. 61                }
  11. 62            }
复制代码
理解如下:1200次的时间内电感有时间摆动几个周期,即得到了最大值,比如在上面第一条蓝色线位置,此时得到的AD_valu[0]赋给max_v[0],注意这句if(j==0)    Position_transit_short[0] =  AD_valu[1];它把0号电感最大时1号电感的值 AD_valu[1]赋给了Position_transit_short[0];称Position_transit_short[0]为过渡点,后面同理,记下来当某个电感值最大时,另一电感的值。
下面跳到

  1. 225       for(i=0;i<3;i++)                 //找出最强的传感器
  2. 226       {  
  3. 227         if(AD[max_front]<AD[i]-2)
  4. 228           max_front=i;
  5. 229       }
  6. 230       max_value=AD[max_front];
  7. 231      
  8. 232       max_back = (AD[3]>AD[4])? 3:4;  //找后排最强电感

  9. 这提出来目的是为下面服务,以免不知到为什么跳出来最强电感值(这找最大值就不用说了,都能看懂)

  10. 又是一关键部分:

  11. 250       /****************位置解算************************/
  12. 251       if(max_front==0 && (AD[1] <= Position_transit[0] - 1))  //已经偏离0号传感器   63为偏离0号传感器时1号传感器的值
  13. 252       {
  14. 253             position=0;  
  15. 254       }   
  16. 255       else if((max_front==0 && (AD[1] > Position_transit[0] + 1)) || (max_front==1 && (AD[0] - AD[2]) > 1))  //左侧位置  0-1号传感器之间
  17. 256       {   
  18. 257             position=1;
  19. 258             AD_0_max = AD[0];  //记录下此时的3号传感器的值
  20. 259       }
  21. 260       else if((max_front==1 && (AD[2] - AD[0]) > 1) || (max_front==2 && (AD[1] > Position_transit[1] + 1)))  //右侧位置  1-2号传感器之间
  22. 261       {
  23. 262             position=2;
  24. 263             AD_2_max = AD[2];  //记录下此时的3号传感器的值
  25. 264       }
  26. 265       else if(max_front==2 && (AD[1] <= Position_transit[1] - 1))  //已经偏离3号传感器    70为偏离3号传感器时2号传感器的值
  27. 266       {        
  28. 267             position = 3;  
  29. 268       }
复制代码
position是区域,例如,0,1,2三个电感划出来了4个区域,分别为

position=0;

position=1;

position=2;

position=3;
对应图中4个区域

if(max_front==0 && (AD[1] <= Position_transit[0] - 1))

max_front==0说前排3个电感此时0号电感值最大(不是就一定在垂直位置),(AD[1] <= Position_transit[0] - 1)说1号电感的值小于过渡点的值,说明1号电感与漆包线位置距离大于过渡点时距离,漆包线位置只能在0号电感左面,记为

position=0;

else if((max_front==0 && (AD[1] > Position_transit[0] + 1)) || (max_front==1 && (AD[0] - AD[2]) > 1))
同理分析(max_front==0 && (AD[1] > Position_transit[0] + 1))

(max_front==1 && (AD[0] - AD[2]) > 1加上了这个(我自己用的时候没用这个)理解为上了个保险,这个更好理解,1号电感最大时,0号电感值又大于2号,漆包线位置只能在0~1之间。
后面同理,后排电感位置也能分出。

以上就轻松分出了位置,不同的位置对应了车子不同的姿态,再根据电感值差值,或者比值,就可以在不同位置给予不同系数(舵机打角控制 ,电机转速控制),核心是根据五个值分出位置。






回复

使用道具 举报

  • TA的每日心情
    开心
    2021-6-10 15:47
  • 签到天数: 1251 天

    [LV.10]以坛为家III

    6

    主题

    2396

    帖子

    3

    金牌会员

    Rank: 6Rank: 6

    积分
    7534
    最后登录
    2023-3-8
    发表于 2016-9-8 14:42:59 | 显示全部楼层
    顶一个,,
    nxp.png
    nxp2.png
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2021-11-30 16:16
  • 签到天数: 206 天

    [LV.7]常住居民III

    74

    主题

    2793

    帖子

    5

    金牌会员

    Rank: 6Rank: 6

    积分
    7423
    最后登录
    2024-1-28
    发表于 2016-9-8 15:18:14 | 显示全部楼层
    智能车群里的兄弟?
    nxp.png
    来根华子
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    0

    主题

    1

    帖子

    0

    新手上路

    Rank: 1

    积分
    3
    最后登录
    2022-5-30
    发表于 2022-5-30 20:33:46 | 显示全部楼层
    你好老师! 我想问一下您电磁循迹是靠什么端口输出的呀
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-4-19 05:27 , Processed in 0.132929 second(s), 24 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

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