在电容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;
}
|