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 知识体系结构图
下面这张图总结了本章的核心逻辑,帮你理清思路:
这张图把本章内容串起来了。你想想看,选型、时序、配置这三块其实是环环相扣的。芯片选错了,后面时序调得再好也没用;时序不对,寄存器配置得再正确也写不进去。
好了,关于驱动芯片选型和I2C接口的基础就聊到这儿。下一节咱们会深入讲讲电流控制的具体算法和功耗优化技巧,到时候再细聊。