芯源半导体CW32
直播中

郭大

11年用户 1059经验值
擅长:嵌入式技术
私信 关注
[经验]

芯源电容触摸检测电路软件的过程

在电容kit板的案例程序中,软件定时(用定时器中断实现)对每个被测IO 充电并检测放电时间N 次,N 次循环检测后,
将统计结果提交滤波器状态机,得到按键当前状态。每次检测的具体过程如下:

1. 将IO 口置高2 个机器周期,此时金属部件及电容C 对GND 的电压被充高到VCC。

2. 将IO 口配置为电压比较器输入模式,此时IO 口状态切换为高阻输入状态,金属部件及电容C 通过对
GND 的旁路电阻R 放电,端子电压变化曲线为标准的RC 放电曲线。

3. 软件记录循环定时器(GtiM 最高主频运行)的当前值,并等待电压比较器的输出翻转(电压比较器被
配置为与某电压门限比较)。

4. 电压比较器输出翻转后立即记录循环定时器当前值,并结合前次记录的时间记录输出结果。

触摸检测过程的相关代码如下:


  • uint32_t TouchKey_GetValue(uint8_t key, uint8_t ref)
  • {
  • uint32_t CurTime;
  • //VC1 切换通道
  • CW_VC1->CR0_f.INP = key; // 设置按键通道
  • CW_VC1->DIV_f.DIV = ref; // 设置按键比较的参考比例
  • // 获取放电时间
  • CW_GPIOB->DIR  = ~((1UL<<8)>>key); // 按键端口输出,对电容充电
  • __NOP();
  • __NOP();
  • CW_GTIM->CNT = 0x0000; // 计数器清零
  • CW_GPIOB->DIR |= ((1UL<<8)>>key); // 按键端口输入高阻
  • while((CW_VC1->SR_f.FLTV) == 1 ); // 等到放电到比较点
  • CurTime = CW_GTIM->CNT; // 获取放电时间
  • return CurTime;
  • }



更多回帖

发帖
×
20
完善资料,
赚取积分