?? main.c
字號:
#include <hidef.h> /* common defines and macros */
#include <string.h>
#include <mc9s12dg128.h> /* derivative information */
#pragma LINK_INFO DERIVATIVE "mc9s12dg128b"
/*PortB各管腳名稱定義*/
#define VSYN PORTB_BIT0
#define DRV1 PORTB_BIT1
#define DRV2 PORTB_BIT2
#define V_en PORTB_BIT3
#define LED_en PORTB_BIT4
#define EF PORTB_BIT5
#define R_en PORTB_BIT6
#define FifoReset PORTB_BIT7
#define LED PTP_PTP7
/*系統(tǒng)常量定義*/
#define SIZE_X 60 //定義列數(shù)
#define SIZE_Y 12 //定義行數(shù)
#define DATASIZE 720 //圖像總點數(shù)
#define SERVO_MID 4380 //舵機中心位置 4400
#define SERVO_R 1250 //右極限 1230
#define SERVO_L -1250 //左極限 -1250
//*********************
// 全局變量定義
//*********************
//系統(tǒng)參數(shù)類
unsigned char AutoFlag=1; //手自動循線標志 1:自動 0:手動
unsigned char DebugEn=1; //調試信息使能
unsigned char CaptureCommand; //串口命令
unsigned char BadFrameCnt; //壞幀計數(shù)
unsigned char ErrLineCnt; //錯誤行計數(shù)
unsigned int time=0; //系統(tǒng)計時
//圖像數(shù)據(jù)
unsigned char VideoData[SIZE_Y][SIZE_X]; //圖像信息存儲空間
unsigned char Threshold=60; //兩像素之間灰度差閾值 80
//控制參數(shù)
signed char diff[SIZE_Y]; //每行黑線與中心的偏差
unsigned char BadFrame=0; //壞幀標志位
//最小二乘法擬合參數(shù)
signed int a,b;
unsigned long Ee2;
//小車轉角控制參數(shù)
//單行轉角控制參數(shù)
unsigned char line; //單行控制采集的線
signed char diff_sum,diff_last; //偏差之和、上次偏差
signed char P1,I1,D1; //PID參數(shù)
unsigned char P1_en,I1_en,D1_en; //PID參數(shù)使能
signed int P1_out,PID1_out; //PID輸出
//斜率控制參數(shù)
unsigned char Pa_en,Da_en; //PID參數(shù)使能
signed char a_last; //上次斜率偏差
signed char Pa,Da; //PID參數(shù)
signed int Pa_out,PIDa_out; //Pa輸出
signed int PID_out; //PID總輸出
signed int PID_out1,PID_out2,PID_out3;//前N次的PID輸出
signed int servo_out; //舵機輸出偏差量
/*速度控制部分*/
unsigned int Speed_cnt,Speed_set; //測速脈沖個數(shù),設定車速
signed int Speed_d=0,Speed_d_last=0; //定義設定車速及最大、最小車速
/*撥碼開關速度設定*/
unsigned int Speed_zhi,Speed_s,Speed_wan,Speed_bad;
//*********************
// 函數(shù)聲明部分
//*********************
// main.c
void delay_us(unsigned int time);
void delay_ms(unsigned int time);
void reset_FIFO(void);
void read_all(void);
void send_data(void);
void send_num(signed int);
// init.c
void init_PLL(void);
void init_CMOS(void);
void init_PWM(void);
void init_ECT(void);
void init_PB(void);
void init_PA(void);
void init_PAD(void);
void init_IO(void);
// IIC.c
void init_IIC(void); //init DG128's iic port
void iic_write(byte sub_address,byte write_record); //write byte to iic client
// printp.c
void sci_init(void); //init DG128's sci port
void sci_putchar(char data); //send a char
void sci_prints(char* ctrl); //send a string
// Control.c
void ScanLine(void);
void CalcuLine(void);
void init_Control(void);
void ServoControl(void);
void SpeedControl(void);
//*********************
// 主程序
//*********************
void main(void){
init_PLL(); //系統(tǒng)時鐘設定:24MHz
delay_ms(1000); //啟動延時
/*系統(tǒng)初始化*/
init_PA();
init_PB();
init_PAD();
init_IO();
init_PWM();
init_ECT();
sci_init();
init_IIC();
init_Control();
init_CMOS();
//曝光設置
//根據(jù)撥碼開關第2位確定圖像曝光設置,適應不同光照環(huán)境
// 撥碼開關第2位 曝光設定
// 0 自動曝光(光線充足)
// 1 手動曝光(光線較暗)
if(PTM_PTM1==1){
iic_write(0x13,0x00);
iic_write(0x10,0x60); //理論計算結果為0x46
}
else{
iic_write(0x13,0x01);
}
//電機設置
//撥碼開關第一位決定是否開機自動打開電機
// 撥碼開關第1位 電機狀態(tài)
// 0 開
// 1 關
DRV1=PTM_PTM0; //是否打開電機
DRV2=1;
//速度設定
/*Speed_zhi=150;
Speed_wan=110;
Speed_bad=90;
Speed_s=155;
*/
//直道速度--撥碼開關1、2、3號
if(PTP_PTP0==0&&PTP_PTP1==0&&PTT_PTT2==0) Speed_zhi=110;
else if(PTP_PTP0==0&&PTP_PTP1==0&&PTT_PTT2==1)Speed_zhi=120;
else if(PTP_PTP0==0&&PTP_PTP1==1&&PTT_PTT2==0)Speed_zhi=130;
else if(PTP_PTP0==0&&PTP_PTP1==1&&PTT_PTT2==1)Speed_zhi=140;
else if(PTP_PTP0==1&&PTP_PTP1==0&&PTT_PTT2==0)Speed_zhi=150;
else if(PTP_PTP0==1&&PTP_PTP1==0&&PTT_PTT2==1)Speed_zhi=160;
else if(PTP_PTP0==1&&PTP_PTP1==1&&PTT_PTT2==0)Speed_zhi=170;
else Speed_zhi=180;
//彎道速度--撥碼開關4、5、6號
if(PTT_PTT3==0&&PTT_PTT4==0&&PTT_PTT5==0) Speed_wan=80;
else if(PTT_PTT3==0&&PTT_PTT4==0&&PTT_PTT5==1)Speed_wan=90;
else if(PTT_PTT3==0&&PTT_PTT4==1&&PTT_PTT5==0)Speed_wan=100;
else if(PTT_PTT3==0&&PTT_PTT4==1&&PTT_PTT5==1)Speed_wan=110;
else if(PTT_PTT3==1&&PTT_PTT4==0&&PTT_PTT5==0)Speed_wan=120;
else if(PTT_PTT3==1&&PTT_PTT4==0&&PTT_PTT5==1)Speed_wan=130;
else if(PTT_PTT3==1&&PTT_PTT4==1&&PTT_PTT5==0)Speed_wan=140;
else Speed_wan=150;
//BadFrame速度--撥碼開關7、8號
//1:高速 0:低速
if(PTT_PTT6==0&&PTT_PTT7==0) Speed_bad=85;
else if(PTT_PTT6==0&&PTT_PTT7==1) Speed_bad=90;
else if(PTT_PTT6==1&&PTT_PTT7==0) Speed_bad=95;
else Speed_bad=100;
if(Speed_zhi>=170){
Speed_s=Speed_zhi;
}
else{
Speed_s=Speed_zhi+5;
}
//TSCR1_TEN=1;
EnableInterrupts;
for(;;){
if(AutoFlag==1){
/*圖像數(shù)據(jù)寫入FIFO*/
reset_FIFO();
PACN0=0;
ICPAR_PA0EN=1;
while(VSYN!=0);
while(VSYN!=1);
V_en=1;
while(PACN0<SIZE_Y);
V_en=0;
ICPAR_PA0EN=0;
/*圖像數(shù)據(jù)寫入FIFO完成*/
/*速度控制,若能保證每次控制周期在16ms內完成,則
每次得到的計數(shù)脈沖應為16.67ms內的脈沖數(shù),計速可靠*/
SpeedControl();
/*讀圖像數(shù)據(jù)至RAM*/
read_all();
/*控制算法部分*/
ScanLine();
CalcuLine();
ServoControl();
}
time++;
/*
//正常沖刺方案
if(PTS_PTS2){
//開啟第二圈沖刺方案
//初賽14s后,決賽25s后,設定速度++
if((time==840&&PTS_PTS3==0)||(time==1500&&PTS_PTS3==1)){
Speed_zhi+=10;
Speed_wan+=5;
Speed_bad+=2;
Speed_s+=5;
}
}
*/
//瘋狂版方案
//時間一到,立刻自爆
if((time==840&&PTS_PTS2==0&&PTS_PTS3==1)||(time==1500&&PTS_PTS2==1&&PTS_PTS3==0)||(time==1800&&PTS_PTS2==1&&PTS_PTS3==1)){
Speed_bad+=30;
}
}
}
//*********************
// main.c函數(shù)
//*********************
//FIFO復位
void reset_FIFO(void){
FifoReset=0;
asm{
nop;
nop;
nop;
nop;
nop;
nop;
nop;
} /*延遲至少150ns*/
FifoReset=1;
}
void read_all(void){
int read_cnt;
byte *VideoData_ptr;
VideoData_ptr=VideoData;
for(read_cnt=0;read_cnt<DATASIZE;read_cnt++){
R_en=0;
*(VideoData_ptr+read_cnt)=PORTA;
R_en=1;
}
}
//******************
//控制及圖像處理部分
//******************
#include "Control.c"
//******************
//系統(tǒng)功能函數(shù)
//包括延遲和串口通訊
//******************
/*延遲函數(shù)delay_us(),delay_ms()*/
//微秒級延時函數(shù)
void delay_us(unsigned int time){
for(;time>0;time--){
asm{
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
}
}
}
//毫秒級延時函數(shù)
void delay_ms(unsigned int time){
static int delay_i;
for(;time>0;time--){
for(delay_i=0;delay_i<2517;delay_i++){
asm{
nop;
nop;
nop;
}
}
}
} /*---延遲函數(shù)---*/
//串口發(fā)送一幀圖像數(shù)據(jù)至串口
void send_data(void){
int send_cnt;
byte *data_ptr;
data_ptr=VideoData;
for(send_cnt=0;send_cnt<DATASIZE;send_cnt++){
sci_putchar(*(data_ptr+send_cnt));
}
}
//發(fā)送一個有符號的三位數(shù)至串口
void send_num(signed int num){
if(num<0){
num=-num;
sci_putchar('-');
}
sci_putchar(num/100+48);
sci_putchar(num%100/10+48);
sci_putchar(num%10+48);
sci_putchar(' ');
}
//****************
//系統(tǒng)中斷處理部分
//****************
#pragma CODE_SEG NON_BANKED
void interrupt 10 DebugSend(void){
unsigned char i;
TFLG1_C2F=1; //clear the interrupt flag
sci_prints("d=");
send_num(diff[line]);
sci_prints(" a=");
send_num(a);
sci_prints(" b=");
send_num(b);
sci_prints(" E=");
send_num(Ee2/10);
sci_putchar('\n');
sci_putchar('\r');
}
//SCI輸入中斷
void interrupt 20 RxInterrupt(void){
//byte i;
DisableInterrupts;
//i=SCI0SR1_RDRF;
if(SCI0SR1&0x20){
CaptureCommand=SCI0DRL;
}
switch(CaptureCommand){
case '1':
case '7':
reset_FIFO();
PACN0=0;
ICPAR_PA0EN=1;
while(VSYN!=0);
while(VSYN!=1);
V_en=1;
while(PACN0<SIZE_Y);
//while(VSYN!=1);
V_en=0;
ICPAR_PA0EN=0;
read_all();
ScanLine();
send_data();
break;
case '2':
DRV1=!DRV1;
break;
case '3': //Left
PWMDTY45=PWMDTY45-100;
break;
case '4': //Center
PWMDTY45=SERVO_MID;
break;
case '5': //Right
PWMDTY45=PWMDTY45+100;
break;
case '6':
ServoControl();
break;
case '8': //加速
PWMDTY3+=8;
break;
case '9': //減速
PWMDTY3-=8;
break;
case '0':
AutoFlag=!AutoFlag; //手自動切換
break;
case 'd':
case 'D':
DebugEn=!DebugEn;
break;
case 'b':
case 'B':
if(PWMPOL==0x20){
PWMPOL=0x2C;
}
else if(PWMPOL==0x2C){
PWMPOL=0x20;
}
break;
default:
break;
}
EnableInterrupts;
/*switch語句結束*/
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -