【上海航芯 ACM32F070开发板+触控功能评估板测评】触摸按键
[复制链接]
本帖最后由 KING_阿飞 于 2022-10-3 15:13 编辑
【上海航芯 ACM32F070开发板+触控功能评估板测评】触摸按键
为了更好的方便大家,同时方便自己,按照我的习惯,放上我的Github地址: ,大家需要的可以自取。
在上一节中,我们可以通过LCD进行简单的时间显示,现在我们开始测试这款开发板的另一特性,触摸按键
一、电容式触摸传感器
>>自电容式触摸控制传感器通过检测电容的变化来检测手指是否触及触摸表面。通过调整检测到的电容变化量来调整触摸的灵敏度
主要特性:
- 最大支持 16 个自电容检测通道
- 支持通道补偿
- 自电容检测范围 5~50pf,灵敏度 0.1pf
- 支持扫描时钟扩频
- 支持屏蔽通道
- 支持睡眠模式
其原理在官方用户手册中也给出:
二、运行流程
1、按键初始化
uint8_t TouchKey_Init(void)
{
uint8_t ret = 0;
TKEY_Init();
TKEY_Calibrate_ParaInit();
ret = TKEY_Quick_Calibrate();
TKEY_Timer_ScanInit();
TKEY_Timer_Scan_Start();
TKEY_DEBUG("sgu16_RawDataRangRatio = %d\n", sgu16_RawDataRangRatio);
TKEY_DEBUG("sgu8_TKEYScanTime = %d\n", sgu8_TKEYScanTime);
return ret;
}
2、扫描按键获取值
uint8_t TK_TimerSacn_GetKeyVal(void)
{
uint8_t ucKey = 0xFF;
TKEY_Timer_Scan_Result(&ucKey);
#ifdef TKEY_WAVEFORM_OUTPUT
TK_DebugDataOut();
#endif
return ucKey;
}
3、自校准处理
void TKEY_Calibrate_Process(void)
{
uint8_t ucI;
const TKEY_ChannelDataDef *ChannelData;
uint16_t average, differ;
for(ucI = 0; TKEY_Handle.ChannelData[ucI].ChannelId != 0xFFFF; ucI++)
{
ChannelData = &TKEY_Handle.ChannelData[ucI];
if(ChannelData->Tkey_CalData->CalFlag == TKEY_CALIBRAT_SELF)//×ÔÎòD£×¼
{
Bubble_Sort(ChannelData->Tkey_CalData->Caldata, TKEY_CALIBRATE_BUFF_MAX);
average = Calculate_Sample_Average(&ChannelData->Tkey_CalData->Caldata[2], TKEY_CALIBRATE_BUFF_MAX-4);
differ = Calculate_Sample_differ(&ChannelData->Tkey_CalData->Caldata[2], TKEY_CALIBRATE_BUFF_MAX-4, average);
if(differ <= TKEY_Handle.ChannelData[ucI].Tkey_Data->RawData / sgu16_RawDataRangRatio)
{
ChannelData->Tkey_Data->BaseLine = average;
}
ChannelData->Tkey_CalData->CalFlag = TKEY_CALIBRAT_IDLE;
ChannelData->Tkey_Data->StateId = TKEY_STATEID_RELEASE;
}
else if(ChannelData->Tkey_CalData->CalFlag == TKEY_CALIBRAT_QUICK)
{
ChannelData->Tkey_CalData->CalFlag = TKEY_CALIBRAT_IDLE;
TKEY_DEBUG("TK_%d:TKEY_Quick_Calibrate\n",TKEY_Handle.ChannelData[ucI].ChannelId);
TKEY_DEBUG("TK_%d:Baseline[%d]-Rawdata[%d]\n", TKEY_Handle.ChannelData[ucI].ChannelId, \
TKEY_Handle.ChannelData[ucI].Tkey_Data->BaseLine, TKEY_Handle.ChannelData[ucI].Tkey_Data->RawData);
//HAL_TKEY_Quick_Calibrate_RefData(&TKEY_Handle,TKEY_QUICK_QUICK_CALIBRATE_TIMES);
HAL_TKEY_Quick_Calibrate_RefData_OneChannel(&TKEY_Handle, TKEY_Handle.ChannelData[ucI].ChannelId, TKEY_QUICK_QUICK_CALIBRATE_TIMES);
TKEY_DEBUG("TK_%d:TKEY_CALIBRAT_SELF BaseLine=%d\n",TKEY_Handle.ChannelData[ucI].ChannelId,TKEY_Handle.ChannelData[ucI].Tkey_Data->BaseLine);
ChannelData->Tkey_Data->StateId = TKEY_STATEID_RELEASE;
}
}
}
int main(void)
{
uint8_t ret = 0;
uint8_t fu8_Tkey_state = 0xff;
Uart_Init(115200);
ret = TouchKey_Init();
if(ret)
{
printfS("TouchKey_Init is Fail!\r\n");
}
else
{
printfS("TouchKey_Init is Success!\r\n");
}
while (1)
{
fu8_Tkey_state = TK_TimerSacn_GetKeyVal();
if(fu8_Tkey_state != 0xFF)
{
Beep_On(5);
#ifndef TKEY_WAVEFORM_OUTPUT
printfS("TK_%d\r\n", fu8_Tkey_state);
#endif
}
TKEY_Calibrate_Process();
rt_thread_mdelay(100);
}
}
同时配合官方的软件包,可以使用官方自带的软件进行分析。
三、实现效果
VID_20221003_145846
|