STM32 TSC Slider_3 Ch_Capacitive Touch_STM32F072 Discovery_分辨率和位置计算,范围为0 ... 255

问题描述

为了理解基于电容式触摸/ TSC库的应用,我一直在研究AN5105中针对STM32F072B-disco评估板提供的基于轮询的示例代码。调整了代码以针对应用程序进行自定义后,我遇到了以下几个问题,即使在阅读了ST的各种应用程序说明后,也无法理解,也找不到任何解释。您的意见将不胜感激,这将有助于我阐明TSC的概念。

  1. 滑块上触摸位置的分辨率和计算在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);

}

  1. 在另一个示例中,我将同一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 (将#修改为@)