You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PIC18F26K40使用mTouch库实现CVD电容触摸按键无检测响应问题求助

问题解答

1. 什么是差分CVD?

差分CVD是普通电容分压检测的增强实现,工作时会同时采集触摸感应引脚和参考引脚的电容参数,通过差值计算抵消电源波动、温度漂移、环境电磁干扰等共模干扰,检测稳定性远高于单端CVD模式。

2. 什么是driver shield?我是否需要使用该功能?

driver shield是驱动屏蔽功能,原理是输出与触摸引脚电平完全同步的驱动信号,连接到触摸走线周围的屏蔽层或相邻闲置走线,避免触摸走线和周围导体产生寄生电容消耗电荷、降低检测灵敏度。如果你的触摸走线长度超过2cm、或周围存在高频走线、电源层,建议开启;如果是短走线的极简测试场景可以不用,优先排查其他问题。

3. 我是否需要使用2个模拟通道?

如果使用单端CVD模式,仅1个模拟通道接RB0即可满足单按键检测需求;只有开启差分CVD模式时,才需要额外增加1个模拟通道接参考电容或悬空做参考输入,你当前的单按键测试场景用单通道足够。

4. 之前开发过PIC18F26K22的CTMU模式,CVD是否可以像CTMU一样使用?

两者上层应用逻辑完全一致,都是通过检测引脚的电容变化判断触摸状态,你之前CTMU项目用到的触摸阈值校准、消抖、多按键扫描逻辑都可以直接复用。仅底层检测原理不同:CTMU靠恒流源给感应电容充电计时计算电容值,CVD靠电容分压后ADC采样换算电容值。

5. 可行解决方案

基于mTouch库的排查修复步骤
  1. 配置检查:确认MCC中RB0的模拟功能已开启,无上拉下拉,TRIS位默认配置为输入;mTouch的按键触发阈值先从默认值调低到30~50,大部分初次调试触发失败都是因为阈值设置过高。
  2. 调试验证:在主循环中添加串口打印逻辑,输出MTOUCH_Button_GetRawValue(0)(触摸原始值)和MTOUCH_Button_GetThreshold(0)(触发阈值),观察触摸时原始值的变化幅度,手动将阈值设为变化幅度的60%左右即可。
  3. 硬件检查:触摸按键覆铜面积建议保持在0.5~1.5cm²,走线长度尽量短,不要跨电源层走线,RB0引脚不要外接任何上拉/下拉电容、电阻。
不依赖mTouch库的简易CVD实现
#include <xc.h>
#define HIGH 1
#define LOW 0
#define OUTPUT 0
#define INPUT 1
#define LED_TRIS TRISAbits.TRISA0 // 按需修改为你的LED对应TRIS位
#define LED_LAT LATAbits.LATA0 // 按需修改为你的LED对应LAT位

// RB0对应的ADC通道号,PIC18F26K40的RB0对应AN12
#define TOUCH_ADC_CH 12 
uint16_t touch_base_val = 0; // 无触摸时的基准采样值

// 单次触摸采样函数
uint16_t touch_sample(void)
{
    uint16_t sample_res;
    // 放电阶段
    LATBbits.LATB0 = LOW;
    TRISBbits.TRISB0 = OUTPUT;
    __delay_us(10);
    // 切换为浮空输入待采样
    TRISBbits.TRISB0 = INPUT;
    ADCON0bits.CHS = TOUCH_ADC_CH;
    // 启动ADC采样
    ADCON0bits.GO_nDONE = 1;
    while(ADCON0bits.GO_nDONE);
    sample_res = ADRES;
    return sample_res;
}

void main(void)
{
    SYSTEM_Initialize();
    INTERRUPT_GlobalInterruptEnable();
    INTERRUPT_PeripheralInterruptEnable();
    LED_TRIS = OUTPUT;

    // 上电校准基准值,采样10次取平均
    for(uint8_t i = 0; i < 10; i++)
    {
        touch_base_val += touch_sample();
        __delay_ms(10);
    }
    touch_base_val = touch_base_val / 10;

    while (1)
    {
        uint16_t current_val = touch_sample();
        // 触摸时感应电容变大,采样值会低于基准值,差值超过20判定为按下,可按需调整
        if((touch_base_val - current_val) > 20)
        {
            LED_LAT = HIGH;
        }
        else
        {
            LED_LAT = LOW;
        }
        __delay_ms(10);
    }
}

内容的提问来源于stack exchange,提问作者Tushar Yadav

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 02:12:03