电容传感技术通过检测电极与地之间的电容变化实现非接触式交互,其核心原理基于电荷转移或弛豫振荡。在嵌入式领域,CSR(CapSense Relaxation Oscillator)和CSD(CapSense Sigma Delta)代表了两种典型实现方案。传统CSR方案采用弛豫振荡器架构,通过测量RC充放电频率变化检测电容值,但存在噪声敏感、动态范围有限等固有缺陷。
CSD方案通过引入Σ-Δ调制器和开关电容技术,实现了三大突破性改进:
提示:CSD方案需要额外配置CMOD电容和RB电阻,这是与CSR硬件设计的主要差异点。建议在PCB布局阶段预留这两个元件的安装位置。
CSR采用如图1所示的弛豫振荡器结构,其核心部件包括:
c复制// CSR典型工作流程
CSR_Start(); // 启动弛豫振荡器
CSR_SetDacCurrent(0x20); // 设置充电电流
count = CSR_wReadSensor(0); // 读取通道0计数值
该方案的局限性在于:
CSD采用如图2所示的Σ-Δ调制架构,关键改进点包括:
调制器前端:
数字处理单元:
c复制// CSD初始化示例
CSD_Start();
CSD_SetDefaultFingerThresholds(); // 加载默认阈值
CSD_InitializeBaselines(); // 初始化基线
表1对比了两种方案的硬件需求差异:
| 特性 | CSR方案 | CSD方案 |
|---|---|---|
| 外部元件 | 无需 | CMOD+RB |
| 模拟资源占用 | 1个比较器 | 比较器+开关电容阵列 |
| 时钟需求 | 仅IMO | VC1/VC2/VC3多时钟域 |
| 抗干扰能力 | 中等 | 优秀 |
CSD通过多级阈值实现智能触控判断:
FingerThreshold:
Hysteresis:
c复制// 动态调整阈值示例
CSD_baBtnFThreshold[0] = 80; // 通道0阈值
CSD_baBtnHysteresis[0] = 20; // 通道0迟滞
CSD采用三重噪声防护机制:
NoiseThreshold:
NegativeNoiseThreshold:
SensorsAutoreset:
注意:NegativeNoiseThreshold建议设置为基线值的5-10%,可有效抑制瞬时脉冲干扰。
CSD提供灵活的扫描策略配置:
ScanningSpeed:
Resolution:
表2展示CY8C21x34的扫描时间对照:
| 分辨率 | VC2分频 | VC3分频 | PWM周期 | 扫描时间(ms) |
|---|---|---|---|---|
| 12位 | 8 | 128 | 4 | 2.1 |
| 14位 | 8 | 256 | 8 | 8.4 |
| 16位 | 8 | 256 | 32 | 33.6 |
CMOD取值直接影响系统灵敏度:
math复制C_{MOD} = \frac{N_S \cdot T_S}{R_B \cdot (V_{DD} - V_{REF})}
其中:
实测技巧:使用1%精度的C0G材质电容可降低温度漂移影响。
RB取值决定调制器动态范围:
math复制R_B = \frac{N_S}{C_X \cdot f_S \cdot (1 - \frac{V_{REF}}{V_{DD}})} \cdot \frac{VC3}{VC2 \cdot N_{PWM}}
math复制R_B = \frac{N_{MAX}}{C_X \cdot f_S \cdot (1 - \frac{V_{REF}}{V_{DD}})}
表3给出常用配置参考值:
| 传感器类型 | CX典型值(pF) | CMOD(μF) | RB(kΩ) |
|---|---|---|---|
| 触摸按键 | 5-15 | 0.01 | 220-470 |
| 线性滑条 | 10-30 | 0.022 | 100-330 |
| 接近检测 | 1-5 | 0.0047 | 680-1M |
CSD对CSR的API进行了重构:
扫描控制:
CSR_StartScan()/StopScan()CSD_ScanAllSensors()全自动扫描基线管理:
CSR_bUpdateBaseline()为:
CSD_UpdateSensorBaseline()CSD_UpdateAllBaselines()状态检测:
CSD_bIsSensorActive()增加去抖逻辑CSD_bIsAnySensorActive()全局检测c复制// CSD典型工作流程
void main() {
CSD_Start();
CSD_SetDefaultFingerThresholds();
CSD_InitializeBaselines();
while(1) {
CSD_ScanAllSensors();
CSD_UpdateAllBaselines();
if(CSD_bIsAnySensorActive()) {
for(uint8 i=0; i<CSD_ButtonCount; i++) {
if(CSD_bIsSensorActive(i)) {
// 处理触控事件
}
}
}
}
}
CSD推荐采用事件驱动架构:
配置扫描完成中断:
c复制void CSD_ISR(void) interrupt CSD_VECTOR {
if(CSD_GetScanStatus() == SCAN_COMPLETE) {
g_scanReady = true;
}
}
主循环异步处理:
c复制while(1) {
if(g_scanReady) {
CSD_UpdateAllBaselines();
ProcessTouchEvents();
g_scanReady = false;
CSD_ScanAllSensors(); // 触发下次扫描
}
// 其他任务...
}
现象:触控响应迟钝或误触发
解决方案:
c复制// 动态调整参考电压示例
if(sensitivity_low) {
CSD_SetRefValue(ref_value--); // 降低VREF提升灵敏度
}
现象:无触控时计数持续缓慢变化
优化策略:
现象:特定频段下误触发
表4展示不同配置的抗干扰能力对比:
| 配置类型 | 重复周期 | 抗窄带干扰 | 抗宽带干扰 |
|---|---|---|---|
| PRS16 | 65535clk | ★★★★☆ | ★★★☆☆ |
| PRS8+Prescaler | 可调 | ★★★☆☆ | ★★☆☆☆ |
| PRS8 | 255clk | ★★☆☆☆ | ★☆☆☆☆ |
CSD的ShieldElectrode功能可有效抑制水渍影响:
屏蔽电极布局:
软件配置:
c复制// 启用屏蔽电极输出
CSD_ShieldElectrodeOut = ROW_0_OUT;
寄生电容补偿:
math复制C_{PAR} = \frac{\varepsilon_0 \varepsilon_r A}{d}
其中:
通过扫描参数调整可降低功耗:
速度/分辨率权衡:
动态功耗管理:
c复制void EnterLowPowerMode() {
CSD_SetScanMode(SLOW, 10); // 低速低分辨率
CSD_SetRefValue(8); // 最高VREF减少比较器翻转
}
硬件优化:
CSD支持与其它PSoC模块协同工作:
模拟协同:
c复制// 配置CSD与ADC共用VREF
CSD_RefSource = VREF_ADC;
ADC_Start();
数字联动:
c复制// 触控触发PWM输出
if(CSD_bIsSensorActive(0)) {
PWM_WriteCompare(255);
}
DMA加速:
c复制// 配置DMA自动搬运传感器数据
DMA_Config(CSD_CountsBuffer, g_sensorData, 16);
在实际项目中,我曾遇到一个典型案例:某家电面板在电机启停时出现误触发。通过将PRS配置改为PRS16模式,并调整RB从330kΩ增至470kΩ,使噪声免疫力提升约40%。这印证了CSD方案参数调优的重要性——合理的硬件配置配合精细的软件参数调整,才能发挥其最大效能。