4、AF驱动芯片与接口:驱动芯片(DW9714、AK7311等)、I2C协议详解、PWM控制模式、DAC精度与步进

驱动芯片,说白了就是镜头和主控之间的“翻译官”。主控说“往左走10步”,驱动芯片就得精确地告诉马达该怎么动。我这些年经手过的项目里,DW9714和AK7311是出场率最高的两位选手。今天咱们就聊聊它们,顺便把I2C、PWM这些接口协议掰开揉碎了讲清楚。

4.1 驱动芯片选型:DW9714 vs AK7311

先说说这两款芯片的定位。DW9714是韩国动运(Dongwoon)的经典款,10位DAC精度,支持I2C和PWM双模式。AK7311则是AKM家的,同样是10位DAC,但内部集成了EEPROM,可以存校准参数。我个人习惯是:量产项目用DW9714,成本低、供货稳;研发验证用AK7311,调试方便。

核心参数对比:

参数 DW9714 AK7311
DAC位数 10位 10位
接口 I2C / PWM I2C / PWM
内部EEPROM 有(64字节)
工作电压 2.3V - 3.6V 2.5V - 3.6V
典型应用 手机摄像头 高端模组

嗯,这里要注意:AK7311的EEPROM虽然方便,但写入次数有限(约10万次)。我曾经有个项目,产线反复烧写参数,结果芯片挂了。后来改成只在出厂前烧一次,问题就解决了。

4.2 I2C协议详解:别被时序图吓到

I2C协议,很多新手一看时序图就头大。其实没那么复杂。说白了就是两根线:SCL(时钟)和SDA(数据)。主控发时钟,从设备(驱动芯片)跟着节奏走。

标准I2C写操作流程是这样的:

  1. 主控发START信号(SCL高时SDA从高拉低)
  2. 发7位设备地址 + 写位(0)
  3. 等待从设备ACK(拉低SDA)
  4. 发寄存器地址(8位)
  5. 等待ACK
  6. 发数据(8位)
  7. 等待ACK
  8. 主控发STOP信号(SCL高时SDA从低拉高)

举个例子,给DW9714写0x1F寄存器:

// 伪代码示例
I2C_Start();
I2C_SendByte(0x18 << 1 | 0);  // 设备地址0x18 + 写位
I2C_WaitAck();
I2C_SendByte(0x1F);            // 寄存器地址
I2C_WaitAck();
I2C_SendByte(0x80);            // 写入数据
I2C_WaitAck();
I2C_Stop();

避坑指南:我曾经遇到过I2C通信偶尔失败的问题。查了半天,发现是上拉电阻阻值不对。4.7kΩ是标准值,但总线电容大时得换成2.2kΩ。你想想看,信号都变形了,通信能稳定才怪。

4.3 PWM控制模式:简单粗暴但有效

PWM模式,就是用占空比来控制镜头位置。驱动芯片内部有个低通滤波器,把PWM信号转成直流电压。占空比越高,电压越高,镜头伸得越远。

为什么会有PWM模式?其实是为了兼容老平台。有些主控没有I2C接口,或者I2C总线被占满了,这时候PWM就派上用场了。我建议:能用I2C尽量用I2C,精度更高,调试也方便。

PWM的关键参数:

  • 频率:典型值32kHz - 100kHz。太低会有 audible noise(人耳能听到的噪声),太高了驱动芯片可能跟不上。
  • 占空比范围:0% - 100%,对应DAC输出0V到VDD。
  • 分辨率:受限于PWM定时器的位数。8位PWM只有256级,10位有1024级。

注意:PWM模式下,驱动芯片的响应速度比I2C慢。因为内部RC滤波器有建立时间。我曾经测过,从占空比变化到镜头稳定,大约需要5-10ms。做快速对焦时得把这个延时算进去。

4.4 DAC精度与步进:10位到底够不够?

DAC精度,直接决定了镜头能走多细。10位DAC,意味着有2^10 = 1024个步进。假设驱动电压范围是0V到2.8V,那么每一步对应的电压变化是:

2.8V / 1024 ≈ 2.73mV

这个精度够用吗?分情况。对于普通VCM马达,2.73mV的步进已经足够细腻了。但对于压电马达或者高精度模组,可能得用12位甚至14位的驱动芯片。

我个人的经验是:10位DAC配合闭环控制,效果完全够用。但如果是开环控制,建议留点余量。比如目标位置是500步,实际可能跑到498或502步。这就是DAC的非线性误差在作怪。

步进计算小技巧:

实际项目中,我们通常不会直接用DAC值。而是先做标定:

// 标定示例
// 近端(0cm)对应DAC值:50
// 远端(无穷远)对应DAC值:950
// 那么中间位置(10cm)对应的DAC值:
DAC_value = 50 + (950 - 50) * (1 / (1 + 10/焦距))

嗯,这里用了反比关系。实际曲线可能更复杂,但原理是一样的。

4.5 实战中的那些坑

最后分享几个我踩过的坑:

  • I2C地址冲突:DW9714的地址是0x18(7位),但有些厂商会做成0x1C。买芯片前一定确认好。
  • PWM频率选择:别用20kHz以下的频率,否则你会听到镜头在“唱歌”。
  • DAC初始化:上电后先写一次默认值,别直接跳到目标位置。我遇到过上电瞬间镜头猛冲到底的情况,吓出一身冷汗。
  • 多片驱动芯片:如果模组里有多个驱动芯片(比如双摄),I2C总线要加缓冲器,否则信号会衰减。

好了,关于驱动芯片和接口协议,今天就聊这么多。这些东西看着琐碎,但每一个细节都可能决定项目成败。下次调试时遇到问题,不妨回头看看这些基础点。


专注资料整理