问题描述
为了理解基于电容式触摸/ TSC库的应用,我一直在研究AN5105中针对STM32F072B-disco评估板提供的基于轮询的示例代码。调整了代码以针对应用程序进行自定义后,我遇到了以下几个问题,即使在阅读了ST的各种应用程序说明后,也无法理解,也找不到任何解释。您的意见将不胜感激,这将有助于我阐明TSC的概念。
- 滑块上触摸位置的分辨率和计算在0 ... 255范围内:
TSC提供的头文件tsl_conf.h具有以下参数:
#define TSLPRM_LINROT_RESOLUTION (7)
//位置分辨率,以位数为单位(范围= 1..8)
#define TSLPRM_USE_3CH_LIN_H (1)
//半电极设计
MyLinRots [0] .p_Data->位置结构用于比较0 ... 255范围内的位置值,但是我无法理解滑块上的值和触摸位置的相关性/渠道。分辨率值1..8如何影响此计算?是否有基于分辨率参数的公式,可以根据在滑块上触摸哪个通道来计算位置值?
在AN5105中给出的示例代码中,我尝试使用以下代码在0 ... 255的范围内将4个LED均匀地分布在整个滑块中,但无法理解值的计算用于与MyLinRots [0] .p_Data-> Position结构进行比较:
if(MyLinRots[0].p_Data->StateId == TSL_STATEID_DETECT)
{
//TSLPRM_LINROT_RESOLUTION
if(MyLinRots[0].p_Data->Position >= 1 && MyLinRots[0].p_Data->Position < 60)
{
HAL_GPIO_WritePin(LD4_GPIO_Port,LD3_Pin,GPIO_PIN_SET);
HAL_GPIO_WritePin(LD4_GPIO_Port,LD4_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(LD6_GPIO_Port,LD6_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(LD5_GPIO_Port,LD5_Pin,GPIO_PIN_RESET);
}
if(MyLinRots[0].p_Data->Position >= 60 && MyLinRots[0].p_Data->Position < 120)
{
HAL_GPIO_WritePin(LD4_GPIO_Port,GPIO_PIN_RESET);
HAL_GPIO_WritePin(LD4_GPIO_Port,GPIO_PIN_SET);
HAL_GPIO_WritePin(LD5_GPIO_Port,GPIO_PIN_RESET);
}
if(MyLinRots[0].p_Data->Position >= 120 && MyLinRots[0].p_Data->Position < 180)
{
HAL_GPIO_WritePin(LD4_GPIO_Port,GPIO_PIN_SET);
}
if(MyLinRots[0].p_Data->Position >= 180 && MyLinRots[0].p_Data->Position < 255)
{
HAL_GPIO_WritePin(LD4_GPIO_Port,GPIO_PIN_RESET);
}
}
否则//if(MyLinRots[0].p_Data->StateId == TSL_STATEID_RELEASE)
{
HAL_GPIO_WritePin(LD4_GPIO_Port,GPIO_PIN_RESET);
HAL_GPIO_WritePin(LD4_GPIO_Port,GPIO_PIN_RESET);
HAL_GPIO_WritePin(LD5_GPIO_Port,GPIO_PIN_RESET);
HAL_GPIO_WritePin(LD6_GPIO_Port,GPIO_PIN_RESET);
}
-
在另一个示例中,我将同一STM32F072B-disco板上的触摸通道重新配置为3个单独的触摸键。如果我在tsl_conf.h头文件中将TSLPRM_TKEY_Detect_IN_TH和TSLPRM_TKEY_Detect_OUT_TH参数保留为默认值110和120,则项目编译将没有任何错误。
//触摸键检测状态输入阈值(范围= 0..255)
#define TSLPRM_TKEY_DETECT_IN_TH(110)
//触摸键检测状态输出阈值(范围= 0..255)
#define TSLPRM_TKEY_DETECT_OUT_TH(120)
使用这些参数值时,我不得不非常用力地按下通道,并且常常是很难检测到触摸,因此我将检测阈值重新配置为较低的值50。
#define TSLPRM_TKEY_DETECT_IN_TH (50)
通过此更改,我得到如下编译错误:
../Middlewares/ST/STM32_TouchSensing_Library/inc/tsl_check_config.h(162): error: #35: #error directive: "TSLPRM_TKEY_DETECT_OUT_TH is out of range (TSLPRM_TKEY_PROX_IN_TH+1 .. TSLPRM_TKEY_DETECT_IN_TH-1)."
//私人宏 #define TEST_TKEY(NB)((MyTKeys [(NB)]。p_Data-> StateId == TSL_STATEID_DETECT)||(MyTKeys [(NB)]。p_Data-> StateId == TSL_STATEID_DEB_RELEASE_DETECT)||(MyTKeys [[NB)] .p_Data-> StateId == TSL_STATEID_TOUCH)||(MyTKeys [(NB)]。p_Data-> StateId == TSL_STATEID_DEB_DETECT))
while (1)
{
if (tsl_user_Exec() == TSL_STATUS_OK)
{
ProcessSensors(); // Execute sensors related tasks
}
}
void ProcessSensors (void)
{
if (TEST_TKEY(0))
{
HAL_GPIO_WritePin(LD4_GPIO_Port,GPIO_PIN_SET);
}
else
{
HAL_GPIO_WritePin(LD4_GPIO_Port,GPIO_PIN_RESET);
}
if (TEST_TKEY(1))
{
HAL_GPIO_WritePin(LD4_GPIO_Port,GPIO_PIN_RESET);
}
if (TEST_TKEY(2))
{
HAL_GPIO_WritePin(LD4_GPIO_Port,GPIO_PIN_RESET);
}
}
static void MX_TSC_Init(void)
{
/** Configure the TSC peripheral
htsc.Instance = TSC;
htsc.Init.CTpulseHighLength = TSC_CTPH_2CYCLES;
htsc.Init.CTpulseLowLength = TSC_CTPL_2CYCLES;
htsc.Init.SpreadSpectrum = disABLE;
htsc.Init.SpreadSpectrumDeviation = 1;
htsc.Init.SpreadSpectrumPrescaler = TSC_SS_PRESC_DIV1;
htsc.Init.pulseGeneratorPrescaler = TSC_PG_PRESC_DIV4;
htsc.Init.MaxCountValue = TSC_MCV_8191;
htsc.Init.IODefaultMode = TSC_IODEF_OUT_PP_LOW;
htsc.Init.SynchroPinPolarity = TSC_SYNC_POLARITY_FALLING;
htsc.Init.AcquisitionMode = TSC_ACQ_MODE_norMAL;
htsc.Init.MaxCountInterrupt = disABLE;
htsc.Init.ChannelIOs = TSC_GROUP1_IO3|TSC_GROUP2_IO3|TSC_GROUP3_IO2;
htsc.Init.Shieldios = 0;
htsc.Init.SamplingIOs = TSC_GROUP1_IO4|TSC_GROUP2_IO4|TSC_GROUP3_IO3;
if (HAL_TSC_Init(&htsc) != HAL_OK)
{
Error_Handler();
}
}
我不明白我做错了什么,如何在此滑块上配置3个触摸键并设置可检测阈值?
我已经在Keil中完成了该项目,可以共享以更好地理解问题。
非常感谢您对这些问题的支持,这对我理解和学习TSC和Touch应用程序非常有帮助。
谢谢。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)