main.c
来自「通过智能车上的CCD摄像头采集道路状况」· C语言 代码 · 共 1,391 行 · 第 1/3 页
C
1,391 行
#include <hidef.h> /* common defines and macros */
#include <mc9s12dg128.h> /* derivative information */
#pragma LINK_INFO DERIVATIVE "mc9s12dg128b"
#define SAMPLENUM 165
#define VIDEO_LEFT 20
#define VIDEO_RIGHT 158
#define SAMPLELINE 30
#define VIDEO_CENTER 89
#define SERVO_CENTER 3390
#define SERVO_RIGHT 2900
#define SERVO_LEFT 3880
#define THRESHOLD 169
void BUSCLK_init(void);
void Comparer(void);
void Init_Capture(void);
void ImageGetting(void);
unsigned char GetLine(void);
void Init_servo(void);
void Init_motor(void);
void ServoControl(void);
void SpeedSample(void);
/////////////////
void SpeedControl0(void);
void SpeedControl1(void);
void SpeedControl2(void);
void SpeedControl3(void);
//////////////
void DealOneLine(unsigned char LineNum);
void bottom (void);
void Switch(void) ;
void Brake(void);
void FarLine(unsigned char row);
static unsigned char ren,SkipNum1;
static unsigned char Image[SAMPLELINE][SAMPLENUM];
static unsigned char GuideLine[SAMPLELINE] ;
unsigned char DoDealOneLine = 0;
unsigned char DealLineNum;
unsigned char stop=1; ///////////// /////////////////////////
unsigned int Time=400;
unsigned int jishi=0;
static char ImageGood[SAMPLELINE];
unsigned char Samplespeed=0;
unsigned int servoScale=SERVO_CENTER;
unsigned int Last_servoScale=SERVO_CENTER;
unsigned int hao;
unsigned char Image_good=0;
signed char top;
unsigned char startflag=0;
unsigned int startNum=0;
unsigned char speedFlag=0;
unsigned char choose=0;
unsigned char Kp = 7;
unsigned char Kd = 7;
unsigned char s1=0;
unsigned char s2=0;
unsigned char safe=0;
unsigned char feng=0;
unsigned char speed=0;
unsigned char SendImage;
unsigned char Begin=0;
unsigned char get=0;
unsigned char know=0;
unsigned char first=0;
unsigned char sheng=0;
int angle=0;
int LastAngle=0;
int AngleWay=0;
int errWay1,errWay2,errWay;
//*************************Declare******************************************//
#pragma CODE_SEG __NEAR_SEG NON_BANKED
/*******************Field sync interrupt************************/
interrupt void Fieldsync(void) { //CAPTURE ISR、场中断 // PT6
TFLG1_C6F=1; //clear场同步interrupt flag
hao=0; ren=0;
SkipNum1=0;
TFLG1_C2F=1; //START ONE FRAME
TIE_C2I=1;
}
/*********************Row sync interrupt**********************/ // PT2
interrupt void RowSync(void) { // 行中断
// register unsigned char i;
//register unsigned char *p;
register unsigned char DoSampleLine=0;
TFLG1_C2F=1;//清除行中断标志
if(hao%80==0) {
speedFlag=1;
Samplespeed=PACN32; //5ms for motor
PACN32=0;
}
hao++;
if(hao<46) { //46
DoSampleLine = 0; //消隐信号
}
else if(hao<78) {
SkipNum1++;
if(SkipNum1==3) {
DoSampleLine = 1; //0---9 //48+3x
SkipNum1 = 0;
}
}
else if(hao<272) {
if((hao-78)%10==0)
DoSampleLine = 1; //10---29 //78+10x
}
if(DoSampleLine==1) {
/* p=&Image[ren][0];
for (i=SAMPLENUM;i>0;i--)
// while(ATD0STAT0_SCF==0);
*p++= PORTAD0_PTAD5; */
_asm{
LDAB #165
LDAA ren
MUL
ADDD #Image
XGDX
LDAB #165
SAMPLE: LDAA PORTAD0
ANDA #$20
STAA 1,X+
NOP
NOP
NOP
NOP
NOP
DBNE B,SAMPLE
}
DoDealOneLine=1;
DealLineNum =ren;
ren++;
}
}
#pragma CODE_SEG DEFAULT
// *******************超频至44M****************************//
void BUSCLK_init(void){
REFDV=0x02;
SYNR= 0x0A; //busclk=44M
while(!(CRGFLG_LOCK)) ;
CLKSEL=0x80;
}
//******************Speed Sample**************************// // PT7
void SpeedSample(void) {
PACTL_PAEN=1;
PACTL_PAMOD=0; //PULSE ACCUMULATOR MODE
PACTL_PEDGE=0; //COUNT ON RISING EDGE
}
//****************************拨码开关*********************************//
void Switch(void) {
if((PORTB&0x0f)==0) //时间选择
Time=250; //6s
else if((PORTB&0x0f)==1)
Time=350; //7s
else if((PORTB&0x0f)==2)
Time=400; //8s
else if((PORTB&0x0f)==3)
Time=450; //9s
else if((PORTB&0x0f)==4)
Time=500; //10s
else if((PORTB&0x0f)==5)
Time=550; //11s
else if((PORTB&0x0f)==6)
Time=600; //12s
else if((PORTB&0x0f)==7)
Time=650; //13s
else if((PORTB&0x0f)==8)
Time=700; //14s
else if((PORTB&0x0f)==9)
Time=750; //15s
else if((PORTB&0x0f)==10)
Time=800; //16s
else if((PORTB&0x0f)==11)
Time=850; //17s
else if((PORTB&0x0f)==12)
Time=900; //18s
else if((PORTB&0x0f)==13)
Time=950; //19s
else if((PORTB&0x0f)==14)
Time=1000; //20s
else //if((PORTB&0x0f)==15)
Time=1050; //21s
//get=(PTS&3); //速度选择
if((PTS&3)==0)
choose=0;
else if((PTS&3)==1)
choose=1;
else if((PTS&3)==2)
choose=2;
else
choose=3;
}
//****************PWM1:OUTPUT OF SERVO PWM SIGNAL****************************//
void Init_servo(void){
servoScale=SERVO_CENTER; //SERVO_CENTER= 1510 ,使舵机处于正中间的PWM值
angle=0;
LastAngle=0;
Last_servoScale=SERVO_CENTER;
PWMSCLB=10; //SB=44M/2*10=2.2M
PWMCLK|=0X0C; //clock source from clock sb
PWMPRCLK|=0X00; //prescale clock SB to 44M
PWMCTL=0X20; //CONNECT CHANEL2 AND CHANEL3
PWMPER23=20000; //PRE 110hz
PWMDTY23=SERVO_CENTER; //5% //23.5% 1600 1350
PWMPOL|=0X08; //
PWME|=0X08; //ENABLE PWM3
}
//***************************DC motor initial**********************************//
void Init_motor(void){
PWMSCLA=200; //SA=22M/(200*2)=55K
PWMCLK_PCLK1=1; //clock source from clock sA
PWMPRCLK|=0X01; //prescale clock sA to 1mhz 44m/2=22M
PWMPER1=100; //550Hz
PWMDTY1=80;
PWMPOL_PPOL1=1;
PWME_PWME1=1; //ENABLE PWM1
}
//******************AD初始化**************************//
void Comparer(void) {
PWMPRCLK|=0X01; //prescale clockA to 1mhz 44m/2=22M //PWM5做比较门限
PWMCLK_PCLK5=0; //clock source from clockA
PWMPOL_PPOL5=1;
PWMPER5=100; //220K
PWMDTY5=43; //比较门限为2.15V
PWME_PWME5=1; //ENABLE PWM5
////////////////
PWMPRCLK|=0X00; //prescale clock SB to 44M
PWMCLK_PCLK7=0; //clock source from clockB
PWMPOL_PPOL7=1;
PWMPER7=4; //11M
PWMDTY7=2; //50%
PWME_PWME7=1; //ENABLE PWM5
}
////////////////////////////////////////////
void AD_init(void) {
// char t;
// ATD0CTL2=0XC0; //启动转换,禁止中断
//t=6;
// while(t>0)
//t--;
//ATD0CTL3=0X08; //转换序列
//ATD0CTL4=0X80; //8位AD转换
ATD0DIEN_IEN5=1;
//ATD0CTL5=0XA4;
}
/*******************AD initial************************/
void Init_Capture(void) {
TSCR1_TEN=1; //ENABLE TIMER
TCTL3_EDG6A=1; // capture rising edge first
TCTL3_EDG6B=0;
TCTL4_EDG2A=1;
TCTL4_EDG2B=0;
HPRIO=0XE2;
TIE_C6I=1; //ENABLE CAPTURE INTERRUPT
TIE_C2I=0;
}
/******************Image sample*************************/
void ImageGetting(void) {
Comparer();
AD_init();
Init_Capture(); //START SAMPLING
for(;;){
do {
if(DoDealOneLine==1){
if (DealLineNum>9) {
DealOneLine(DealLineNum); //寻找起跑线并引导线
DoDealOneLine = 0;
}
} //////////////////采图像并处理
if(stop<3) {
if(speedFlag==1){
if(choose==0)
SpeedControl0(); //任高速
else if(choose==1)
SpeedControl1(); //任低速
else if(choose==2)
SpeedControl2(); //最高速
else
SpeedControl3(); //高速
speedFlag=0;
}
}
else {
Brake();//速度控制
}
}while(DealLineNum<29) ; //One frame finished
TIE_C2I=0;
DealLineNum=0;
ServoControl(); //控制舵机
///////////////////////////////stop line
if((servoScale<3440&&servoScale>3340)&&(Begin==0)){ //直道才识别 3390
sheng++;
if(sheng>10){
sheng=0;
if((top==2)&&(startflag==1)&&(AngleWay<4)&&(safe==0)) {
Begin=1;
// PORTA=0xff;
know++; //起跑线识别次数
}
}
}
else
sheng=0 ;
if(Begin==1) {
first=1;
startNum++ ;
//if(startNum>20)
// PORTA=0;
}
if(first==1)
jishi++; //从第一次识别开始计时
if(stop<2){
if(startNum>Time){
startNum=0;
startflag=0;
stop++;
Begin=0;
}
}
else if(stop<3){
if(startNum>15)
stop++;
}
////////////////////////
/* if((jishi>(Time+200))&&(know<2)){ //如果在延时的4s后还没有第二次识别,则在剩余时间内不识别
stop=2;
safe=1;
}
if((jishi>(2*Time+30))&&(safe==1)){
stop=2;
safe=0; //在延时的两倍时间后再次识别,一次就停
}
*/
///////////////////////////////stop line
}
}
//**************************************************//
void DealOneLine(unsigned char LineNum){ //黑为0,白为1
unsigned char *p;
unsigned char i;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?