标题:
飞思卡尔B车摄像头程序
[打印本页]
作者:
俺家璐璐啦
时间:
2018-12-1 13:26
标题:
飞思卡尔B车摄像头程序
十三届飞思卡尔B车程序开源
单片机源程序如下:
//作者:
//说明:saomiao文件下有一个lkcongzhongjiansaomiao()函数是图像处理函数,偏差处理以及舵机控制均在此文件下
//duoji_dianji文件下都是速度控制的相关程序,核心程序就是这两个文件
#include "common.h"
#include "include.h"
#include "math.h"
#include "saomiao.h"
uint8 imgbuff[CAMERA_SIZE];
int currentzhongjian[60];
int right_heixian[60];
int left_heixian[60];
int quanjuCount;
int OutData[4],tuoluoyivar;
int star_lineflag=0;
int LK_jishi=0;
int LK_jishi_flag=0;
int LK_yanshi=0,zhidao_flag,yunsu_flag,yuzhi;
extern int podao_flag,zhangai_right,zhangai_left,qvlv_quanju,duandian,mubiao_speed,dawan_speed,qulv_jinduan;
extern void lukuangudge();
char go=0,S1,S,zhichong_flag;
extern char lcd_show_enable1;
//s16 speed_a;
extern int my_piancha;
int zhangaijishiright_flag=0,zhangaijishileft_flag=0;
//int kp=22,kd=10,right_heixian[60],lastpiancha_1,duojijiaodu,left_heixian[60],my_lastzhongjian=40,currentzhongjianzhi=40,rightheixian_flag,leftheixian_flag,xielv;
//函数声明
void PORTA_IRQHandler();
void DMA0_IRQHandler();
void PIT0_IRQHandler();
void Priority_Set();
extern char s_wan_flag;
char pof;
//void PIT1_IRQHandler();
/*!
* @brief main函数
* @since v5.3
* @note 山外 DMA 采集摄像头 实验
注意,此例程 bus频率设为100MHz(50MHz bus频率会太慢而导致没法及时采集图像)
此例程使用的上位机为【山外多功能调试助手】
具体资料请参考:山外多功能调试助手资料专辑
*/
void hecheng()//虚拟中线函数
{
unsigned int ji;
for(ji=0;ji<=59;ji++)
{
imgyiwei[ji][currentzhongjian[ji]]=0 ;
}
}
void sendimg(uint8 *imgaddr,uint32 imgsize)
{
img_extract((u8 *)imgyiwei, imgbuff,CAMERA_SIZE); //解压图像
lkcongzhongjiansaomiao();
uint8 cmd[4] = {0, 255, 1, 0 }; //yy_摄像头串口调试 使用的命令
hecheng();
uart_putbuff(VCAN_PORT, cmd, sizeof(cmd)); //先发送命令
uart_putbuff(VCAN_PORT, imgaddr, imgsize); //再发送图像
}
void star_line_judg()//起跑线检测
{
int kk,bai_flag=0,hei_flag=0,heibai_flag=0,baihei_flag=0;
for(kk=5;kk<=72;kk++)
{
if(imgyiwei[45][kk]>0)
bai_flag=1;
else
if(bai_flag&&imgyiwei[45][kk]==0)
{
baihei_flag++;
bai_flag=0;
}
if(imgyiwei[45][kk]==0)
hei_flag=1;
else
if(hei_flag&&imgyiwei[45][kk]>0)
{
heibai_flag++;
hei_flag=0;
}
}
if(baihei_flag>=4&&heibai_flag>=4&&baihei_flag-heibai_flag<=2)
star_lineflag=1;
}
void lkzhongjian()
{
unsigned int i;
for(i=0;i<=59;i++)
{
imgyiwei[i][currentzhongjian[i]]=0;
}
}
/*void sendimg(uint8 *imgaddr,uint32 imgsize)
{
uint8 cmd[4] = {0, 255, 1, 0 }; //yy_摄像头串口调试 使用的命令
//hecheng();
uart_putbuff(VCAN_PORT, cmd, sizeof(cmd)); //先发送命令
uart_putbuff(VCAN_PORT, imgaddr, imgsize); //再发送图像
// uart_putbuff(VCAN_PORT, currentzhongjian, 60); //再发送图像
}*/
//**************************************************************************
/*
* 功能说明:SCI示波器CRC校验
内部调用函数
* 参数说明: 无
* 函数返回:无符号结果值
* 修改时间:2013-2-10
*/
//**************************************************************************
static unsigned short CRC_CHECK(unsigned char *Buf, unsigned char CRC_CNT)
{
unsigned short CRC_Temp;
unsigned char i,j;
CRC_Temp = 0xffff;
for (i=0;i<CRC_CNT; i++)
{
CRC_Temp ^= Buf[i];
for (j=0;j<8;j++) {
if (CRC_Temp & 0x01)
CRC_Temp = (CRC_Temp >>1 ) ^ 0xa001;
else
CRC_Temp = CRC_Temp >> 1;
}
}
return(CRC_Temp);
}
//************************************************
//
/*
* 功能说明:SCI示波器发送函数
* 参数说明:
OutData[] 需要发送的数值赋予该数组
* 函数返回:无符号结果值
* 修改时间:2013-2-10
*/
//****************************************************
void OutPut_Data(void)
{
int temp[4] = {0};
unsigned int temp1[4] = {0};
unsigned char databuf[10] = {0};
unsigned char i;
unsigned short CRC16 = 0;
for(i=0;i<4;i++)
{
temp[i] = (int)OutData[i];
temp1[i] = (unsigned int)temp[i];
}
for(i=0;i<4;i++)
{
databuf[i*2] = (unsigned char)(temp1[i]%256);
databuf[i* 2+1] = (unsigned char)(temp1[i]/256);
}
CRC16 = CRC_CHECK(databuf,8);
databuf[8] = CRC16%256;
databuf[9] = CRC16/256;
for(i=0;i<10;i++)
{
uart_putchar (UART0,(char)databuf[i]);
}
}
void SendHex(unsigned char hex) {
unsigned char temp;
temp = hex >> 4;
if(temp < 10) {
uart_putchar(UART0,temp + '0');
} else {
uart_putchar(UART0,temp - 10 + 'A');
}
temp = hex & 0x0F;
if(temp < 10) {
uart_putchar(UART0,temp + '0');
} else {
uart_putchar(UART0,temp - 10 + 'A');
}
}
void SendImageData(unsigned char ImageData[][80])
{
int lll1,lll2;
unsigned char crc = 0;
lkcongzhongjiansaomiao();
lkzhongjian();
/* Send Data */
uart_putchar(UART0,'*');
uart_putchar(UART0,'L');
uart_putchar(UART0,'D');
SendHex(0);
SendHex(0);
SendHex(0);
SendHex(0);
// imgyiwei[60][80];
for(lll2=0;lll2<80;lll2++)
{
for(lll1=0;lll1<60; lll1++)
SendHex(ImageData[lll1][lll2]);
}
/* for(ll1=0;ll1<60;ll1++)
{
for(ll0=0;ll0<80;ll0++)
{
if(imgyiwei[ll1][ll0]==0)
Draw_potL(ll0,ll1,0,1);
else
Draw_potL(ll0,ll1,1,1);
}
}*/
SendHex(crc);
uart_putchar(UART0,'#');
}
#if 1
//编码器初始化
void FTM_QUAD_init()
{
/*开启端口时钟*/
SIM_SCGC5 |= SIM_SCGC5_PORTA_MASK;
/*选择管脚复用功能*/
// PORTA_PCR12 = PORT_PCR_MUX(7);
// PORTA_PCR13 = PORT_PCR_MUX(7);
PORTA_PCR10 = PORT_PCR_MUX(6);
PORTA_PCR11 = PORT_PCR_MUX(6);
/*使能FTM1、FTM2时钟*/
// SIM_SCGC6|=SIM_SCGC6_FTM1_MASK;
SIM_SCGC3|=SIM_SCGC3_FTM2_MASK;
// FTM1_MOD = 65535; //可根据需要设置
FTM2_MOD = 65535;
// FTM1_CNTIN = 0;
FTM2_CNTIN = 0;
// FTM1_MODE |= FTM_MODE_WPDIS_MASK; //禁止写保护
FTM2_MODE |= FTM_MODE_WPDIS_MASK; //禁止写保护
// FTM1_MODE |= FTM_MODE_FTMEN_MASK; //FTMEN=1,关闭TPM兼容模式,开启FTM所有功能
FTM2_MODE |= FTM_MODE_FTMEN_MASK; //FTMEN=1,关闭TPM兼容模式,开启FTM所有功能
// FTM1_QDCTRL &= ~FTM_QDCTRL_QUADMODE_MASK; //选定编码模式为A相与B相编码模式
// FTM1_QDCTRL |= FTM_QDCTRL_QUADEN_MASK; //使能正交解码模式
// FTM2_QDCTRL &= ~FTM_QDCTRL_QUADMODE_MASK; //选定编码模式为A相与B相编码模式 0x8u 0x00001000取反即 0x11110111
FTM2_QDCTRL |= 0x08;//~0x00u;
FTM2_QDCTRL |= FTM_QDCTRL_QUADEN_MASK; //使能正交解码模式
//QUADMODE=1;
// FTM1_SC |= FTM_SC_CLKS(3); //选择外部时钟
// FTM1_CONF |=FTM_CONF_BDMMODE(3); //可根据需要选择
FTM2_SC |= FTM_SC_CLKS(3);
// FTM2_CONF |=FTM_CONF_BDMMODE(3);
}
#endif
//**************************************************************************
void main(void)
{
DisableInterrupts;
dianji_canshu_init();
Priority_Set();
camera_init(imgbuff); //这里设定 imgbuff 为采集缓冲区!!!!!!
ftm_pwm_init(FTM0,FTM_CH4,10000,0); //电机初始化
ftm_pwm_init(FTM0,FTM_CH5,10000,0);
ftm_pwm_init(FTM1,FTM_CH0,300,4495);//舵机初始化
ftm_quad_init(FTM2);//编码器初始化
pit_init_ms(PIT0,5);//定时器中断5ms
my_lcd_init();//液晶初始化
set_vector_handler(PIT0_VECTORn,PIT0_IRQHandler); // 设置中断服务函数到中断向量表里
enable_irq(PIT0_IRQn); // 使能PIT中断
set_vector_handler(PORTA_VECTORn,PORTA_IRQHandler); //设置PORTA的中断服务函数为 PORTA_IRQHandler
set_vector_handler(DMA0_VECTORn,DMA0_IRQHandler); //设置DMA0的中断服务函数为 DMA0_IRQHandler
EnableInterrupts;
// adc_init (ADC1_SE4a);
//gpio_init(PTE28,GPO,0);//off
while(1)
{
// gpio_init(PTE28,GPO,0);//off
camera_get_img();
// my_lcd_show();
if(LK_jishi_flag==1)
star_line_judg();
// lptmr_delay_ms(1000);
// gpio_init(PTE28,GPO,1);//off
//sendimg((u8 *)imgyiwei, CAMERA_W * CAMERA_H);//我的上位机,不注释为向电脑发送图像
}
}
/*!
* @brief PORTA中断服务函数
* @since v5.0
*/
void PORTA_IRQHandler()
{
uint8 n = 0; //引脚号
uint32 flag = PORTA_ISFR;
PORTA_ISFR = ~0; //清中断标志位
n = 29; //场中断
if(flag & (1 << n)) //PTA29触发中断
{
camera_vsync();
}
#if 0 //鹰眼直接全速采集,不需要行中断
n = 28;
if(flag & (1 << n)) //PTA28触发中断
{
camera_href();
}
#endif
}
/*!
* @brief DMA0中断服务函数
* @since v5.0
*/
//void PIT1_IRQHandler()
//{
//shizi_count++;
//}
void DMA0_IRQHandler()
{
camera_dma();
img_extract((u8 *)imgyiwei, imgbuff,CAMERA_SIZE);
}
void PIT0_IRQHandler(void)//定时器中断服务函数
{
//lcd_show_enable1=0;//注释掉是调用液晶
PIT_Flag_Clear(PIT0);
if(lcd_show_enable1)//为0跳出液晶
{
my_lcd_show();
}
else
{
/*****************************************************脉冲提取*************************************************************/
get_maichong();//获取电机转速
if(LK_jishi_flag==0)
LK_jishi++;
if(LK_jishi==300)//起步延时1.5秒
go=1;//小车前进
if(LK_jishi>=2000)
{
LK_jishi_flag=1;
LK_jishi=2000;
}
/*****************************************************边线提取*************************************************************/
lkcongzhongjiansaomiao();//图像处理
if(star_lineflag==1)
LK_yanshi++;
if(!star_lineflag&&go)
{
if(yunsu_flag==1)
mubiao_speed=dawan_speed;
else
lukuangudge();//路况判断
}
else
if(LK_yanshi>30)//检测到起跑线
mubiao_speed=0;
//if(pof)
//mubiao_speed=0;
DSYJ_dianji_PID(mubiao_speed); //控制电机转速
/************************************************************************S弯判定****************************************************/
if(s_wan_flag)
{
S1=1;
//s_wan_flag=0;
}
else
{
S=0;
S1=0;
}
if(S1&&S<=25)
S++;
if(S>=25)
{
zhichong_flag=1;
//gpio_set(PTE1,1);
}
else
{
zhichong_flag=0;
//gpio_set(PTE1,0);
}
/*******************************************************坡道处理*****************************************************/
// if(abs(my_piancha)<=16&&qvlv_quanju<=10&&duandian<12&&qulv_jinduan<12)
// tuoluoyivar=adc_once(ADC1_SE4a,ADC_8bit);
// else
// tuoluoyivar=104;
/* if(abs(tuoluoyivar-104)>40&&!podao_flag)
{
podao_flag=1;
// gpio_set(PTE1,1);
}
if(podao_flag&&podao_flag<800)
{
podao_flag++;
}
else
{
podao_flag=0;
//gpio_set(PTE1,0);
}
if(podao_flag>0&&podao_flag<130)
pof=1;
else
pof=0;*/
/*******************************************************障碍处理*****************************************************/
if(zhangai_right==1)
{
zhangaijishiright_flag=1;
zhangai_right=0;
}
else if(zhangai_left==1)
{
zhangaijishileft_flag=1;
zhangai_left=0;
}
if(zhangaijishileft_flag&&zhangaijishileft_flag<35)
{
zhangaijishileft_flag++;
// led(LED0, LED_ON);
}
else
if(zhangaijishiright_flag&&zhangaijishiright_flag<35)
{
zhangaijishiright_flag++;
}
else
zhangaijishiright_flag=zhangaijishileft_flag=0;
/************************************************************************直道判定*直道判定*****************************************************/
if(abs(my_piancha)<=13&&qvlv_quanju<=13&&duandian<10)
{
zhidao_flag++;
}
else
{
zhidao_flag=0;
}
//gpio_turn(PTA17);
/*****************************************************偏差处理*************************************************************/
pianchachuli();
}
}
void Priority_Set(void)
{
// NVIC_SetPriorityGrouping(4); //设置优先级分组,4bit 抢占优先级,没有亚优先级
NVIC_SetPriority(PORTA_IRQn,0); //配置优先级
NVIC_SetPriority(DMA0_IRQn,1); //配置优先级
NVIC_SetPriority(PIT0_IRQn,2); //配置优先级
}
复制代码
iar代码下载:
program of B_CAR.7z
(680.72 KB, 下载次数: 32)
2021-11-20 03:23 上传
点击文件名下载附件
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1