⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 a.c

📁 飞思卡尔智能车中线提取程序 飞思卡尔单片机用于辨别黑白
💻 C
📖 第 1 页 / 共 3 页
字号:
                      {
                         g_WidthError = g_width[k] - g_width[k2] + 6;
                         g_MinWidth = g_width[k] - g_WidthError;
                         if(g_MinWidth < 2)
                         {
                            g_MinWidth = 2;
                         }
                         g_MaxWidth = g_width[k] + g_WidthError + 1;
                         if(g_MaxWidth > 25)
                         {
                            g_MaxWidth = 25;
                         }
                      }
                      //根据黑线的连续性
                      ValidLineError = 12 * (k - n);
                      if(ValidLineError > 36) 
                      {
                         ValidLineError = 36;
                      } 
                      else
                      {
                         ; //ValidLineError keep
                      }        
                      if(g_BlackPositionCenter[k2] > g_BlackPositionCenter[k])  
                      {
                         g_SearchDirection = 1; 
                         g_error = ((g_BlackPositionCenter[k2] - g_BlackPositionCenter[k]) + ValidLineError);
                         g_SearchStart = g_BlackPositionCenter[k] - g_error - g_MaxWidth;
                         if((g_BlackPositionCenter[k2] - g_BlackPositionCenter[k]) > 6)
                         {
                            g_SearchEnd = g_BlackPositionCenter[k] + g_MaxWidth / 2; 
                         }
                         else 
                         {                           
                            g_SearchEnd = g_BlackPositionCenter[k] + g_error + g_MaxWidth;
                         }
                         if(g_SearchStart < 0)
              	         {
              	            g_SearchStart = 0; 
              	         }
              	         if(g_SearchEnd >= MAX_VIDEO_POINT)
              	         {
                            g_SearchEnd = MAX_VIDEO_POINT - 1;
              	         }
                      } 
                      else if(g_BlackPositionCenter[k] >= g_BlackPositionCenter[k2])
                      {
                         g_SearchDirection = 0; 
                         g_error = ((g_BlackPositionCenter[k] - g_BlackPositionCenter[k2]) + ValidLineError);
                         g_SearchStart = g_BlackPositionCenter[k] + g_error + g_MaxWidth;
                          if((g_BlackPositionCenter[k] - g_BlackPositionCenter[k2]) > 6)
                         {
                            g_SearchEnd = g_BlackPositionCenter[k] - g_MaxWidth / 2; 
                         }
                         else 
                         {                           
                            g_SearchEnd = g_BlackPositionCenter[k] - g_error - g_MaxWidth;
                         }
                         if(g_SearchEnd < 0)
              	         {
              	            g_SearchEnd = 0; 
              	         }
              	         if(g_SearchStart >= MAX_VIDEO_POINT)
              	         {
                            g_SearchStart = MAX_VIDEO_POINT - 1;
              	         }           
                      }
                     /* else if(g_BlackPositionCenter[k] == g_BlackPositionCenter[k2])
                      {
                          g_SearchDirection = 1; //left 扫描方向从左至右
                          g_SearchStart = g_BlackPositionCenter[k] - 10;
                          g_SearchEnd = g_BlackPositionCenter[k] + 10;
                          if(g_SearchStart < 0)
              	          {
              	             g_SearchStart = 0; 
              	          }
              	          if(g_SearchEnd >= MAX_VIDEO_POINT)
              	          {
                             g_SearchEnd = MAX_VIDEO_POINT - 1;
              	          }        
                      }
                      else
                      {
                         ;
                      }
                      */
                    
                      cnt = 0;	
              	      if(0 == g_SearchDirection) 
              	      {	         
              	         m = g_SearchStart; 	         
                         while((m > g_SearchEnd) && (cnt < MAX_BLACK_NUM))
                         {
                            if(g_VideoImageDate[n][m] < MIDDLE)
                            {
                               l_BlackStartDot = m;                 
                                  while((g_VideoImageDate[n][m - 1] < MIDDLE) && (m > g_SearchEnd)) 
                                  {
                                     m --;
                                  }
                                  if(((l_BlackStartDot - m + 1) < g_MaxWidth) && ((l_BlackStartDot - m + 1) >= g_MinWidth)) 
                                  {                      
                                     g_BlackPoint[0][cnt] = (l_BlackStartDot + m) / 2;
                                     g_BlackPoint[1][cnt] = l_BlackStartDot - m + 1;
                                     cnt ++;
                                  } 
                                  else
                                  {
                                     ;
                                  }
                                  if(m > 1)
                                  {
                                     m -= 2;
                                  }
                                  else
                                  {
                                     m = 0;
                                  }
                                                  
                            }
                            else
                            {
                               m --;
                            }
                         }                
              	      } 
              	      else if(1 == g_SearchDirection)
              	      {
              	         m = g_SearchStart;
              	         
                         while((m < g_SearchEnd) && (cnt < MAX_BLACK_NUM))
                         {
                            if(g_VideoImageDate[n][m] < MIDDLE)
                            {
                                l_BlackStartDot = m;
                                    while((g_VideoImageDate[n][m + 1] < MIDDLE) && (m < g_SearchEnd))
                                    {
                                       m ++;
                                    } 
                                    if(((m - l_BlackStartDot + 1) < g_MaxWidth) && ((m - l_BlackStartDot + 1) >= g_MinWidth)) 
                                    {
                                       g_BlackPoint[0][cnt] = (l_BlackStartDot + m) / 2;
                                       g_BlackPoint[1][cnt] = m - l_BlackStartDot + 1;
                                       cnt ++;            
                                    } 
                                    else
                                    {
                                       ; 
                                    }
                                    m += 2;  //继续扫描                 
                            }
                            else
                            {
                               m ++ ;
                            }
                         }          
                         
              	      }
              	      
                      for(k2 = 0; k2 < MAX_BLACK_NUM; k2 ++) 
              	      {
                          if((g_BlackPoint[0][k2] < (g_BlackPositionCenter[k] + g_error)) && (g_BlackPoint[0][k2] > (g_BlackPositionCenter[k] - g_error))) 
                          {
                              g_BlackPositionCenter[n] = g_BlackPoint[0][k2];
                              g_width[n] = g_BlackPoint[1][k2];
                              k2 = MAX_BLACK_NUM;
                          } 
                          else 
                          {
                              ;// do nothing
                          } 	     
              	      }
              	      
              	      if(((g_BlackPositionCenter[k] < 10) || (g_BlackPositionCenter[k] >= 110)) && ((k - n) > 3))
              	      { 	        
              	           g_BlackPositionCenter[n] = 180;
              	           g_width[n] = 0;
              	           n = -1; 	        
              	      } 
              	          	      
              	    } 
              		            
              	}
                else
                {
                   ;
                }
//==================计算有效行中心===================
                g_ValidLine = 0;
                g_BlackLineTotal = 0;
                g_DirectionControlLine = 0;                
                for(n = (MAX_VIDEO_LINE - 1); n >= 0; n --) 
                {    
                  //SCI0SendByte(g_BlackPositionCenter[n]);               
                  if(g_BlackPositionCenter[n] != 180)
                  {
                    if(0 == g_ValidLine)
                    {
                       g_DirectionControl = 0;
                    }
                    g_ValidLine ++;                    
                    g_BlackLineTotal += g_BlackPositionCenter[n];
                    if(g_ValidLine <= 26)
                    {
                       g_DirectionControl += g_BlackPositionCenter[n]; 
                    }
                    
                  }
                  
                  if(n == MAX_VIDEO_LINE - 10)
                  {
                    if(g_ValidLine != 0)
                    {
                       g_BottomMiddle = g_BlackLineTotal / g_ValidLine;
                    }
                  }
                  else
                  {
                     ;
                  }               
                }         
                if(g_ValidLine == 0)
                {
                  if(g_BlackMiddle[0] < 20) //判断上一有效场黑线中心靠左还是靠右
		              {
		                 g_BlackMiddle[1] = 0;
		                 g_BlackMiddle[0] = 1;
		                 g_DirectionControl = 0;  
		              } 
		              else if(g_BlackMiddle[0] >= 100) 
		              {
		                 g_BlackMiddle[1] = 119;
		                 g_BlackMiddle[0] = 118;
		                 g_DirectionControl = 119;
		              } 
		              else
		              {
		                 g_BlackMiddle[1] = g_BlackMiddle[0];
		              } 		   
		            } 
                else
                {
                
                  
                  g_BlackMiddle[1] = g_BlackLineTotal / g_ValidLine;
                  g_BlackMiddle[0] = g_BlackMiddle[1];
                  g_DirectionControl /= g_DirectionControlLine;		                  
                }
                
                Speed_Adjust = 0;//(MAX_VIDEO_LINE - g_ValidLine)/3;
                /****舵机转角PID计算*****/
                
                if(g_BlackMiddle[1] < 0) 
                {
                   g_BlackMiddle[1] = 0;
                } 
                else if(g_BlackMiddle[1] > 119) 
                {
                   g_BlackMiddle[1] = 119;
                } 
                else 
                {
                   ;
                }
                sPID.loca_FeedBack = g_DirectionControl;
                PWMDTY67 = 1455 + loca_PIDCalc(&sPID);
                
                /****驱动电机速度PID计算****/
                //确定速度参考值
                if(g_DirectionControl < 60)
                {
                    sPID.vi_Ref = (g_HighestSpeed * 3481 - ((59 - g_DirectionControl) * (59 - g_DirectionControl) * (g_HighestSpeed - g_BasicSpeed))) / 3481 - Speed_Adjust;
                }
                else if(g_DirectionControl >= 60)
                {
                    sPID.vi_Ref = (g_HighestSpeed * 3600 - ((g_DirectionControl - 60) * (g_DirectionControl - 60) * (g_HighestSpeed - g_BasicSpeed)) )/ 3600 - Speed_Adjust;
                }
                else 
                {
                    ;//sPID.vi_Ref = g_HighestSpeed;
                }
                
                //根据中心位置确定驱动电机转速,直道加速,弯道减速
                l_pulse = PACN10;
                //SCI0SendByte(l_pulse&0xFF);
                //SCI0SendByte((l_pulse>>8)&0xFF);
                PACN10 = 0;
                sPID.vi_FeedBack = l_pulse;
                l_tempPWMDTY45 = (500 + V_PIDCalc(&sPID));
                PWMDTY45 = l_tempPWMDTY45;
MovementAdjust = OFF; 
		    	  }
            INTCR_IRQEN = ON;
	      }   
	  }
	  else
	  {
	      //None
	  }		    	  
}
#pragma CODE_SEG DEFAULT               
/* Change code section to DEFAULT. */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -