Hi3518+OV5640 自动对焦调试总结

Hi3518+OV5640 自动对焦调试总结

1.OV5640的自动对焦功能

 OV5640 由内置微型控制器完成自动对焦,并且 VCM 驱动器也已集成在传感器内部。微 型控制器的控制固件(firmware)从主机下载。当固件运行后,内置微型控制器从 OV5640

传感器读得自动对焦所需的信息,计算并驱动 VCM 马达带动镜头到达正确的对焦位置。

2.Hi3518控制OV5640的自动对焦

  1. 0V5640的初始化
    整个OV5640的初始化,这个比较多,一般都是OV的原厂提供的
    在这里插入图片描述

  2. OV5640 通过IIC下载自动对焦固件
    对焦固件比较大,大概4k字节,通过IIC下载比较慢的
    我是在整个初始化完成以后,就直接开始下载。
    在这里插入图片描述

  3. 进行对焦操作

按照这个命令,通过IIC发送,就可以达到目的
在这里插入图片描述

在这里插入图片描述

3.效果显示

在这里插入图片描述
这个是没有进行自动对焦拍的图片

在这里插入图片描述
欢迎各位大佬私聊思路,我总觉得效果不是太好。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是一个简单的OV5640摄像头在STM32H7单片机上的驱动程序示例。本示例使用了STM32H743ZI开发板和OV5640摄像头模块。 ```c #include "ov5640_driver.h" #include "stm32h7xx_hal.h" // OV5640寄存器定义 #define OV5640_CHIPID_HIGH 0x300A #define OV5640_CHIPID_LOW 0x300B // OV5640 I2C地址 #define OV5640_I2C_ADDR 0x78 // OV5640初始化寄存器值 const uint8_t ov5640_init_reg[][2] = { {0x31, 0x03}, {0x32, 0x00}, {0x2d, 0x00}, {0x2e, 0x00}, {0x2f, 0x00}, {0x33, 0xa0}, {0x3a, 0x04}, {0x3b, 0x38}, {0x3c, 0x00}, {0x3d, 0x28}, {0x3e, 0x00}, {0x3f, 0x60}, {0x40, 0x7f}, {0x41, 0x6b}, {0x42, 0x29}, {0x44, 0x22}, {0x45, 0x0a}, {0x46, 0x04}, {0x4a, 0x11}, {0x4b, 0x01}, {0x4c, 0x20}, {0x4d, 0x00}, {0x4e, 0x00}, {0x4f, 0x00}, {0x50, 0x22}, {0x51, 0x2a}, {0x52, 0x3c}, {0x53, 0x00}, {0x54, 0x00}, {0x55, 0x88}, {0x56, 0x28}, {0x57, 0x00}, {0x58, 0x00}, {0x59, 0x00}, {0x5a, 0x50}, {0x5b, 0x3c}, {0x5c, 0x00}, {0x5d, 0x55}, {0x5e, 0x7d}, {0x63, 0x00}, {0x64, 0x02}, {0x65, 0x20}, {0x66, 0x00}, {0x69, 0x0a}, {0x6a, 0x38}, {0x6b, 0x01}, {0x6c, 0x00}, {0x6d, 0x02}, {0x6e, 0xd0}, {0x6f, 0x01}, {0x70, 0x00}, {0x71, 0x58}, {0x72, 0x80}, {0x73, 0x02}, {0x74, 0x10}, {0x75, 0x10}, {0x76, 0x01}, {0x77, 0x80}, {0x7a, 0x20}, {0x7b, 0x1c}, {0x7c, 0x28}, {0x7d, 0x3c}, {0x7e, 0x55}, {0x7f, 0x68}, {0x80, 0x76}, {0x81, 0x80}, {0x82, 0x88}, {0x83, 0x8f}, {0x84, 0x96}, {0x85, 0xa3}, {0x86, 0xaf}, {0x87, 0xc4}, {0x88, 0xd7}, {0x89, 0xe8}, {0x8a, 0x20}, {0x8c, 0x80}, {0x90, 0xc8}, {0x91, 0x00}, {0x92, 0x00}, {0x93, 0x00}, {0x94, 0x55}, {0x95, 0x46}, {0x96, 0x2d}, {0x97, 0x24}, {0x98, 0x1f}, {0x99, 0x1a}, {0x9a, 0x16}, {0x9b, 0x13}, {0x9c, 0x0f}, {0x9d, 0x0d}, {0x9e, 0x0b}, {0x9f, 0x09}, {0xa0, 0x07}, {0xa1, 0x00}, {0xa2, 0x00}, {0xa3, 0x00}, {0xa4, 0x00}, {0xa5, 0x00}, {0xa6, 0x00}, {0xa7, 0x00}, {0xa8, 0x00}, {0xa9, 0x00}, {0xaa, 0x00}, {0xab, 0x00}, {0xac, 0x00}, {0xad, 0x00}, {0xae, 0x00}, {0xaf, 0x00}, {0xb0, 0x00}, {0xb1, 0x00}, {0xb2, 0x00}, {0xb3, 0x00}, {0xb4, 0x00}, {0xb5, 0x00}, {0xb6, 0x00}, {0xb7, 0x00}, {0xb8, 0x00}, {0xb9, 0x00}, {0xba, 0x00}, {0xbb, 0x00}, {0xbc, 0x00}, {0xbd, 0x00}, {0xbe, 0x00}, {0xbf, 0x00}, {0xc0, 0x00}, {0xc1, 0x10}, {0xc2, 0x20}, {0xc3, 0x30}, {0xc4, 0x40}, {0xc5, 0x50}, {0xc6, 0x60}, {0xc7, 0x70}, {0xc8, 0x80}, {0xc9, 0x90}, {0xca, 0xa0}, {0xcb, 0xb0}, {0xcc, 0xc0}, {0xcd, 0xd0}, {0xce, 0xe0}, {0xcf, 0xf0}, {0xd0, 0x00}, {0xd1, 0x04}, {0xd2, 0x10}, {0xd3, 0x28}, {0xd4, 0x3c}, {0xd5, 0x50}, {0xd6, 0x64}, {0xd7, 0x7c}, {0xd8, 0x8c}, {0xd9, 0x9c}, {0xda, 0xb0}, {0xdb, 0xc4}, {0xdc, 0xd8}, {0xdd, 0xf0}, {0xde, 0x20}, {0xdf, 0x04}, {0xe0, 0x02}, {0xe1, 0x00}, {0xe2, 0x03}, {0xe3, 0x30}, {0xe4, 0x80}, {0xe5, 0x00}, {0xe6, 0x00}, {0xe7, 0x00}, {0xe8, 0x00}, {0xe9, 0x00}, {0xea, 0x00}, {0xeb, 0x00}, {0xec, 0x00}, {0xed, 0x00}, {0xee, 0x00}, {0xef, 0x00}, {0xf0, 0x00}, {0xf1, 0x00}, {0xf2, 0x00}, {0xf3, 0x00}, {0xf4, 0x00}, {0xf5, 0x00}, {0xf6, 0x00}, {0xf7, 0x00}, {0xf8, 0x00}, {0xf9, 0x00}, {0xfa, 0x00}, {0xfe, 0x00}, }; I2C_HandleTypeDef hi2c1; // 初始化I2C接口 static void OV5640_I2C_Init(void) { hi2c1.Instance = I2C1; hi2c1.Init.Timing = 0x00707CBB; hi2c1.Init.OwnAddress1 = 0; hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE; hi2c1.Init.OwnAddress2 = 0; hi2c1.Init.OwnAddress2Masks = I2C_OA2_NOMASK; hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE; if (HAL_I2C_Init(&hi2c1) != HAL_OK) { Error_Handler(); } } // 写入OV5640寄存器 static HAL_StatusTypeDef OV5640_WriteReg(uint16_t reg, uint8_t value) { uint8_t data[2]; data[0] = reg >> 8; data[1] = reg & 0xFF; if (HAL_I2C_Master_Transmit(&hi2c1, OV5640_I2C_ADDR, data, 2, 1000) != HAL_OK) { return HAL_ERROR; } data[0] = value; if (HAL_I2C_Master_Transmit(&hi2c1, OV5640_I2C_ADDR, data, 1, 1000) != HAL_OK) { return HAL_ERROR; } return HAL_OK; } // 读取OV5640寄存器 static HAL_StatusTypeDef OV5640_ReadReg(uint16_t reg, uint8_t *value) { uint8_t data[2]; data[0] = reg >> 8; data[1] = reg & 0xFF; if (HAL_I2C_Master_Transmit(&hi2c1, OV5640_I2C_ADDR, data, 2, 1000) != HAL_OK) { return HAL_ERROR; } if (HAL_I2C_Master_Receive(&hi2c1, OV5640_I2C_ADDR, value, 1, 1000) != HAL_OK) { return HAL_ERROR; } return HAL_OK; } // 初始化OV5640 void OV5640_Init(void) { OV5640_I2C_Init(); uint8_t chip_id_high, chip_id_low; OV5640_ReadReg(OV5640_CHIPID_HIGH, &chip_id_high); OV5640_ReadReg(OV5640_CHIPID_LOW, &chip_id_low); if (chip_id_high != 0x56 || chip_id_low != 0x40) { Error_Handler(); } for (uint32_t i = 0; i < sizeof(ov5640_init_reg) / sizeof(ov5640_init_reg[0]); i++) { OV5640_WriteReg(ov5640_init_reg[i][0], ov5640_init_reg[i][1]); } } // 获得OV5640的ID uint16_t OV5640_GetID(void) { uint8_t chip_id_high, chip_id_low; OV5640_ReadReg(OV5640_CHIPID_HIGH, &chip_id_high); OV5640_ReadReg(OV5640_CHIPID_LOW, &chip_id_low); return (chip_id_high << 8) | chip_id_low; } ``` 以上代码仅为示例,具体实现可能需要根据具体硬件和软件环境进行修改和优化。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值