📄 a.c
字号:
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 + -