OIS概念
光学防抖OIS,全称Optical Image Stabilization,从字面理解就是稳定的光学图像。其工作原理是基于陀螺仪检测并进行位移补偿。即通过镜头内的陀螺仪侦测手机抖动产生的微小移动,然后将信号传至CPU处理,CPU会即刻计算需要补偿的位移量,再根据计算结果移动相机镜片组中的悬浮镜片,以抵消抖动产生的微小位移,从而有效克服因相机振动产生的影像模糊。
注:OIS可以稳定由于摄影师手抖造成的图像模糊,但它无法补偿由场景运动引起的模糊。
OIS补偿方式
OIS的补偿方式分为两种:lens shift和module tilt,如下图所示:
其中:
- Lens Shift的位置传感器主要采用Hall Sensor
- module tilt的位置传感器主要采用Photo-sensor
- Lens Shift无法进行补偿roll维度的抖动
- Lens Shift能够补偿的角度相对小一些
- module tilt相对会增加模组的高度
补偿原理
一开始在稳定状态下,物体能够投射到sensor中心位置,但是当发生晃动或者抖动的时候,物体并没有成像在sensor中心,这时就需要OIS进行补偿,改变光路,使其物体重新成像在sensor中心。本文以Lens Shift为例,演示OIS的补偿过程。
OIS防抖工作原理
OIS系统组成部分
OIS的大体俯视图如下所示,其电路主要由四个主要组件组成,分别是Gyro sensor、Hall Sensor、Driver IC和MCU。
- Gyro sensor
能够感知手机上的运动或振动,但目前相机模组上不单独安装Gyro Sensor,而是通过SPI来获得手机端Gyro Sensor的数据,可以节省相机模组的空间。(问:为什么用SPI方式传输数据,而不是常用的I2C)
答:陀螺仪的精度是决定整个系统性能的关键特性,是控制精度的基础。phase delay必须减少到最小,以避免在控制环时序中插入延迟;zero-rate offset必须接近于0,来减少积分误差;输出数据速率必须高于要控制的系统频率的两倍(过采样);测量范围必须保证高达±250dps;速率噪声密度必须非常低才能最大限度地提高信号的精度;功耗在正常模式和待机模式下都必须极低以适应手机。最重要的一点是陀螺仪的角度数据必须快速稳定的发送到MCU中,所以建议使用SPI方式,其能达到6Mbit/sec的速率,比I2C要快。
- Hall sensor
感知lens的移动位置。
- Driver IC
主要有两个功能:(1)根据控制算法的计算,将Lens(Module)引导到正确的位置;(2)从Hall Sensor中获得有关Lens(Module)的位置信息。
- MCU
(1)执行控制算法来矫正相机位移;(2)另外还应进行采集信号的预处理和Hall Sensor校准补偿(由于温漂造成的);(3)与Gyro sensor和Driver进行通信,告知Driver新的参考位置。
OIS系统计算流程
(1)由主板的(Gyro和加速计)提供角速度和加速度信息;
(2)加速度可以得到重力方向信息
(3)角速度积分后(积分后是角位移?),换算成手机X/Y方向上的位移量;
(4)为了抵消位移量,计算出期望的Lens X/Y位置的Hall target,传给OIS driver的闭环控制;
(5)开始闭环控制:计算Hall target和Hall数据的差值,通过PID controller输出到执行器,使Hall数据达到Hall target。
OIS 执行器的种类和实现原理
Ball-type OIS 马达:semco 技术主导的 OIS 执行器类型。镶嵌在导槽的滚珠滚动让 Lens
可动,通过磁石和音圈的相互作用实现 Lens 在 X/Y 方向的位移,抵消手机的位移。优点:
结构简单、OIS 性能较好, 缺点:serve off 后镜头晃动、滚珠和润滑油在极端气候下影响大。
SMA OIS 马达:SMA(shape memory alloy)主要由英国 CML、国内某供应商供应,模组
LG innotek 推动的 OIS 执行器类型。利用 SMA 热敏记忆合金,通过电流控制长度”电流→温
度→长度“,拉动 Lens 在 bracket 中位移,一般需要一对 SMA 线(2 wires)来控制一个方向。
优点:结构简单、肩高较低、没有磁性器件(不影响手机的其他器件/多个 AF 模组的情况)
、容易实现 rotation 控制。缺点:虽然薄但面积较大、成本较高。
悬丝(弹片)OIS 马达:Apple 主要使用的 OIS 马达。金属丝或者簧片既作供电功能又具
有弹性,令 Lens 可动,通过磁石和音圈的相互作用实现 Lens 在 X/Y 方向的位移。优点:成
本低、国产成熟。缺点:结构较大、OIS 性能一般、容易产生镜头 tilt、可靠性风险。
OIS driver 内部各模块
简单介绍一下 OIS 内部 各模块
Orientation: 是 因为 OIS 和 陀螺仪本身 可能存在 XY 轴 互换 因此在 OIS 中 通过
该模块 对 X Y 作对调。
GETGRX/Y : 这里是 OIS 最先获取的 陀螺仪的原始数据,但是注意的是 如果存在 XY
互换,那么经过 Orientation 获取的 GETGRX 的值 实际上 是 陀螺仪的原始 Y 数据。
Gyro filter : 信号滤波。
XGG/YGG : Xgain 和 Ygain 数字放大。
Polarity : 极性翻转 如果存在陀螺仪的 X 方向的正方向 和 对应的是 OIS X 轴的
负方向,所以需要将 OIS 的 X 轴作一下极性的翻转。
SRX/Y : 最终通过 OIS 内部 硬件算法处理后 的 OIS 的 X Y 的 位移值 ,最终 OIS
会根据 这个位移值时时调整 镜头的位置。
OIS 的 bring up
ois porting 的主逻辑和 sensor 以及其他 sub device 一样,主要分为三步:
1. 配置 dtsi 保证上电时序和电压参数正确
dtsi 的配置不过多追述基本和其他 sub devices 一致,主要注意就是电压的范围设置,
I2C 的配置这些
2. 配置 xml,主要是 slave addres,以及各个 mode 下的寄存器设置,简单介绍一下,xml
里面的主要一些 porting 相关的参数
<slaveAddress>0x68</slaveAddress>
//ois i2c 地址
<i2cFrequencyMode>FAST_PLUS</i2cFrequencyMode>
//ois i2c 速率
<powerUpSequence>
//ois 上电时序
</powerUpSequence>
<powerDownSequence>
//ois 下电时序
</powerDownSequence>
<oisinitSettings>
<enableOisSettings>
// ois init
//ois enable
<disableOisSettings>
// ois disable
<centeringOnSettings>
// ois centeringOn
<centeringOffSettings>
// ois disable centeringOn
<opcode>
<!--OIS code prog -->
<prog>0x0000</prog>
<!--OIS code coeff -->
<coeff>0x0000</coeff>
<!--OIS code pheripheral -->
<pheripheral>0x0000</pheripheral>
<!--OIS code memory -->
<memory>0x0000</memory>
<!--OIS fw address type -->
<fwAddrType range="[1,4]">2</fwAddrType>
<!--OIS fw address increase flag -->
<addrIncrease>1</addrIncrease>
<addrIndataflag>122</addrIndataflag>
</opcode>
上面这一段是 OIS 固件升级传到内核的一些参数;如果该 OIS 的升级流程走的是高通
的默认的升级 code,则需要和 fae 校对各地址去填写,保证正常升级。
3. 编译,调试,验证
这里主要讲一下验证,因为早期 在板子上很难看出来 OIS 的效果,所以我们只需要保
证 OIS 的上电正常 并且 I2C 通信能通就行。
如果有 vendor 的 fae 在的话,可以让他们抓一下 打开相机时 OIS I2C 上数据通信,确
保下的寄存器值正确且下的时序正常。
如果 vendor 不在的情况下,一般就是加一下 log 打印,一点时确保 OIS 的 config mode
走对了,二是打印一下对应的寄存器,比如重点的读一下 enable 的寄存器在打开后是
否使能。