Touch STM32 TSC滑块\u 3 Chu电容式触摸\u STM32F072发现\u 0…255范围内的分辨率和位置计算

Touch STM32 TSC滑块\u 3 Chu电容式触摸\u STM32F072发现\u 0…255范围内的分辨率和位置计算,touch,stm32,stm32f0,Touch,Stm32,Stm32f0,为了理解基于电容触摸/TSC库的应用程序,我一直在研究AN5105中针对STM32F072B Disco评估板给出的基于轮询的示例代码。在调整代码以定制应用程序后,我有几个问题,如下所示,我无法理解,即使在查看了ST的各种应用说明后,也找不到任何解释。您的输入将非常感谢,并将非常有助于我澄清TSC的概念 滑块上0…255范围内的触摸位置的分辨率和计算: TSC提供的头文件tsl_conf.h具有以下参数: #定义TSLPRM_LINROT_分辨率(7)//以位数表示的位置分辨率(范围=1..8)

为了理解基于电容触摸/TSC库的应用程序,我一直在研究AN5105中针对STM32F072B Disco评估板给出的基于轮询的示例代码。在调整代码以定制应用程序后,我有几个问题,如下所示,我无法理解,即使在查看了ST的各种应用说明后,也找不到任何解释。您的输入将非常感谢,并将非常有助于我澄清TSC的概念

  • 滑块上0…255范围内的触摸位置的分辨率和计算:
  • TSC提供的头文件tsl_conf.h具有以下参数:

    #定义TSLPRM_LINROT_分辨率(7)
    //以位数表示的位置分辨率(范围=1..8)

    #定义TSLPRM#u使用_3CH_LIN_H(1)
    //半端电极设计

    MyLinRots[0]。p_Data->Position structure用于比较0…255范围内的位置值,但我无法理解滑块/通道上触摸的值和位置的相关性。分辨率值1..8如何影响此计算?是否有基于分辨率参数的公式来计算位置值,基于滑块上接触的通道

    在AN5105中给出的示例代码中,我试图使用以下代码使4个LED均匀分布在整个滑块的0…255范围内,但无法理解用于与MyLinRots[0]进行比较的值的计算。p_Data->Position structure:

    if(MyLinRots[0].p_Data->StateId == TSL_STATEID_DETECT)
    
    {

    }

  • 在另一个示例中,我将同一STM32F072B迪斯科板上的触摸通道重新配置为3个单独的触摸键。如果我在tsl_conf.h头文件中将TSLPRM_TKEY_Detect_IN_TH和TSLPRM_TKEY_Detect_OUT_TH参数保留为默认值110和120,则项目编译时不会出现任何错误

    //触摸键检测状态输入阈值(范围=0..255)

    #在(110)中定义TSLPRM\u TKEY\u DETECT\u

    //触摸键检测状态输出阈值(范围=0..255)

    #定义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)."
    
    用户代码如下:

    //私有宏 #定义测试密钥(NB)((MyTKeys[(NB)].p_数据->StateId==TSL_StateId_检测);(MyTKeys[(NB)].p_数据->StateId==TSL_StateId_释放检测)|(MyTKeys[(NB)].p_数据->StateId==TSL_StateId_触摸)|(MyTKeys.p_数据->StateId==TSL_检测)

    我不明白我做错了什么,我如何在这个滑块上配置3个可调检测阈值的触摸键

    我已经在Keil中完成了这个项目,我可以分享它来更好地理解这个问题

    非常感谢您对这些问题的支持,这将有助于我理解和学习TSC和Touch应用程序


    谢谢。

    我是否可以将我的项目附加到这里,这可能有助于理解错误?谢谢,我是否可以将我的项目附加在这里,这可能有助于理解错误?非常感谢。
    #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)."
    
    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, LD3_Pin, GPIO_PIN_SET);
        }   
        else
        {
            HAL_GPIO_WritePin(LD4_GPIO_Port, LD3_Pin, GPIO_PIN_RESET);
        }
        
        if (TEST_TKEY(1))
        {
            HAL_GPIO_WritePin(LD4_GPIO_Port, LD4_Pin, GPIO_PIN_SET);
        }   
        else
        {
            HAL_GPIO_WritePin(LD4_GPIO_Port, LD4_Pin, GPIO_PIN_RESET);
        }
        
        if (TEST_TKEY(2))
        {
            HAL_GPIO_WritePin(LD4_GPIO_Port, LD5_Pin, GPIO_PIN_SET);
        }   
        else
        {
            HAL_GPIO_WritePin(LD4_GPIO_Port, LD5_Pin, 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();
      }
    }