飛思カルの知能車の電磁グループのパーティションのアルゴリズムの紹介

59637 ワード

前に書いたら:
1、今は学校の学生です.これも初めてブログを書きます.不備なところです.ご了承ください.
2、このアルゴリズムはオリジナルではなく、山東徳州学院の第8回ポプラチーム(PS:個人的な見方では、一部の人が他人のソースを変えて自分のオリジナル行為として軽蔑している)を参考にしています.
3、このアルゴリズムの理解と説明については、机上の空論ではなく、アルゴリズムはすでに私に利用されました.乗用車競技中に良い成績を収めました.
4、今回紹介したのはパスアルゴリズムと知識の普及だけで、後には時間があれば、残りの部分のアルゴリズムと多くのいい考えを紹介します.
5、この方面に関わる人が私と連絡して交流したり、足りないところを指摘してくれたらいいです.
6、転載は出所を説明してください.http://www.cnblogs.com/roc-wwp/p/4848136.html(PS:直接に恩智浦スマートカーに変えた人を見ました.酔っていました.これは学校に行った時に書いたものです.自信がありました.2333)
--------------------------分割線------------------------------------------------------------------------------------------------------------------------------
一、この方面の理解のがなくて見てもいいです.
スマートカーは3つのグループに分けられています.カメラ、光電、電磁気、私が作ったのは電磁気車です.3つの車両はセンサーの違いにあります.だから、パス情報を得る方法も違います.カメラと光電認識はコースの黒い線(白底コース)です.電磁気車はコースの下に埋められた100 mhの電流を入れるワニスの線を検出します.カメラと光電子はセンサーとしてカメラとcdを採用しています.電磁はインダクタを使って漆の線の周りに置くので、インダクタンスの上で誘導電動力が発生します.また、コイル回路を通る磁束の大きさに比例します.また、ワニスの線の周囲の磁気感の強度が違います.そのため、インダクタンスの位置を確認することができます.そのため、車の前に50 cmの展望を設置しました.センサーレイアウトは次の通りです.2列に分けて、前の3つの列に分けて、番号は0、1、2(前の段階には2つの縦方向のインダクタンスをプラスして直角のカーブを助けました.後に八字のインダクタンスに変えました.)後列2個、番号3、4;現在車は異なる位置の誘導電動力の大きさを得ましたが、これらの値は処理できません.2、アナログ信号です.信号が弱いと大きくなります.これはアナログ回路の知識に関わるので、多くは言いません.拡大部分の外周はあなたの設計のが更に良くても1つのもっと良いチップに及ばないで、2つの例があって、1つは私自身のです:前はNE 5532を使って、しかし効果は理想的ではありませんて、多くのフィルタリングを加えて、補償、すべて使って、役に立たないで、ソフトウェアの中で処理した後に更に言うと、後で思い切ってAD620を交換して、感じは春に来ました.高いです..効果は素晴らしいです.多くの付加回路が取り除かれています.板が簡潔になりました.もう一つは先輩の例です.彼は電子デザインコンテストに参加した時、同じ学校のグループがあります.彼のテーマと同じように、ものができたらほぼ同じですが、一等賞を取りました.もう一つの組は二等賞です.違いはフィルタリングです.本校の指導先生は簡単な容量を追加すればいいと言いました.彼は新しいフィルタチップを使っています.信号の最後に出た波形の差が大きいです.(私が担当しているのは主にソフトウェアの部分ですが、ハードウェア回路も全部関連しています.でも、まだ慣れていません.)
拡大を解決するとアナログ信号をデジタル信号に変換します.直接使うのはチップ上のADモジュールです.®-M 4シリーズは、実際には高性能のマクロプロセッサとして扱われています.本当に浪費しています.その後s 12に変更しました.他のグループと衝突したので、K 60は確かにs 12より使いやすいと思います.s 12は自分でレジスタを配置して、カスケードを作って、超周波数を計算して、外部クロックの周波数を計算して、k 60は他の人がライブラリを書いています.つまり、絶えず呼び出しています.(これはちょっと心細いようです.ほほほ)でも、自分でロードモジュールを作ったら、完成車のレイアウトが面倒くさいので、使うしかないです.処理が終わったら、ドアを閉めてアルゴリズムを放します.
二、コアパスアルゴリズム(ソースを敬意を表するために、元の著者のアルゴリズムを置く)
 
  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 
 14 int16  AD_valu[5],AD_V[5][NM],chazhi,chazhi_old;
 15 float  AD[5],sensor_to_one[5];
 16 float  Slope_AD_1;  //       
 17 int16  max_v[5],min_v[5];  //        
 18 int16  Position_transit[4];  //          
 19 int16  AD_sum[5]; 
 20 int16  AD_MAX_NUM;   //
 21 int16  position = 2,position_back = 1;
 22 float  max_value,AD_0_max,AD_1_max,AD_2_max,AD_3_max;
 23 
 24 
 25 /*************************************************************************
 26 *         SC_black_Init
 27 *      :      
 28 *      :         
 29 *      :  
 30 *      :
 31 *        :
 32 *************************************************************************/
 33 void SC_black_Init(void)
 34 {
 35    uint16  i,j;
 36    int16   Position_transit_short[4];
 37    float   sensor_1,sensor_2,sensor_3,sensor_4;
 38    if(K2)
 39    {
 40        LCD_Print(25,2,"Collecting"); 
 41        LCD_Print(28,4,"samples..."); 
 42    
 43        max_v[0] = max_v[1] = max_v[2] = max_v[3] = max_v[4] = 0;
 44        min_v[0] = min_v[1] = min_v[2] = min_v[3] = min_v[4] = 7;  
 45        for(i=0;i<1200;i++) 
 46        {
 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    
 52            for(j=0;j<5;j++) 
 53            {      
 54                if(AD_valu[j] > max_v[j]) 
 55                {
 56                    max_v[j] = AD_valu[j];
 57                    if(j==0)    Position_transit_short[0] =  AD_valu[1];  //         
 58                    if(j==2)    Position_transit_short[1] =  AD_valu[1];  
 59                    if(j==3)    Position_transit_short[2] =  AD_valu[4];  
 60                    if(j==4)    Position_transit_short[3] =  AD_valu[3];  
 61                }
 62            }
 63            delayms(1);           //      
 64        }
 65        /***************                                            ******************/
 66        sensor_1 = (float)(Position_transit_short[0] - min_v[1])/(float)(max_v[1] - min_v[1]); 
 67        if(sensor_1 <= 0.0)  sensor_1 = 0.001;
 68        if(sensor_1 >= 1.0)  sensor_1 = 1.0; 
 69        
 70        sensor_2 = (float)(Position_transit_short[1] - min_v[1])/(float)(max_v[1] - min_v[1]); 
 71        if(sensor_2 <= 0.0)  sensor_2 = 0.001;
 72        if(sensor_2 >= 1.0)  sensor_2 = 1.0; 
 73        
 74        sensor_3 = (float)(Position_transit_short[2] - min_v[4])/(float)(max_v[4] - min_v[4]); 
 75        if(sensor_3 <= 0.0)  sensor_3 = 0.001;
 76        if(sensor_3 >= 1.0)  sensor_3 = 1.0; 
 77        
 78        sensor_4 = (float)(Position_transit_short[3] - min_v[3])/(float)(max_v[3] - min_v[3]); 
 79        if(sensor_4 <= 0.0)  sensor_4 = 0.001;
 80        if(sensor_4 >= 1.0)  sensor_4 = 1.0; 
 81        
 82        Position_transit[0] = (int16)(100 * sensor_1);
 83        Position_transit[1] = (int16)(100 * sensor_2); 
 84        Position_transit[2] = (int16)(100 * sensor_3);
 85        Position_transit[3] = (int16)(100 * sensor_4); 
 86        
 87        
 88        flash_erase_sector(SECTOR_ADM);       //  254      
 89        for(i=0; i<5; i++)                    //            
 90        { 
 91            flash_write(SECTOR_ADM,i*4,max_v[i]);     
 92        }  
 93        for(i=0;i<4;i++)                     //            
 94        {
 95           flash_write(SECTOR_ADM,20+i*4,Position_transit[i]);  
 96        }
 97    }
 98    else 
 99    {
100        for(i=0;i<3;i++)
101        { 
102           for(j=0;j<5;j++)   //               
103           {
104               max_v[j] = flash_read(SECTOR_ADM,j*4,int16);
105           }
106           for(j=0;j<4;j++)  //     
107           {
108              Position_transit[j] = flash_read(SECTOR_ADM,20+j*4,int16);
109           }
110             
111           LCD_Print(29,2,"Reading"); 
112           LCD_Print(28,4,"samples..."); 
113           delayms(10);           
114        }
115    }
116    LCD_CLS();             
117    Beer_ON; 
118    delayms(25);  
119    Beer_OFF;
120 }
121 
122 /*************************************************************************
123 *         Read_ADC
124 *      : AD  
125 *      :         
126 *      :  
127 *      :
128 *        :
129 *************************************************************************/
130 void Read_ADC(void)
131 {
132      int16  i,j,k,temp;
133      int16  ad_valu[5][5],ad_valu1[5],ad_sum[5];
134      
135      for(i=0;i<5;i++)
136      {
137          ad_valu[0][i]=ad_ave(ADC1,AD9,ADC_10bit,7);     // ADC0    
138          ad_valu[1][i]=ad_ave(ADC1,AD8,ADC_10bit,7);     // ADC0    
139          ad_valu[2][i]=ad_ave(ADC1,AD15,ADC_10bit,7);     // ADC0   
140          ad_valu[3][i]=ad_ave(ADC1,AD11,ADC_10bit,7);     // ADC0    
141          ad_valu[4][i]=ad_ave(ADC1,AD13,ADC_10bit,7);     // ADC0    
142      }
143   //////////////////////    ///////////////////////////////////
144      for(i=0;i<5;i++)     //5        
145      {
146         for(j=0;j<4;j++)  //      
147         {
148            for(k=0;k<4-j;k++)
149            {
150               if(ad_valu[i][k] > ad_valu[i][k+1])  //               
151               {
152                  temp = ad_valu[i][k+1];
153                  ad_valu[i][k+1] = ad_valu[i][k];
154                  ad_valu[i][k] = temp;
155               }
156            }
157         }
158      }
159      for(i=0;i<5;i++)    //       
160      {
161         ad_sum[i] = ad_valu[i][1] + ad_valu[i][2] + ad_valu[i][3];       
162         ad_valu1[i] = ad_sum[i] / 3;
163      }
164   ////////////////////////      /////////////////////////////
165      for(i = 0;i < NM-1;i ++)
166      {
167          AD_V[0][i] = AD_V[0][i + 1];
168          AD_V[1][i] = AD_V[1][i + 1];
169          AD_V[2][i] = AD_V[2][i + 1];
170          AD_V[3][i] = AD_V[3][i + 1];
171          AD_V[4][i] = AD_V[4][i + 1];
172      }
173      for(i=0;i<5;i++)
174      {
175          AD_V[i][NM-1] =  ad_valu1[i];
176      }
177     
178      for(i = 0;i < NM;i ++)
179      {
180          AD_sum[0] += AD_V[0][i];
181          AD_sum[1] += AD_V[1][i];
182          AD_sum[2] += AD_V[2][i];
183          AD_sum[3] += AD_V[3][i];
184          AD_sum[4] += AD_V[4][i];
185      }
186      for(i=0;i<5;i++)  //   
187      {
188          AD_valu[i] = AD_sum[i] / NM;
189          AD_sum[i] = 0;   
190      }    
191 }
192 
193 /*************************************************************************
194 *         Date_analyse
195 *      :     
196 *      :         
197 *      :  
198 *      :
199 *        :
200 *************************************************************************/
201 void Date_analyse()
202 { 
203     int16  i,max_front=0,max_back; 
204     static int16 max_old = 1,max_crosstalk = 1;
205     static int16 position_last = 2;
206     float  sensor_1;
207     
208     Read_ADC();
209     
210     /*********************     ********************/
211     for(i=0;i<5;i++) 
212     {
213        sensor_to_one[i] = (float)(AD_valu[i] - min_v[i])/(float)(max_v[i] - min_v[i]); 
214        if(sensor_to_one[i]<=0.0)  sensor_to_one[i]=0.001;
215        if(sensor_to_one[i]>1.0)  sensor_to_one[i]=1.0; 
216        
217        AD[i] = 100 * sensor_to_one[i];     //AD[i]            0-100
218     }      
219        /*******1        ,      ********/
220      sensor_1 = (float)(AD_valu[1] - min_v[1])/(float)(max_v[1] - min_v[1]);  
221      if(sensor_1 <= 0.0)  sensor_1 = 0.001;
222      Slope_AD_1 = 100 * sensor_1;
223   ////////////////////////////////////////////////////////////////////
224     
225       for(i=0;i<3;i++)                 //        
226       {  
227         if(AD[max_front]2)
228           max_front=i;
229       } 
230       max_value=AD[max_front]; 
231       
232       max_back = (AD[3]>AD[4])? 3:4;  //       
233       
234       if(max_value < 43)            //          
235       {
236         max_front=max_old;
237         max_value=AD[max_front]; 
238       }
239       else
240         max_old=max_front;
241       
242       if(abs(max_front - max_crosstalk) < 2)  //   
243       {
244            max_crosstalk = max_front;
245       }
246       else 
247            max_front = max_crosstalk;
248       AD_MAX_NUM = max_front;        //      
249       
250       /****************    ************************/
251       if(max_front==0 && (AD[1] <= Position_transit[0] - 1))  //    0       
252       {
253             position=0;  
254       }   
255       else if((max_front==0 && (AD[1] > Position_transit[0] + 1)) || (max_front==1 && (AD[0] - AD[2]) > 1))  //      0-1      
256       {    
257             position=1; 
258             AD_0_max = AD[0];  //      3      
259       }
260       else if((max_front==1 && (AD[2] - AD[0]) > 1) || (max_front==2 && (AD[1] > Position_transit[1] + 1)))  //      1-2      
261       {
262             position=2;
263             AD_2_max = AD[2];  //      3      
264       }
265       else if(max_front==2 && (AD[1] <= Position_transit[1] - 1))  //    3        
266       {        
267             position = 3;  
268       }  
269       //~~~~~~~~~~~~~~~~~~~~~~~       ~~~~~~~~~~~~~~~~~~~//
270       if(max_back == 3 && AD[4] <= Position_transit[2] - 1)
271       { 
272            if(AD[4] <= Position_transit[2] - 22)
273               position_back = 0;
274            if(AD[4] >= Position_transit[2] - 20)
275               position_back = 1;
276       }
277       else  if(max_back == 3 && AD[4] > Position_transit[2] + 1 || max_back == 4 && AD[3] > Position_transit[3] + 1)
278       {
279            position_back = 2;
280       }
281       else if(max_back == 4 && AD[3] <= Position_transit[3] - 1)
282       {
283            if(AD[3] >= Position_transit[3] - 20)
284               position_back = 3;
285            if(AD[3] <= Position_transit[3] - 22)
286               position_back = 4;
287       }
288       
289       if(abs(position - position_last) == 2)  //     
290            position = position_last;
291       position_last = position;
292       
293      ////////////////////  
294       if(position == 0 && AD_0_max < 75)
295       {
296           AD_0_max = 75 + abs_f(75 - AD_0_max);    
297       }
298       else if(position == 3 && AD_2_max < 75)
299       {
300           AD_2_max = 75 + abs_f(75 - AD_2_max); 
301       }
302       
303       /*************     *************/
304       if(position == 0)   //      
305       {
306            chazhi = (int16)((AD[1] - abs_f(AD_0_max-AD[0]) - AD_0_max)*1.3)-25;
307       }
308       else if(position == 1 || position == 2) //      
309       {
310                chazhi = (int16)(AD[2] - AD[0]);           
311       }
312       else if(position == 3)  //    
313       {
314            chazhi = (int16)((abs_f(AD_2_max-AD[2]) + AD_2_max - AD[1] )*1.5)+30;
315       }
316       if(Stright_Flag)
317       {
318           chazhi = (int16)(((AD[2]-AD[0])-(AD[4]-AD[3])/10)*1.3);  //          
319       }
320       if(UPhill_flag)  //              
321       {
322           chazhi = (int16)((AD[2] - AD[0])); 
323       }
324       
325 }
 
 三、アルゴリズムの解読(本末転倒でないために、前のようにアルゴリズム以外のものよりも多く書くことができません(例えば、移行点がフラッシュに保存されています.)、ソフトウェアフィルタリング――これらについては、もう少しゆっくり話してください.
パスパーティションの中心はここです.
 38    if(K2) 
 39    {
 40        LCD_Print(25,2,"Collecting"); 
 41        LCD_Print(28,4,"samples..."); 
 42    
 43        max_v[0] = max_v[1] = max_v[2] = max_v[3] = max_v[4] = 0;
 44        min_v[0] = min_v[1] = min_v[2] = min_v[3] = min_v[4] = 7; 45 for(i=0;i<1200;i++) 46  { 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    52 for(j=0;j<5;j++) 53  { 54 if(AD_valu[j] > max_v[j]) 55  { 56 max_v[j] = AD_valu[j]; 57 if(j==0) Position_transit_short[0] = AD_valu[1]; //          58 if(j==2) Position_transit_short[1] = AD_valu[1]; 59 if(j==3) Position_transit_short[2] = AD_valu[4]; 60 if(j==4) Position_transit_short[3] = AD_valu[3]; 61  } 62  }
, 。。。

, , ( , ),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    

 52            for(j=0;j<5;j++) 
 53            {      
 54                if(AD_valu[j] > max_v[j]) 
 55                {
 56                    max_v[j] = AD_valu[j];
 57                    if(j==0)    Position_transit_short[0] =  AD_valu[1];  //         
 58                    if(j==2)    Position_transit_short[1] =  AD_valu[1];  
 59                    if(j==3)    Position_transit_short[2] =  AD_valu[4];  
 60                    if(j==4)    Position_transit_short[3] =  AD_valu[3];  
 61                }
 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]    ,    ,            ,      。
225       for(i=0;i<3;i++)                 //        
226       {  
227         if(AD[max_front])
228           max_front=i;
229       } 
230       max_value=AD[max_front]; 
231       
232       max_back = (AD[3]>AD[4])? 3:4;  //       
            ,                (          ,    )

250       /****************    ************************/
251       if(max_front==0 && (AD[1] <= Position_transit[0] - 1))  //    0       63   0     1      
252       {
253             position=0;  
254       }   
255       else if((max_front==0 && (AD[1] > Position_transit[0] + 1)) || (max_front==1 && (AD[0] - AD[2]) > 1))  //      0-1      
256       {    
257             position=1; 
258             AD_0_max = AD[0];  //      3      
259  } 260 else if((max_front==1 && (AD[2] - AD[0]) > 1) || (max_front==2 && (AD[1] > Position_transit[1] + 1))) //     1-2       261  { 262 position=2; 263 AD_2_max = AD[2]; //      3       264  } 265 else if(max_front==2 && (AD[1] <= Position_transit[1] - 1)) //    3     70   3     2       266  { 267 position = 3; 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      (          [      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 。
, 。

, , , , ( , ), 。









転載先:https://www.cnblogs.com/roc-wwp/p/4848136.html