在电子测量领域,电容检测是一项基础而关键的技术。无论是工业自动化中的液位检测,还是消费电子中的触摸控制,亦或是环境监测中的湿度传感,都离不开对微小电容变化的精确测量。传统电容测量方法在面对0.5pF至6.5nF这样的小电容范围时,往往会遇到精度不足、抗干扰能力差等问题。
本文将详细介绍一种基于PIC微控制器和运算放大器的高精度小电容检测方案。该设计采用双斜率积分技术,结合MCP6291运算放大器和PIC16F690微控制器,实现了在宽电源电压范围(3.0V至5.5V)下的稳定测量。特别值得一提的是,该方案对电路中的寄生电容进行了有效处理,使得测量结果更加可靠。
在众多电容测量方法中,我们选择了运算放大器积分器方案,主要基于以下三个关键优势:
寄生电容处理能力:运算放大器的虚短特性将传感器对地的寄生电容(CCG)强制钳位到正确电压,有效消除了其对测量的影响。在实际PCB布局时,应将CCG直接放置在运放反相输入端引脚处,这不仅能提高运放稳定性,还能消除通过CCG的动态电流。
并联寄生电容最小化:相比RC放电法或振荡器法,积分器方案的等效并联寄生电容要小得多。实测表明,在合理布局下,并联寄生电容可控制在0.5pF以内。
恒定斜率带来的精度提升:积分器输出的三角波具有恒定斜率,这使得时间测量更加准确。通过使用微控制器的定时器捕获过零时刻,可以获得比测量RC时间常数更高的时间分辨率。
图1展示了积分器解决方案的完整信号链:
code复制[Square Wave Voltage] → [V-I转换] → [积分器] → [阈值检测] → [微控制器]
(VINT) (IINT) (VSEN) (VREF)
运算放大器选择:
选用MCP6291的主要原因包括:
电阻网络设计:
系统工作时产生两个关键时间测量值:
这两个时间的理论计算公式为:
code复制t1 = (VRH - VRL) * CSEN * RINT / VCM
t2 = (VRH - VRL) * CSEN * RINT / (VDD - VCM)
当VCM恰好等于VDD/2时,t1与t2相等,此时测量精度最高。实际电路中,由于电阻容差和运放失调电压影响,两者会有约±2%的差异。
图2展示了正常工作时的关键波形:
code复制VINT: [0V___|‾‾‾|___] 方波,频率由CSEN值决定
VSEN: /‾‾‾‾\____/‾‾‾‾\ 三角波,斜率与CSEN成反比
VREF: [VRL_|VRH|_VRL] 滞回比较,提供精确的触发点
电容测量固件采用状态机结构,主要步骤如下:
初始化阶段:
正向积分(测量t1):
assembly复制BSF STATUS, RP0 ; 选择Bank1
MOVLW b'00000010' ; VREF = VRH
MOVWF CVRCON ; 设置高阈值
BCF STATUS, RP0 ; 返回Bank0
BCF PORTC, RC2 ; P1=0,开始正向积分
CALL Delay_100us ; 等待运放稳定
BSF T1CON, TMR1ON ; 启动Timer1计数
负向积分(测量t2):
assembly复制BSF PORTC, RC2 ; P1=1,开始负向积分
BSF T1CON, TMR1ON ; 重启Timer1
数据处理:
assembly复制MOVF TMR1L, W ; 读取计时结果低字节
MOVWF k1_L ; 存储t1计数值
MOVF TMR1H, W
MOVWF k1_H
; 重复读取k2后计算:
ADDWF k1_L, k2_L ; k1 + k2低字节相加
MOVF k1_H, W
ADDWFC k2_H, F ; 带进位的高字节相加
RRCF k_sum_H, F ; 除以2求平均
RRCF k_sum_L, F
动态基准校准:
在系统初始化时,可启用PIC16F690的ADC模块测量实际VDD电压,据此动态调整VRL和VRH的标称值,消除电源电压波动带来的误差。
数字滤波处理:
c复制#define AVG_TIMES 8
uint16_t running_sum = 0;
for(uint8_t i=0; i<AVG_TIMES; i++){
running_sum += GetCapacitance();
__delay_ms(10);
}
uint16_t avg_csen = running_sum / AVG_TIMES;
通过8次测量取平均,可将随机噪声影响降低至原来的35%。
温度补偿:
当环境温度变化超过±10℃时,应启用温度补偿算法:
c复制float compensated_csen = raw_csen * (1 + 0.0005*(temp - 25));
表1总结了各环节的误差贡献(VDD=3.0V最坏情况):
| 误差源 | 误差量 | 对RH的影响 |
|---|---|---|
| VREF精度(VRH-VRL) | ±4% | ±24% |
| RINT电阻容差 | ±1% | ±6% |
| 内部振荡器误差 | ±1% | ±6% |
| 运放GBWP限制(CSEN=0.6pF) | -0.5% | N/A |
| 传感器初始误差 | ±3% | ±3% |
工厂校准步骤:
c复制cal_factor = 100.0 / (k_cal * 0.10025);
现场自校准:
c复制CPAR = (k_open * 0.10025) / 2;
采用Humirel HS1101LF湿度传感器时:
c复制float RH = 0.32 * (avg_csen - 162.0);
图3展示了传感器对呼吸的响应曲线:
code复制[时间(s)] [CSEN(pF)] [RH%]
0 180 10.0
2 182 11.2
4 185 13.0
(呼吸后)
6 192 18.4
8 188 15.6
响应时间约2秒,符合数据手册规格。
将CSEN替换为PCB上的触摸焊盘:
设计要点:
去抖动算法:
c复制#define TOUCH_THRESH 5 // 0.5pF变化量
uint8_t touch_count = 0;
if(current_csen > baseline + TOUCH_THRESH){
touch_count++;
if(touch_count > 3) return TOUCHED;
}else{
touch_count = 0;
}
对于需要0.001pF分辨率的应用,可采用图4的衰减器方案:
code复制VA = VINT * (RA2/(RA1+RA2)) ≈ VINT * 0.01
IINT = VA / RINT ≈ VINT / (100*RINT)
关键修改:
通过模拟开关切换不同RINT值实现自动量程:
c复制void AutoRange(){
uint16_t k = GetRawCount();
if(k > 60000){
SetRange(RINT_665K); // 1pF/count
}else if(k < 1000){
SetRange(RINT_66M); // 0.01pF/count
}
}
在多次项目实践中,我们总结了以下宝贵经验:
PCB布局要点:
调试技巧:
参数优化:
python复制# Python计算最优RINT值
def calc_rint(target_res, vdd=5.0, tclk=1e-6):
return (vdd/2) * tclk / (0.375*vdd * target_res)
# 示例:0.1pF/count对应RINT=6.67MΩ
这个设计已经成功应用于工业湿度记录仪、医疗设备触摸界面和汽车电容式液位传感器等多个领域。其核心价值在于以低成本方案(BOM成本<$3)实现了接近专业LCR表的测量精度,同时保持了良好的温度稳定性和长期可靠性。