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

📄 che_free.c

📁 飞思卡尔智能车的程序。红外循迹
💻 C
字号:
/** ###################################################################
**     Filename  : che_free.C
**     Project   : che_free
**     Processor : MC9S12DG128BCPV
**     Version   : Driver 01.11
**     Compiler  : Metrowerks HC12 C Compiler
**     Date/Time : 2008-3-2, 下午 04:53
**     Abstract  :
**         Main module.
**         Here is to be placed user's code.
**     Settings  :
**     Contents  :
**         No public methods
**
**     (c) Copyright UNIS, spol. s r.o. 1997-2005
**     UNIS, spol. s r.o.
**     Jundrovska 33
**     624 00 Brno
**     Czech Republic
**     http      : www.processorexpert.com
**     mail      : info@processorexpert.com
** ###################################################################*/
/* MODULE che_free */

/* Including used modules for compiling procedure */
#include "Cpu.h"
#include "Events.h"
#include "PWM8Di.h"
#include "TI1.h"
#include "AD2.h"
#include "AD3.h"
#include "PWM8h.h"
#include "PWMd.h"
#include "IEE1.h"
#include "TI2.h"
/* Include shared modules, which are used for whole project */
#include "PE_Types.h"
#include "PE_Error.h"
#include "PE_Const.h"
#include "IO_Map.h"
  void IO_init(void);
 void dsend(char cha);
 void isend(char cha);
 void delay(unsigned int timer);
 void xianshi(unsigned int shu);
 byte timer2=0;
 byte timerover=0;
 unsigned int pwm;
 int  distance[9],distance_ave,distance_ave1;  //分别用于 存黑线离每一个红外管距离,前一时间的  
 int  distance_d1,distance_d2,distance_dji;
 float kd,kp;
 unsigned int distance_k;
 //***********************************用于积分的程序
void TI1_OnInterrupt(void)
{   //PORTB++; 
    distance_d2=distance_d1; 
    distance_d1=distance_ave;
    distance_dji=(distance_d1-distance_d2);
}   
 //*************************************************
void main(void)
{ byte a=0,pansha=0;
  static byte b=0;
   //,speed; 
   int i;        //测得出的实际电压值
  
  byte vmax[9],vmin[9],vave[9],v[9];    //最大电压,最小电压,平均电压
  byte heishu=0;
  char k1,k2,jizun;                     //k1为曲率系数,k2为偏移中线                  
  
  /*** Processor Expert internal initialization. DON'T REMOVE THIS CODE!!! ***/
  PE_low_level_init();
  /*** End of Processor Expert internal initialization.                    ***/
  /* Write your code here */
  //****************************初始化各种参数*************
    IO_init();
    jizun=4;
  	isend(1);
    isend(56);      
    isend(14);
    isend(128); 
    distance_k=400;
    isend(1);
  kd=1;
  kp=1.2;
  k1=4;
  k2=4;
  /*for(i=0;i<6;i++){
  lujing[i]=4;  
  }  */

  for(i=0;i<9;i++){
     vmax[i]=0x00;
     vmin[i]=0xFF;
     vave[i]=0x00;
  }
  
  PWMDTY01=55350;    //舵机
 //******************读取存储的数据********************** 
  for(i=0;i<9;i++){
     a=IEE1_GetByte(0x1800+i,&vmax[i]);          //把平均电压从EEPROM中读出
     a=IEE1_GetByte(0x180a+i,&vmin[i]);
  }
  
  a=IEE1_GetByte(0x1809,&PWMDTY2);
  //a=IEE1_GetWord(0x1813,&distance_k);
  //a=IEE1_GetByte(0x1815,&k1);
  //a=IEE1_GetByte(0x1816,&k2);
  //a=IEE1_GetWord(0x1817,&distance_ave);
  //a=IEE1_GetWord(0x1819,&distance_ave1);
  a=IEE1_GetWord(0x181b,&PWMDTY01);
  
  /*if(distance_k<0)
      distance_k=200;*/
  a=AD2_Start();
  a=AD3_Start();
  //********************************************************
  //********************************************************
  //******************防掉电程序**************************
  
  //***************把电压化为0-distace_k之间的数据***************************
  distance_k=100;   
     for(i=0;i<9;i++){
       if(i<8)
        			a=AD2_GetChanValue8(i,&v[i]);
       else if(i==8)
        		  a=AD3_GetChanValue8(i-8,&v[i]);
  		 
     }
     
     for(i=0;i<9;i++){
        if(v[i]<vmin[i])
          v[i]=vmin[i];
        if(v[i]>vmax[i])
          v[i]=vmax[i];
        distance[i]=distance_k-(v[i]-vmin[i])*distance_k/(vmax[i]-vmin[i]);//(i-4)*115;
        
     }
     //*********************确定黑线在第几个红外管下面****************************
     heishu=0;  
     for(i=0;i<9;i++){
        if(distance[i]<20)
            heishu++;
        if(distance[i]<distance[k1]){
            k1=i; 
        }  
     }
     //********************由多个红外算出黑线的精确位置***********************************
  	 if(heishu<4 ){ 	    
  	    k2=k1;
        if((k1+1)>8)
            distance_ave=(k1-1)*100+distance[k1-1];
        else if((k1-1)<0)
            distance_ave=(k1+1)*100-distance[k1+1];
        else    
            distance_ave=((k1+1)*100-distance[k1+1]+(k1-1)*100+distance[k1-1])/2; 	 
       
        if(k1==0)
          distance_ave=(distance_ave+(k1)*100+distance[k1])/2;
        else if(k1==8)
          distance_ave=(distance_ave+(k1)*100-distance[k1])/2;
        else if(distance[k1-1]<distance[k1+1] )
          distance_ave=(distance_ave+(k1)*100-distance[k1])/2; 
        else
          distance_ave=(distance_ave+(k1)*100+distance[k1])/2;
        
     
  //*************************位置给出舵机控制量***********************************************************************   
        // PWMDTY01=55950-distance_ave*10/7;//-distance_dji;
         PWMDTY01=55250-kp*(distance_ave-400);
         if(PWMDTY01<54740)
           PWMDTY01=54740;
         if(PWMDTY01>55850)
           PWMDTY01=55850;          
         distance_ave1=distance_ave;
     }
     
     //**********************************
     
     
  //********************************************************
  //*******************************************************
  //******************正式程序**************************
   
  for(;;){
     distance_k=100;
     //***************把电压化为0-distace_k之间的数据***************************
     
     for(i=0;i<9;i++){
       if(i<8)
        			a=AD2_GetChanValue8(i,&v[i]);
       else if(i==8)
        		  a=AD3_GetChanValue8(i-8,&v[i]);
  		 
     }
     
     for(i=0;i<9;i++){
        if(v[i]<vmin[i])
          v[i]=vmin[i];
        if(v[i]>vmax[i])
          v[i]=vmax[i];
        distance[i]=distance_k-(v[i]-vmin[i])*distance_k/(vmax[i]-vmin[i]);//(i-4)*115;
        
     }
     //*********************确定黑线在第几个红外管下面****************************
     heishu=0;  
     for(i=0;i<9;i++){
        if(distance[i]<40)
            heishu++;
        if(distance[i]<distance[k1]){
            k1=i; 
        }  
     }
     //********************由多个红外算出黑线的精确位置***********************************
  	 if(heishu<4 & heishu>0 & k1-k2>-3 & k1-k2<3){
  	    k2=k1;
        if((k1+1)>8)
            distance_ave=(k1-1)*100+distance[k1-1];
        else if((k1-1)<0)
            distance_ave=(k1+1)*100-distance[k1+1];
        else    
            distance_ave=((k1+1)*100-distance[k1+1]+(k1-1)*100+distance[k1-1])/2; 	 
       
        if(k1==0)
          distance_ave=(distance_ave+(k1)*100+distance[k1])/2;
        else if(k1==8)
          distance_ave=(distance_ave+(k1)*100-distance[k1])/2;
        else if(distance[k1-1]<distance[k1+1] )
          distance_ave=(distance_ave+(k1)*100-distance[k1])/2; 
        else
          distance_ave=(distance_ave+(k1)*100+distance[k1])/2;
        
     
  //*************************位置给出舵机控制量***********************************************************************   
       if(distance_ave1 - distance_ave>5 |distance_ave - distance_ave1>5) { 
         //if(distance_ave1 - distance_ave<100  | distance_ave - distance_ave1<100 ){  
           PWMDTY01=55250-kp*(distance_ave-400);//-kd*distance_dji;
           if(PWMDTY01>55600 |PWMDTY01<54900){
              if((PWMDTY01>55250 & pansha==1)|(PWMDTY01<55250 & pansha==0)){
                a=TI2_Enable();
                PTJ_PTJ0=1;
                PORTB++;
              }
              if(PWMDTY01>55250)
                pansha=0;
              else if(PWMDTY01<55250)
                pansha=1;
              
           }
           if(PWMDTY01<54740)
              PWMDTY01=54740;
           if(PWMDTY01>55850)
              PWMDTY01=55850;  
           distance_ave1=distance_ave;
         //}
       }
     }
     
   //***********************按键*********************  
     if(PORTE_BIT0==0) {
       
        while(PORTE_BIT0==0);
    		//a=AD2_Stop();
        PORTB++;
        isend(1);
        for(i=0;i<9;i++){
          vmax[i]=0x00;
          vmin[i]=0xff;
        }
        while(PORTE_BIT1==1)					
      	{ 
      	  for(i=0;i<14000;i++);
      	  for(i=0;i<9;i++){
      		  if(i<8)
      			a=AD2_GetChanValue8(i,&v[i]);
      		  else if(i==8)
      		  a=AD3_GetChanValue8(i-8,&v[i]);
      			if(a==ERR_OK){
      			  PORTB++; 
        			if(v[i]>vmax[i])
        				vmax[i]=v[i];
        			if(v[i]<vmin[i])
        				vmin[i]=v[i]; 
      			}
      		}
      	} 
      	for(i=0;i<9;i++)                      //把平均电压存在EEPROM中去
      	{     
      	    a=IEE1_SetByte(0x1800+i,vmax[i]);
      	    a=IEE1_SetByte(0x180a+i,vmin[i]);
      	}   
     }
     if(PORTE_BIT1==0) {
        while(PORTE_BIT1==0); 
        isend(1);
        
       
        //PWMDTY01=PWMDTY01+50;
        xianshi(PWMDTY01);
        if(distance_ave>0)
        xianshi(distance_ave);
        else {
          dsend('-'); 
          xianshi(-distance_ave); 
        }
        if(k1>0)
        xianshi(k1);
        else {
          dsend('-'); 
          xianshi(-k1); 
        }
        isend(192);
        kd++;
         xianshi(kd);
         xianshi(distance_d1);
         xianshi(distance_d2);
        if(distance_dji>0)
          xianshi(distance_dji);
        else 
          xianshi(-distance_dji);
        
     }
          
     if(PORTE_BIT2==0) {
     // isend(1);
      // PWMDTY01=PWMDTY01-50;
      // xianshi(PWMDTY01);
        isend(1);
        //xianshi(v[8]);
        ///xianshi(v[7]);
        //xianshi(v[6]);
        //xianshi(v[5]);
        
        
       
        xianshi(distance[8]);
        xianshi(distance[7]);
        xianshi(distance[6]);
        xianshi(distance[5]);
        isend(192);
        /* distance_k=distance_k-20;
       
         a=IEE1_SetWord(0x1813,distance_k);
         xianshi(distance_k); */
        //PWMDTY01=PWMDTY01+50;
        PWMDTY2++;
        if(PWMDTY2>5)
            PWMDTY2=0;
        a=IEE1_SetByte(0x1809,PWMDTY2);
        xianshi(PWMDTY2);
    /*    kd++;
          xianshi(kd);
          xianshi(distance_d1);
          xianshi(distance_d2);
        if(distance_dji>0)
          xianshi(distance_dji);
        else 
          xianshi(-distance_dji);   */
        //xianshi(PWMDTY01);
       
        PORTB++;
       
       while(PORTE_BIT2==0);
     }
     if(PORTE_BIT3==0) {
       
       PORTB++;
       isend(1);
       /*xianshi(v[3]);
       xianshi(v[2]);
       xianshi(v[1]);
       xianshi(v[0]);*/
       xianshi(distance[3]);     
       xianshi(distance[2]); 
       xianshi(distance[1]);
       xianshi(distance[0]);
       
       isend(192);
      
       
       PWMDTY2--;
           if(PWMDTY2<1)
              PWMDTY2=5;
       a=IEE1_SetByte(0x1809,PWMDTY2);
        xianshi(PWMDTY2);
        kd--;
        xianshi(kd);
      
       while(PORTE_BIT3==0);
     }
  
  }
  
  /*** Processor Expert end of main routine. DON'T MODIFY THIS CODE!!! ***/
  for(;;){}
  /*** Processor Expert end of main routine. DON'T WRITE CODE BELOW!!! ***/
} /*** End of main routine. DO NOT MODIFY THIS TEXT!!! ***/
 
 

void IO_init(void){
    DDRH=0XFF;
    DDRJ=0XFF;
    DDRB=0XFF;
    DDRE=0X00; //输入
    PUCR_PUPEE=0XFF;    
    PTJ_PTJ0=0;  //控制电机的刹车,前进
    PORTE_BIT0=1;
    PORTE_BIT1=1;
    PORTE_BIT2=1;
    PORTE_BIT3=1;

}

void xianshi(unsigned int shu) {
 if(shu/10000!=0) {
  dsend(shu/10000+48); 
 }
 if((shu%10000)/1000!=0 | shu/10000!=0) {
  dsend((shu%10000)/1000+48); 
 }
 dsend((shu%1000)/100+48);
 dsend((shu%100)/10+48);
 dsend(shu%10+48);
 dsend(32);
}
void dsend(char cha)
{ PTH=255;
	PTJ_PTJ6=1;
	;
	PTJ_PTJ7=1;
	PTH=cha;
	PTJ_PTJ7=0;
	delay(700);
}
void isend(char cha)
{ PTH=255;
    PTJ_PTJ6=0;
	;
	PTJ_PTJ7=1;
	PTH=cha;
	PTJ_PTJ7=0;
	delay(5700);
}
void delay(unsigned int timer){
 unsigned int i ;
 for(i=0;i<timer;i++);
 
}




/* END che_free */
/*
** ###################################################################
**
**     This file was created by UNIS Processor Expert 2.96 [03.76]
**     for the Freescale HCS12 series of microcontrollers.
**
** ###################################################################
*/

⌨️ 快捷键说明

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