在气体检测、光谱分析等精密测量领域,TDLAS(可调谐二极管激光吸收光谱)技术因其高灵敏度、快速响应和非接触测量等优势,已成为工业过程监控和环境监测的重要手段。然而传统模拟锁相放大器存在温漂大、参数固化等痛点,而数字锁相放大器(DLIA)通过FPGA实现数字信号处理,能够完美解决这些问题。
AC7020作为国产FPGA中的佼佼者,其内置的DSP模块和灵活的逻辑资源,特别适合构建高性能数字锁相放大器。我在某工业气体分析仪项目中采用这套方案后,系统信噪比提升至传统方案的3倍以上,且通过FPGA的可编程特性实现了多频点并行检测——这是模拟电路难以企及的优势。
典型TDLAS系统的光路部分包含激光器、气体吸收池和光电探测器,而我们的电路设计聚焦于电信号处理链:
code复制光电探测器 → 前置放大 → ADC → FPGA数字处理 → DAC输出
其中FPGA内部实现的核心模块包括:
根据TDLAS系统1kHz~100kHz的工作频率范围,我们对AC7020的资源分配如下:
| 模块 | 资源类型 | 用量 | 备注 |
|---|---|---|---|
| NCO | DSP48E1 | 2个 | 产生正交参考信号 |
| 数字乘法器 | LUT+寄存器 | 300个 | 18位定点数乘法 |
| CIC滤波器 | 块RAM | 4块 | 降采样率128:1 |
| FIR滤波器 | DSP48E1 | 8个 | 截止频率可调 |
| 相位检测 | 逻辑单元 | 150个 | 数字鉴相器设计 |
提示:AC7020的DSP48E1模块支持27x18位乘法运算,正好匹配我们24位ADC的输出精度需求
虽然本项目主打数字处理,但模拟前端性能直接影响最终指标。我们的设计采用三级放大架构:
特别注意:在PCB布局时,光电探测器输入端需要:
在FPGA中实现的数字锁相核心代码如下(Verilog片段):
verilog复制// 18位相位累加器
always @(posedge clk_50m) begin
phase_acc <= phase_acc + freq_tuning_word;
end
// 查找表生成正交信号
assign sin_out = sine_lut[phase_acc[31:24]];
assign cos_out = cosine_lut[phase_acc[31:24]];
// 混频与滤波
mult18x18 mix_i (.clk(clk_50m), .a(adc_data), .b(sin_out), .p(mixed_i));
mult18x18 mix_q (.clk(clk_50m), .a(adc_data), .b(cos_out), .p(mixed_q));
cic_decimate cic_i (.clk(clk_50m), .din(mixed_i), .dout(i_out));
cic_decimate cic_q (.clk(clk_50m), .din(mixed_q), .dout(q_out));
针对TDLAS的二次谐波检测需求,我们采用双通道滤波方案:
第一级CIC滤波器:
第二级FIR补偿滤波器:
实测显示,这种组合在Xilinx System Generator中仿真时,带内纹波仅0.05dB,完全满足ppm级气体浓度检测需求。
通过以下方法将系统动态范围提升至120dB:
在甲烷气体检测实验中,系统表现如下:
| 浓度(ppm) | 输出电压(mV) | 噪声电平(μV) | 信噪比(dB) |
|---|---|---|---|
| 100 | 1245 | 2.1 | 115.5 |
| 500 | 5980 | 3.7 | 114.2 |
| 1000 | 11820 | 5.2 | 113.1 |
问题1:高频噪声干扰明显
问题2:相位锁定不稳定
对于需要更高性能的场景,可以考虑:
我在最近一个项目中尝试了第4种方案,将浓度计算延迟从原来的15ms降低到2ms,这对工业过程控制场景尤为重要。具体做法是将FIR滤波后的I/Q数据通过AXI-Stream接口直接送入Cortex-M3内核,利用ARM的FPU加速矩阵运算。