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

📄 a.c

📁 飞思卡尔智能车中线提取程序 飞思卡尔单片机用于辨别黑白
💻 C
📖 第 1 页 / 共 3 页
字号:
Main.c
/***********************************************************************
**  Copyright (c)  Smartcar Lab of USTB
**----------------------------------------------------------------------
**	Module Name: main.c
**	Module Date: 08/10/2007                         
**	Module Auth: Blizzard,LK,YJC
**  Description: main function of project
**							 
**----------------------------------------------------------------------
**  Revision History:
**  Date:  8/10/2007    
**  Notes:  registers block to 0x0000 
**         Ram to end at 0x3FFF, total 8KB 
**         EEPROM block to end at 0x0fff, total 4KB
***********************************************************************/

/**********************************************************************
--------------------This smartcar individual parameters----------------
1. There are about 19.3 pulses per 20ms from encoder when the smartcar
   is at the speed of 1 m/s.
2. The frequency of PID adjustment is 50Hz.
..........
***********************************************************************/

/*--------------- I N C L U D E S ------------------------------------*/
#include "Schedule/Schedule.h"

/*--------------- M A C R O S ----------------------------------------*/

/*--------------- D E F I N I T I O N --------------------------------*/

/*--------------- D E C L A R A T I O N ------------------------------*/

/*--------------- F U N C T I O N S ----------------------------------*/
/*********************************************************************
Function Name:main                         
Description:  initialize and start Sysmtem 
Inputs:       None               
Outputs:      None                                                   
NOTES:                                                            
*********************************************************************/
void main(void) 
{
    SystemInit();
    SystemStart();
}

/*MAIN_C END*/

模块化程序列表
Port.h/Port.c //单片机IO口初始化
PLL.h/PLL.c//锁相环时钟初始化
SCI.h/SCI.c //串口初始化
IRQ.h/IRQ.c//外部中断初始化
PWM.h/PWM.c//PWM模块初始化
ECT.h/ECT.c//ECT模块初始化
PID.h/PID.c//PID函数定义
Board.h //电路板版本号、板级信息定义
Config.h //相关工程参数定义
S12Def.h//常用宏定义
S12Types.h//与平台无关的变量定义
以上为模块话程序代码,并无特别之处,在此略。

Schedule.h
/***********************************************************************
**  Copyright (c)  Smartcar Lab of USTB
**----------------------------------------------------------------------
**	Module Name: Schedule.h
**	Module Date: 08/10/2007                         
**	Module Auth: Blizzard,LK,YJC
**  Description: schedule of system
**----------------------------------------------------------------------
**  Revision History:
**  Date:		month/day/year    
**  Notes:
*********************************************/

#ifndef SCHEDULE_H
#define SCHEDULE_H

/*--------------- I N C L U D E S ------------------------------------*/
#include "../Heads/Global.h"   
#include "../Drivers/Port.h"
#include "../Drivers/PLL.h"
#include "../Drivers/SCI.h"
#include "../Drivers/ATD.h"
#include "../Drivers/IRQ.h"	
#include "../Drivers/HD7279.h"	   

/*--------------- M A C R O S ----------------------------------------*/
#define ODD_EVEN_STATUS PORTB_BIT5
#define VIDEO_START_LINE   20
#define MAX_VIDEO_LINE     26
#define MAX_VIDEO_POINT    120
#define VIDEO_START_POINT  36 
#define VIDEO_STOP   0x00
#define VIDEO_WAIT   0x01
#define VIDEO_START  0x02
#define VIDEO_SAMPLE 0x03
#define VIDEO_FINISH 0x04
#define VIDEO_ON     0x05
#define MIDDLE       180	  //域值
#define LIMIT         30    //当前场的最后两行中心与上一场中心的差值
#define MAX_BLACK_NUM 4		  //一行黑块最多数目
/*--------------- D E F I N I T I O N --------------------------------*/
/*Cmos Camera*/

extern INT8U g_OddEvenFlag;
extern INT8U g_VideoFlag;
extern INT16U g_VideoLine;
extern INT8U g_VideoStartLine;
extern INT8U g_VideoImageLine;
extern INT8U g_VideoProcessFlag;
extern INT8U g_VideoLineDate[MAX_VIDEO_POINT + VIDEO_START_POINT];
extern INT8U g_VideoImageDate[MAX_VIDEO_LINE][MAX_VIDEO_POINT];
extern INT8U g_SCI0SendVideoImageEnable;

//============提取黑线中心位置======================================
extern INT8S Speed_Adjust;
extern INT8S n;//行循环变量
extern INT8U m;//列循环变量
extern INT8U BackLineValidFlag; //找回黑线有效标志位
extern INT8U l_BlackStartDot;//黑线起始点 		
extern INT8U k; //前一有效行
extern INT8U k2; //前前有效行
extern INT8U NextFlag; //整场有效标志位,如果找到底部两行则标志位置1
extern INT16S g_SearchStart; //一行搜索起始点
extern INT16S g_SearchEnd;	 //一行搜索结束点
extern INT8U g_SearchDirection; //搜索方向
extern INT16S g_BlackMiddle[2];// g_BlackMiddlel[1]代表当前场位置 g_BlackMiddlel[0]代表上一场位置
extern INT16S g_BottomMiddle; //底部十行的中心值,用来确定下一场底部有效行的位置
extern INT8U g_BlackPoint[2][MAX_BLACK_NUM];//用来记录一行的黑点中心值及对应的黑线宽度,假设一行黑块数目不多于4个
extern INT8U cnt;//一行黑块的数目
extern INT8S g_BottomValidLine;//最下面第一个有效行
extern INT8S g_width[MAX_VIDEO_LINE];//用来存各行的黑线宽度,无效行为0
extern INT16S g_BlackPositionCenter[MAX_VIDEO_LINE]; //本场中每行黑点位置数组
extern INT16U g_center; //加权求中心时将每行中心值赋给center,16位的,g_BlackPositionCenter就可以用8位的了,提高了效率。
extern INT8U g_ValidLine;
extern INT16U g_BlackLineTotal; 
extern INT16S g_error;    //前后两行黑线中心的动态差值
extern INT8S ValidLineError;
extern INT8S g_WidthError; 	 //前后两行黑线宽度的动态差值
extern INT8S g_MinWidth; //黑线宽度下限
extern INT16S g_MaxWidth; //黑线宽度上限

extern INT32S g_DirectionControl;
extern INT32S g_DirectionControlLine;
extern INT16U g_coeff[MAX_VIDEO_LINE];  


//extern INT8S g_TopValidLine; //图像第一个有效行
//extern INT8U g_Threshold[MAX_VIDEO_LINE]; //每行动态阈值数组
//extern INT8U g_ValidLineFlag[MAX_VIDEO_LINE];//有效行标志数组,1为有效行,0位无效行
/*Movement control*/
extern INT8U MovementAdjust;
//#define BASIC_SPEED   10  //about XXXm/s
//#define HIGHEST_SPEED 20  //about XXXm/s
extern INT8U g_BasicSpeed;
extern INT32U g_HighestSpeed;

/*Parameter Select*/
#define MAX_STRATEGY 4

/*PID*/
/*Motor speed PID controller parameter*/ 
#define SPEED_KPVALUE 20000		
#define SPEED_KIVALUE 2000
#define SPEED_KDVALUE 120
#define VV_MAX 480000 		
#define VV_MIN -(480000)
#define VV_DEADLINE 0x02	

//Servo angle PID parameter
#define LOCA_KPVALUE 2000
#define LOCA_KIVALUE 0	 														  
#define LOCA_KDVALUE 600 

  
#define LOCA_MAX 120000 		    //最大调节量输出为正负110。
#define LOCA_MIN -(120000)

//#define LOCA_Imax ( 120000 )		//位置PID,积分上限
//#define LOCA_Imin -( 120000 )	//位置PID,积分下限

#define LOCA_DEADLINE 0x04	//位置PID,设置死区范围
 
/*PID structure,include speed information*/									
extern struct PID			
{	
  //servo angle PID parameter
	signed long loca_Ref;		//位置PID,位移设定值
	signed long loca_FeedBack;	//位置PID,位移反馈值,当前位置
	signed long loca_PreError;	//位置PID,前一次,位移误差,ui_Ref - FeedBack
	signed long loca_PreIntegral;	//位置PID,前一次,位移积分项,ui_PreIntegral+ui			
	signed int  loca_Kp;		//位置PID,比例系数	
	signed int  loca_Ki;		//位置PID,积分系数	
	signed int  loca_Kd;		//位置PID,微分系数
	signed long loca_PreU;		//电机控制输出值	
	
	//driver motor PID parameter
	signed int vi_Ref;		
	signed int vi_FeedBack;		
	signed int vi_PreError;	  //vi_Ref - vi_FeedBack
	signed int vi_PreDerror;	//d_error-PreDerror;
	signed long v_Kp;		
	signed int v_Ki;		
	signed int v_Kd;		
	signed long vl_PreU;		
}sPID;


/*--------------- D E C L A R A T I O N ------------------------------*/
void SystemInit(void);
void SystemStart(void);


/*--------------- D E C L A R A T I O N ------------------------------*/
/*PID fuctions*/
signed int loca_PIDCalc(struct PID *pp );
signed int V_PIDCalc(struct PID *pp );
void ServoPIDInit(void);
void SpeedPIDInit (void);
#endif /* SCHEDULE_H */

Schedule.c
/***********************************************************************
**  Copyright (c)  Smartcar Lab of USTB
**----------------------------------------------------------------------
**	Module Name: Schedule.c
**	Module Date: 08/10/2007                         
**	Module Auth: Chenxi
**  Description: schedule of system
**----------------------------------------------------------------------
**  Revision History:
**  Date:		month/day/year    
**  Notes:
**  根据上一行黑点位置确定本行黑点位置的扫描范围还没做,想不好怎么处理,暂时留下
***********************************************************************/

/*--------------- I N C L U D E S ------------------------------------*/
#include "Schedule.h" 


/*--------------- M A C R O S ----------------------------------------*/

/*--------------- D E F I N I T I O N --------------------------------*/

/*--------------- D E C L A R A T I O N ------------------------------*/

/*--------------- F U N C T I O N S ----------------------------------*/

/***********************************************************************
Function Name:SystemInit                          
Description:  initialize Sysmtem 
Inputs:       None               
Outputs:      None                                                   
NOTES:                                                            
***********************************************************************/
void SystemInit(void)
{
    INT8U i;
    INT8U j;    
    for(i = 0; i < MAX_VIDEO_LINE; i++)
    {
      g_coeff[i] = (MAX_VIDEO_LINE - i)
      for(j = 0; j < MAX_VIDEO_POINT; j++)
      {
        g_VideoImageDate[i][j] = 0xEF;
      }
    }
    
    g_BlackMiddle[0] = 60;
    g_BlackMiddle[1] = 60;
    g_BottomMiddle = 60;
    g_BottomValidLine = MAX_VIDEO_LINE - 1;

    DisableInterrupts;    //ALL INTERRUPT OFF
    INTCR_IRQEN = OFF;    //IRQ OFF
    PLLInit();
    PortInit();
    init_7279();
    ServoPIDInit();
    SpeedPIDInit();
  //Initialize IRQ  
#if IRQ_EN
    IRQInit(); 
#endif							 
  //Initialize ATD
#if ATD_EN  
    ATDInit();																
#endif
  //Initialize SCI
#if SCI_EN
    SCI0Init();
#endif      
  //Initialize PWM
#if PWM_EN
    PWM45Init();
    PWM67Init();
#endif	 
  //Initialize ECT
#if ECT_EN
    ECTInit();
#endif

⌨️ 快捷键说明

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