一、前言
项目介绍:摄像头作为一个常用的传感器模块,广泛应用于摄像头模块开发和嵌入式系统中。将OV5640模块与STM32微控制器结合使用,可以实现图像采集等功能,STM32也可以对摄像头采集的数据进行处理以达到项目要求的功能。本次项目计划设计一个OV5640的扩展板,配合STM32H7将摄像头捕获的图像显示到LCD屏幕上。
设计思路:使用OV5640加上外围电路替代市面上的成品模块,小型化集成为小模块。
框图介绍:
二、原理图及PCB介绍
整个系统的供电如图所示,通过三个LDO分别给IO口电压、传感器核心电压、模拟电压和对焦电机电压,并且增加了磁珠。三个LDO使用的是南麟电子的LN6206系列,固定输出电压。
LN6206 系列是使用CMOS技术开发的低压差,高精度 输出电压,低消耗电流正电压型电压稳压器。由于内置有低 通态电阻晶体管,因而压差低,能够获得较大的输出电流。 为了使负载电流不超过输出晶体管的电流容量,内置了过载 电流保护电路、短路保护电路。
可选择输出电压: 可以在 1.2~5.0V 的范围内选择, 并以0.1 V 为单位进级
输出电压精度高: 精度可达±1.0%或±2.0% 低静态功耗: 2µA(TYP.)
输入输出压差低: 典型值160 mV (输出为3.0V的产 品, IOUT=50mA 时)
输出电流大: 可输出250mA(VIN≥VOUT+1v) 内置保护: 内置过流保护和短路保护电路
采用小型封装: SOT-89-3 ,SOT-23-3,SOT23-3B 以及客户要求的封装
OV5640外围电路如图,使用24M有源晶振提供时钟,通过I2C与STM32H7进行通讯。将8个数据通道信号线、帧/场同步信号线、行同步信号线、像素时钟、系统时钟输入型号引出。
STM32H750VBT6:
STM32H750xB 器件基于工作频率可达480 MHz。Cortex® -M7内核带有浮点单元 (FPU),支持Arm®双精度(符合IEEE 754标准)和单精度数据处理指令与数据类型。STM32H750xB器件支持一组完整的DSP指令和一个旨在提高应用安全性的存储器保护单元 (MPU)。
STM32H750xB器件集成了高速嵌入式存储器,配有128 KB的Flash内存,高达1 MB的RAM(包括192 KB的TCM RAM、高达864 KB的用户SRAM和4 KB的备份SRAM),以及大量连接到APB总线、AHB总线、2个32位多AHB总线矩阵的增强型I/O和外设,支持内部及外部存储器访问的多层AXI互连。
- 内核
- 32位Arm® Cortex®-M7内核,带有双精度FPU和L1缓存:16 KB数据和16 KB指令缓存;主频高达480 MHz,MPU,1027 DMIPS/2.14 DMIPS/MHz (Dhrystone 2.1),具有DSP指令
- 存储器
- 128 KB Flash存储器
- 1 MB RAM:192 KB TCM RAM(包括64 KB ITCM RAM+128 KB DTCM RAM,用于时间关键型程序),864 KB用户SRAM,以及备份域中的4 KB SRAM
- 双模式Quad SPI存储器接口,运行频率高达133 MHz
- 灵活的外部存储器控制器,带有多达32位的数据总线:
- SRAM、PSRAM、NOR Flash存储器在同步模式下的时钟频率高达133 MHz
- SDRAM/LPSDR SDRAM
- 8/16位NAND Flash存储器
- CRC计算单元
- 安全加密
- ROP、PC-ROP、主动篡改检测、安全固件升级支持、安全访问模式
- 通用输入/输出
- 具有中断功能的I/O端口多达168个
- 复位和电源管理
- 3个独立电源域,可独立进行时钟门控或关断:
- D1:高性能功能
- D2:通信外设和定时器
- D3:复位/时钟控制/电源管理
- 1.62至3.6 V应用电源电压和I/O
- POR、PDR、PVD和BOR
- 专用USB电源,嵌入了3.3 V内部稳压器,可用于向内部PHY供电
- 嵌入式稳压器 (LDO),带有可配置的可扩展输出,可用于向数字电路供电
- 可在运行和停止模式下进行电压调节(6个可配置范围)
- 备份稳压器 (~0.9 V)
- 模拟外设的参考电压/VREF+
- 低功耗模式:睡眠、停止、待机和VBAT(支持电池充电)
- 低功耗
- 具有充电功能的VBAT电池供电工作模式
- CPU和域电源状态监控引脚
- 待机模式下2.95 µA(备份SRAM关闭,RTC/LSE开启)
三、成品功能测试
板卡焊接之后装配完成的样子:
在这里我出现了一些问题,OV5640的摄像头的长度我没有估计好,导致有一半的部分没有固定在PCB上。还有就是OV5640的PWDN引脚我将它一直上拉了,由于PWDN引脚信号是高电平使能,所以一直导致进入掉电模式,摄像头停止工作,本来应该是要接GND的,现在只能将R6电阻拆掉,将PWDN引脚悬空。
关键代码及说明:
int main(void)
{
MPU_Config(); // MPU配置
SCB_EnableICache(); // 使能ICache
SCB_EnableDCache(); // 使能DCache
HAL_Init(); // 初始化HAL库
SystemClock_Config(); // 配置系统时钟,主频480MHz
LED_Init(); // 初始化LED引脚
USART1_Init(); // USART1初始化
SPI_LCD_Init(); // 液晶屏以及SPI初始化
DCMI_OV5640_Init(); // DCMI以及OV5640初始化
OV5640_AF_Download_Firmware(); // 写入自动对焦固件
OV5640_AF_Trigger_Constant(); // 自动对焦 ,持续 触发,当OV5640检测到当前画面不在焦点时,会一直触发对焦
// OV5640_AF_Trigger_Single(); // 自动对焦 ,触发 单次
// 120度和160度的广角镜头默认的方向和带自动对焦的镜头不一样,用户可以根据实际去调整
// OV5640_Set_Vertical_Flip( OV5640_Disable ); // 取消垂直翻转
// OV5640_Set_Horizontal_Mirror( OV5640_Enable ); // 水平镜像
OV5640_DMA_Transmit_Continuous(Camera_Buffer, Display_BufferSize); // 启动DMA连续传输
while (1)
{
if ( OV5640_FrameState == 1 ) // 采集到了一帧图像
{
OV5640_FrameState = 0; // 清零标志位
LCD_CopyBuffer(0,0,Display_Width,Display_Height, (uint16_t *)Camera_Buffer); // 将图像数据复制到屏幕
LCD_DisplayString( 84 ,200,"FPS:");
LCD_DisplayNumber( 132,200, OV5640_FPS,2) ; // 显示帧率
LED1_Toggle;
}
}
}
用于初始化并控制OV5640摄像头和LCD显示屏。主要功能包括: 系统初始化: 配置内存保护、启用缓存、初始化硬件抽象层(HAL)和系统时钟设置等。 硬件组件初始化: 初始化LED、USART、LCD和相机模块,准备进行拍摄。 启动DMA进行摄像头图像数据的连续传输。检查是否采集到新图像帧,并将图像数据复制到LCD显示。 显示当前帧率(FPS)和切换LED状态。 该程序实现了摄像头图像采集与显示的基本操作。
四、活动总结
这一次,我制作了一个包含OV5640摄像头模块的小项目。这是一款高分辨率的摄像头模块,通过这个项目的实践,我希望能够全面掌握从原材料选择、PCB设计到最后的调试和软件编程的每一个环节,不断提升自己的动手能力和技术水平。这不仅能加深我对各个技术环节的理解,还将为我的学习过程增添更多的创新空间和可能性。在此,我非常感谢活动的举办方,感谢他们提供了这样一个宝贵的机会,让我能够深入学习和探索新技术。