2. 驱动芯片选型:常用VCM驱动芯片对比与I2C接口基础

做VCM驱动,选芯片是第一道坎。我这些年摸过的驱动芯片少说也有十几种,DW9714、AKM系列、ROHM系列算是市面上最常见的三大家族。今天咱们就掰开揉碎聊聊它们各自的脾气秉性。

2.1 三款主流芯片的硬碰硬对比

先看一张对比表,心里有个底:

参数 DW9714 AKM (AK09918等) ROHM (BU642xx系列)
工作电压 2.3V ~ 3.6V 1.7V ~ 3.6V 2.5V ~ 5.5V
输出电流 最大100mA 最大80mA 最大150mA
I2C地址 0x18 (7位) 0x0C (7位) 0x60 (7位)
分辨率 10位DAC 12位DAC 10位DAC
功耗(典型) 0.8mA @ 静止 0.5mA @ 静止 1.2mA @ 静止
封装 WLCSP-6 WLCSP-4 DFN-8

DW9714是我用得最多的芯片。为什么?便宜、够用、资料多。10位DAC对于普通摄像头模组完全够用,100mA输出电流驱动大部分VCM马达也没问题。我有个项目用DW9714驱动一个120mg的VCM,跑了两年没出过问题。

AKM的芯片有个特点——低功耗。如果你做的是穿戴设备或者IoT摄像头,电池续航是命门,那AKM系列值得考虑。0.5mA的静止电流,比DW9714省了将近一半。不过它的输出电流偏小,驱动大行程马达会吃力。

ROHM系列呢?我一般用在工业相机或者车载项目上。宽电压范围、大输出电流,抗干扰能力也强。但代价是功耗高、封装大。你想想看,DFN-8比WLCSP-6大了快一倍,对空间敏感的产品就不太合适。

我的选型口诀:

  • 消费电子、量大价优 → DW9714
  • 低功耗、小尺寸 → AKM
  • 工业级、高可靠性 → ROHM

2.2 I2C接口时序——别让波形坑了你

I2C接口看着简单,其实坑不少。我刚开始做驱动时,就因为在时序上栽过跟头——芯片死活不响应,查了两天才发现是起始条件保持时间不够。

标准的I2C时序长这样:

SCL: 时钟线
SDA: 数据线

起始条件: SCL高电平时,SDA从高变低
停止条件: SCL高电平时,SDA从低变高

数据采样: SCL低电平时改变SDA,SCL高电平时采样

写操作时序:
START + 设备地址(写) + ACK + 寄存器地址 + ACK + 数据 + ACK + STOP

读操作时序:
START + 设备地址(写) + ACK + 寄存器地址 + ACK + 
START + 设备地址(读) + ACK + 数据 + NACK + STOP

这里有个关键参数——SCL时钟频率。VCM驱动芯片一般支持标准模式(100kHz)和快速模式(400kHz)。我个人习惯用100kHz调试,稳定后再切到400kHz。为什么?频率高了,信号完整性容易出问题,特别是线缆比较长的时候。

避坑指南:

我曾经遇到过一个问题:上拉电阻选太大,导致I2C上升沿太慢,芯片误判数据。后来把4.7kΩ换成2.2kΩ,问题就解决了。记住,I2C总线的上拉电阻要根据总线电容来算,一般2.2kΩ~4.7kΩ比较稳妥。

2.3 寄存器配置基础——从零开始写驱动

VCM驱动芯片的寄存器配置,说白了就是告诉芯片「你要输出多大的电流」。以DW9714为例,它的核心寄存器就几个:

寄存器地址 名称 功能
0x00 VCM_CODE DAC输出值,控制马达位置
0x01 CONTROL 使能、休眠等控制位
0x02 VCM_SLEW 斜率控制,防抖动
0x03 VCM_TIME 定时器设置

写一个简单的驱动函数:

// DW9714 写寄存器示例
int dw9714_write_reg(uint8_t reg_addr, uint8_t data) {
    uint8_t buf[2] = {reg_addr, data};
    
    // 发送起始条件 + 设备地址 + 寄存器地址 + 数据
    if (i2c_master_write(DEV_ADDR, buf, 2) != 0) {
        // 错误处理
        return -1;
    }
    return 0;
}

// 设置马达位置
void dw9714_set_position(uint16_t code) {
    // code范围: 0 ~ 1023 (10位DAC)
    dw9714_write_reg(0x00, (uint8_t)(code & 0xFF));
    dw9714_write_reg(0x01, (uint8_t)((code >> 8) & 0x03));
}

嗯,这里要注意一点:DW9714的DAC是10位的,所以code值范围是0~1023。但有些芯片是12位的,比如AKM系列,范围就是0~4095。写代码时千万别写死,最好用宏定义或者配置文件来管理。

重要提醒:

寄存器配置的顺序很重要!我见过有人先写控制寄存器再写DAC值,结果芯片没使能,DAC值写不进去。正确的顺序是:先配置控制寄存器使能芯片,再写DAC值。另外,写寄存器后建议加一个短暂延时(1ms左右),给芯片内部处理的时间。

2.4 知识体系结构图

下面这张图总结了本章的核心逻辑,帮你理清思路:

VCM驱动芯片选型与配置知识体系 芯片选型对比 I2C接口时序 寄存器配置基础 DW9714: 消费电子首选 AKM: 低功耗场景 ROHM: 工业/车载 起始/停止条件 数据采样与ACK 读写操作流程 VCM_CODE: DAC输出 CONTROL: 使能控制 SLEW/TIME: 防抖 核心原则: 选对芯片 + 调准时序 + 正确配寄存器 = 稳定驱动

这张图把本章内容串起来了。你想想看,选型、时序、配置这三块其实是环环相扣的。芯片选错了,后面时序调得再好也没用;时序不对,寄存器配置得再正确也写不进去。

好了,关于驱动芯片选型和I2C接口的基础就聊到这儿。下一节咱们会深入讲讲电流控制的具体算法和功耗优化技巧,到时候再细聊。


专注资料整理