3、开环控制策略:DAC直接驱动、PWM转电压、线性度校准、温度补偿初探

开环控制,说白了就是“只管发命令,不管看结果”。在镜头驱动里,我们给马达一个电压,它就动一下。至于它到底动没动到位?我们暂时不关心。听起来有点粗糙,对吧?但很多场景下,开环控制成本低、响应快,用好了其实很可靠。

我个人习惯把开环驱动分成三种主流玩法:DAC直接驱动、PWM转电压,以及线性度校准与温度补偿。今天咱们就一个一个拆开聊。

3.1 DAC直接驱动:最“干净”的模拟信号

DAC(数模转换器)直接输出一个模拟电压,送到VCM(音圈马达)的驱动芯片。这是最直接的方式。信号几乎没有纹波,噪声也低。

我在项目中遇到过一个问题:用了一颗12位的DAC,分辨率4096级,理论上控制精度很高。但实际对焦时,画面总在某个位置轻微抖动。后来发现是DAC的参考电压Vref纹波太大。你想想看,参考电压不稳,输出自然不准。

经验之谈: DAC驱动时,Vref的电源纹波建议控制在10mV以内。如果板子上空间允许,加一级RC滤波或者用LDO单独供电,效果会好很多。

DAC直接驱动的典型电路结构如下:

MCU (SPI/I2C) → DAC芯片 → 运放(可选) → VCM驱动 → 镜头

这里有个关键点:DAC的输出阻抗通常不低,如果直接驱动VCM,可能会拉低电压。我建议在DAC后面加一级电压跟随器(运放),提高驱动能力。

参数 DAC直接驱动 PWM转电压
纹波/噪声 低(<1mV) 较高(需滤波)
分辨率 高(12~16位) 受PWM频率和滤波限制
成本 较高(需额外DAC芯片) 低(MCU自带PWM)
响应速度 快(微秒级) 中等(受滤波时间常数影响)
适用场景 高精度、低噪声要求 成本敏感、精度要求一般

3.2 PWM转电压:低成本的主流方案

大部分嵌入式MCU都自带PWM模块。用PWM加RC滤波,就能得到一个近似直流的电压。成本几乎为零。但这里有个坑——纹波。

PWM的频率越高,滤波后的纹波越小。但频率太高,MCU的功耗和切换损耗也会增加。我一般选20kHz~50kHz,人耳听不到,纹波也能控制在可接受范围。

举个例子:

PWM频率: 25kHz
RC滤波: R=10kΩ, C=0.1μF
截止频率: f_c = 1/(2πRC) ≈ 159Hz
纹波: 约10~20mV(取决于PWM占空比和负载)

嗯,这里要注意。RC滤波的截止频率要远低于PWM频率,但又不能太低,否则响应太慢。我见过有人把截止频率设到10Hz,结果镜头对焦像“慢动作”,用户体验极差。

避坑指南: 我曾经在一个项目中,PWM转电压后直接驱动VCM,结果发现镜头在某个位置有“嗡嗡”声。排查了半天,发现是PWM频率刚好和VCM的机械谐振频率重合。后来把PWM频率从20kHz改到32kHz,问题解决。所以,选PWM频率时,最好避开VCM的谐振点。

3.3 线性度校准:让“命令”和“动作”对齐

开环控制最大的问题是什么?非线性。

你给DAC写一个值,理论上镜头应该移动对应的距离。但实际上,VCM的位移-电压曲线不是完美的直线。尤其是在行程的两端,非线性特别明显。

我习惯的做法是:先做一次线性度标定。

  1. 从0到满量程,每隔10%取一个点。
  2. 记录每个点对应的实际位移(可以用激光测距仪,或者用图像清晰度评估)。
  3. 拟合出一条校准曲线,存成查找表(LUT)。
  4. 运行时,根据目标位移反查DAC值。

下面是一个典型的线性度校准流程:

线性度校准流程 1. 设定初始DAC值 2. 测量实际位移 3. 计算误差 4. 拟合校准曲线 5. 生成LUT 关键点 • 至少取10个点 • 两端加密采样 • 使用分段线性插值

校准之后,线性度通常能从原来的±10%提升到±1%以内。效果很明显。

3.4 温度补偿初探:别让温度“偷走”精度

VCM的线圈电阻会随温度变化。温度升高,电阻变大,同样的电压下电流变小,推力变小,镜头位移就少了。这就是为什么同一个DAC值,冬天和夏天拍出来的对焦位置不一样。

我做过一个简单的温度补偿方案:

  • 在VCM附近贴一颗NTC热敏电阻,或者直接用驱动芯片内置的温度传感器。
  • 标定出不同温度下的位移-电压曲线。
  • 运行时,根据当前温度查表,修正DAC值。

举个例子:

// 伪代码:温度补偿
uint16_t dac_value = target_position;  // 目标位置对应的DAC值
int16_t temp = read_temperature();     // 读取当前温度

// 温度补偿系数:每摄氏度修正0.3%
float compensation = 1.0 + (temp - 25.0) * 0.003;

dac_value = (uint16_t)(dac_value * compensation);

// 限幅
if (dac_value > DAC_MAX) dac_value = DAC_MAX;
if (dac_value < DAC_MIN) dac_value = DAC_MIN;

write_dac(dac_value);
核心思路: 温度补偿不是万能的。它只能修正缓慢的温度漂移。如果环境温度变化剧烈(比如从室内到室外),建议配合闭环控制一起使用。

嗯,说到温度补偿,我踩过一个坑。有一次产品在高温环境下测试,镜头对焦位置飘了将近20μm。我以为是温度补偿没做好,查了半天,结果发现是驱动芯片的参考电压温漂太大。换了颗低温漂的参考电压芯片,问题就解决了。所以,先排查硬件,再优化软件,这个顺序不能乱。

3.5 小结:开环控制的核心要点

开环控制虽然简单,但要做好并不容易。我总结了几条经验:

  • DAC驱动:信号干净,但成本高,适合高端产品。
  • PWM转电压:成本低,但要注意纹波和频率选择。
  • 线性度校准:必须做,否则精度没法保证。
  • 温度补偿:初探阶段,先做简单的线性补偿,后续再优化。

开环控制是基础。下一层,我们会进入闭环控制的世界。但那是后话了。先把今天的内容消化掉,动手试试看。