金牌会员
- 积分
- 2021
- 威望
- 1003
- 贡献
- 540
- 兑换币
- 472
- 注册时间
- 2012-9-22
- 在线时间
- 239 小时
|
#include <hidef.h> /* common defines and macros */
#include"MC9S12XS128.h"
/*********************************摄像头采集程序*********************************/
#define ROW 40//40 //数字摄像头所采集的二维数组行数
#define COLUMN 84 //数字摄像头所采集的二维数组列数
#define ROW_START 10 //数字摄像头二维数组行开始行值
#define ROW_MAX 225 //数字摄像头所采集的二维数组行最大值
#define THRESHOLD 0x64 //图像阈值,根据所采集图像亮度值大小的实际情况调整(OV7620所采集的亮度值大小为0--255)
uchar Buffer[ROW][COLUMN]={0}; //所采集的图像二维数组
uchar Image_Center[ROW]={0}; //所采集的图像中心线 存储区
uchar Buffer1[ROW][COLUMN]={0}; //二值化图像缓存数组
uchar Buffer2[COLUMN]={0}; //中心线图像边界提取
uchar SampleFlag=0; //奇偶场标记
uint m=0; //换行变量
uint Line; //行中断计数变量
uint hang; //行参量
char turn;//转向变量
int angle;
unsigned int Get_Image[]={
17,19,21,23,25,28,31,34,37,40,43,46,49,53,57,
61,65,69,73,77,81,85,89,94,99,105,111,117,123,
129,135,141,147,153,159,166,173,180,187
};
/*************************************************************/
/* 行场中断初始化函数 */
/*************************************************************/
void TIM_Init(void)
{
TIOS=0x00; //外部输入捕捉0,1通道
TCTL4=0x09; //通道0 上升沿触发,通道1下降沿触发 行中断0上升沿触发,场中断1下降沿触发
TSCR1=0x80; //使能
TIE=0x03; //通道 0,1 中断使能
TFLG1=0xFF; //清中断标志位
}
/*************************************************************/
/* 串口0初始化函数 */
/*************************************************************/
void SCI_Init()
{
SCI0BD=208; //19200bps Baud Rate=BusClock/(16*SCIBD)
SCI0CR1=0; //正常8 位模式,无奇偶校验
SCI0CR2=0X2C; //发送允许 接受中断允许
}
/*************************************************************/
/* 串口0发送函数 */
/*************************************************************/
void SCI_Write(unsigned char SendChar)
{
while (!(SCI0SR1&0x80));
SCI0DRH=0;
SCI0DRL=SendChar;
}
/*************************************************************/
/* 向电脑串口发送所采集的图像 */
/*************************************************************/
void Process()
{
unsigned char i,j;
for(i=0;i<ROW;i++)
{
for(j=0;j<COLUMN;j++)
{
if(Buffer[i][j]>=THRESHOLD)
{
SCI_Write('1') ;
Buffer1[i][j]=1;
}
else
{
SCI_Write('0') ;
Buffer1[i][j]=0;
}
}
SCI_Write(0x0D);
SCI_Write(0X0A);
}
}
//////////////////////////数组赋值//////////////////////////////////
void shuzu(void)
{
char j;
for(j=0;j<COLUMN;j++)
Buffer2[j]=41;//初始化Buffer2 的值 共有40行
}
////////////////////////边界提取///////////////////////////////////
void bianjie(void)
{
char i,j,flag_zuo=0,flag_you=0;
for(i=10;i<40;i++)//拥谑?轿逍信卸?
{
flag_zuo=0;
flag_you=0;
for(j=0;j<42;j++) //从中间往两边采集
{
/////////////////////左///////////////////////
if((Buffer1[i][41-j]==0)&&(flag_zuo==0)&&(Buffer1[i][40-j]==0))
{
Buffer2[i]=(41-j); //图像边界提取dengyu 列号
flag_zuo=1;
}
///////////////////////右/////////////////////
if((Buffer1[i][42+j]==0)&&(flag_you==0)&&(Buffer1[i][43+j]==0))
{
Buffer2[42+i]=(42+j);//等于列号
flag_you=1;
}
}
if(flag_zuo==0) Buffer2[i]=0; //没有找到黑点有效边界
if(flag_you==0) Buffer2[42+i]=83;
}
//========= 转向提取 10 16=========//弯道提取函数
turn=0;
/****************** 提取中心引导线 ***************************/
for(i=5;i<16;i++)
{
Image_Center[i]=Buffer2[i]+ Buffer2[42+i];
Image_Center[i]>>=1;
}
//= Image_Center[15]-Image_Center[10];
turn = Image_Center[10]-41;
}
void server_driver() //中间1500 往左转1500-(100/9*θ) 往右转1500+(100/9*θ)
{
//========= 直道 ===========//
if((Image_Center[10]>38)&&(Image_Center[10]<45)) //29//49
{angle=1500WMDTY23=angle; PWMDTY45 = 250; }
//XXXXXXXXX 二 档 XXXXXXXXXXXX//
//===== 普通弯道 打弯向右 ======//
if(turn>0)
{
angle=1500+turn*10;
PWMDTY23=angle;
}
//====== 普通弯道 打弯向左 ======//
if(turn<0)
{
angle=1500-turn*10;
PWMDTY23=angle;
}
//========== 靠近外侧 =========//丢线时
if(Buffer2[12]>30&&Buffer2[13]>30)//左边界丢线
{
angle=1290; PWMDTY23=angle; PWMDTY45 = 300;
}
if(Buffer2[54]<60&&Buffer2[55]==60)//右边界边界丢线
{
angle=1710; PWMDTY23=angle; PWMDTY45 = 300;
}
}
|
|