本帖最后由 zhangpro666 于 2017-8-13 11:13 编辑
呃...看到大家都在电赛,自己暑假无聊玩一下,如果大家觉得有用就拿去吧。用的是启光电子的STM32,OV7670,ILI9325,理论上核心板通过跳线都可以实现。
原理图:
stm32主程序:- /*
- OV7670模块 STM32函数
- 选用STM32F103RBT6芯片
- TFT驱动IC为 R61505V
- 程序中 用到的TFT 为 我们店的 2.4寸TFT 驱动芯片为 R61505V
- TFT用到的GPIO PB为数据口 PC.6 CS PC.7 RS PC.8 WR PC.9 RD PC.10 RES
- 此函数 用寄存器方式配置GPIO 在TFT的数据 命令脚配置上用的是寄存器 这样能大幅度提高输出速度
-
- 摄像头方面
- 摄像头 数据口 为PA口 AO-A7
- SCL PC11
- SDA PC12
- OE PC3 //片选信号(OE)
- WRST PC4 //写指针复位
- RRST PC2 //读指针复位
- RCLK PC1 //读数据时钟
- WEN PC5 //写入FIFO使能
- VSY PD2 //同步信号检测IO
- 整个程序流程介绍
- 初始化TFT
- 初始化ov7670 ov7670是通过SCCB 初始化的 即 SCL 和SDA就可以初始化OV7670 SDA SCL类似于I2C效果
- 所以在调模块前 一定要确定OV7670是否已经初始化
- 开启中断 判断帧数据是否接收
- 死循环 读取并显示 摄像数据
-
- */
- #include "stm32f10x.h"
- #include "delay.h"
- #include "led.h"
- #include "tft.h"
- #include "led.h"
- #include "ov7670.h"
- #include "gui.h"
- #include "usart.h"
- #include "PID.h"
- #define KEY0 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_9)
- #define KEY1 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_10)
- void coordinate_output(void);
- extern u8 ov_sta; //帧次数 置位标志位
- struct{
- u8 photo;
- u8 pub_buf[14401];//120*120
- char buf[200];
- }CAM;
- //更新LCD显示
- void camera_refresh(void)
- {
- u32 j;
- u16 color,n565Color;
- u8 cRed=0,cBlue=0,cGreen=0;
-
- TFT_SCAN(5); //设置TFT扫描方向 为从下到上 从右到左
- Address_set(60,0,179,119,0,0); //设置显示范围
- if(ov_sta==2) //判断缓存区是否存好摄像数据
- {
-
- OV7670_RRST_0; //开始复位读指针
- OV7670_RCK_0;
- OV7670_RCK_1;
- OV7670_RCK_0;
- OV7670_RRST_1; //复位读指针结束
- OV7670_RCK_1;
-
- TFT_RS_1; //写数据线拉高 为提高写入速度
- //此用法 是将 下面写数据的步骤完全拆开 主要是为了提高显示速度 (下面注释部分为参考部分)
-
- for(j=0;j<14400;j++) //分辨率为240x320 每个颜色点要两个字节 所以 240x320x2=76800 ?
- {
- OV7670_RCK_0; //每一次时钟跳变 读一次数据
- color=GPIOC->IDR&0XFF; //读数据 读取颜色高字节数据
- OV7670_RCK_1;
- color<<=8; //左移8位 将高字节移到高8位 为接收低8位字节做准备
- OV7670_RCK_0;
- color|=GPIOC->IDR&0XFF; //读数据 读取颜色低字节数据 并转化为16位 565 颜色数据
- OV7670_RCK_1;
- cRed = ((color & 0xf800)>>11);
- CAM.pub_buf[j]=cRed;
- n565Color = (cRed << 11) + (cGreen << 5) + (cBlue << 0);
- GPIOB->ODR=n565Color; //对TFT并口快速写数据
- TFT_WR_0; //开始写入
- TFT_WR_1;
- }
- coordinate_output();
- EXTI_ClearITPendingBit(EXTI_Line2); //清除LINE8上的中断标志位
- ov_sta=0; //开始下一次采集
- }
- }
- u16 blight=15;//亮度判断更改这里
- void coordinate_output(void)
- {
- u16 i,j,k;
- xmax=ymax=0;
- xmin=ymin=119;
- for(i=0;i<120;i++)
- {
- for(j=0;j<120;j++)
- {
- if(CAM.pub_buf[(i*120)+j]>=blight)
- {
- if(i>1&&i<119&&j<119&&j>1)//如果i值大于8且小于136(限制小球在8~136行),同理,限制小球在16~160列
- {
- if(j>xmax) {xmax=j;} //不断更新边缘,直到找到小球的直径
- if(j<xmin) {xmin=j;}//不断更新边缘,直到找到小球的直径
-
- if(i>ymax) {ymax=i;}//不断更新边缘,直到找到小球的直径
- if(i<ymin) {ymin=i;}//不断更新边缘,直到找到小球的直径
- }
- }
- }
- }
- for(k=0;k<14400;k++)
- {
- CAM.pub_buf[k]=0x00;
- }
- x=(xmax+xmin)/2;
- y=(ymax+ymin)/2;
- if(x<1){x=1;}
- if(x>119){x=119;}
- if(y<1){y=1;}
- if(y>119){y=119;}
- if(x!=0&&y!=0)
- {
- // GUI_sprintf_hzstr16x(20,200," ",Red,White);
- sprintf(CAM.buf,"X:%d ",x);
- GUI_sprintf_hzstr16x(20,200,CAM.buf,Red,White);
- sprintf(CAM.buf,"Y:%d ",y);
- GUI_sprintf_hzstr16x(80,200,CAM.buf,Red,White);
- printf("X:%d",x);
- printf("Y:%d",y);
- printf("\r\n");
- }
- }
- void disp_picture(void)
- {
- u16 i,j=0;
- u16 COLOR;
- u8 aRed=0,aBlue=0,aGreen=0;
- coordinate_output();
-
- TFT_SCAN(5);
- Address_set(60,0,179,119,0,0);
- TFT_RS_1;
- for(i=0;i<14400;i++)
- {
- aRed=CAM.pub_buf[i];
- printf("%d ",aRed);
- j++;
- if(j>=120){printf("\r\n");j=0;}
- COLOR = (aRed << 11) + (aGreen << 5) + (aBlue << 0);
- GPIOB->ODR=COLOR; //对TFT并口快速写数据
- TFT_WR_0; //开始写入
- TFT_WR_1;
- }
-
- EXTI_ClearITPendingBit(EXTI_Line2);
-
- }
- int main(void)
- {
- u8 lightmode=2,saturation=3,brightness=2,contrast=2;
- u8 effect=0,flag=0;
- delay_init(); //延时函数初始化
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
- Lcd_Init(); //LCD 初始化
- LED_Init();
- uart_init(115200);
- TIM2_Int_Init(1,1799);
- TFT_CS(0); //打开LCD片选使能
- GUI_Clear(White); //清屏
- while(OV7670_Init())//初始化OV7670
- {
- GUI_sprintf_hzstr16x(20,150,"OV7670 Error!! ",Blue,White);
- delay_ms(200);
- printf("OV7670 ERROR!!!!!\r\n");
- }
- GUI_Clear(White); //清屏 初始化成功后 红色清屏
- CAM.photo=0;
- // delay_ms(1500);
- //摄像头 参数设置 屏蔽后为默认效果
- OV7670_Light_Mode(lightmode);
- OV7670_Color_Saturation(saturation);
- OV7670_Brightness(brightness);
- OV7670_Contrast(contrast);
- OV7670_Special_Effects(effect);
- EXTI2_Init(); //初始化中断线
- OV7670_Window_Set(10,174,120,120);
- OV7670_CS=0;
- while(1) //死循环显示 摄像数据
- {
- camera_refresh();
- // test_motor();
- }
- }
复制代码
全部资料下载地址:
STM32找球.rar
(429.95 KB, 下载次数: 60)
|