静電容量式タッチ/TSC ライブラリ ベースのアプリケーションを理解するために、STM32F072B-Disco 評価ボード用の AN5105 に記載されているポーリング ベースのサンプル コードを調べてきました。コードを微調整してアプリケーション用にカスタマイズした後、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->Position 構造体を使用して、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, LD3_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(LD6_GPIO_Port, LD6_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(LD4_GPIO_Port, LD4_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(LD5_GPIO_Port, LD5_Pin, GPIO_PIN_RESET);
}
if(MyLinRots[0].p_Data->Position >= 120 && MyLinRots[0].p_Data->Position < 180)
{
HAL_GPIO_WritePin(LD4_GPIO_Port, LD3_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(LD5_GPIO_Port, LD5_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(LD4_GPIO_Port, LD4_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(LD6_GPIO_Port, LD6_Pin, GPIO_PIN_SET);
}
if(MyLinRots[0].p_Data->Position >= 180 && MyLinRots[0].p_Data->Position < 255)
{
HAL_GPIO_WritePin(LD4_GPIO_Port, LD3_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(LD5_GPIO_Port, LD5_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);
}
}
else //if(MyLinRots[0].p_Data->StateId == TSL_STATEID_RELEASE)
{
HAL_GPIO_WritePin(LD4_GPIO_Port, LD3_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(LD4_GPIO_Port, LD4_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(LD5_GPIO_Port, LD5_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(LD6_GPIO_Port, LD6_Pin, GPIO_PIN_RESET);
}
別の例では、同じ STM32F072B-Disco ボードのタッチ チャネルを 3 つの個別のタッチ キーとして再構成しました。tsl_conf.h ヘッダー ファイルの TSLPRM_TKEY_Detect_IN_TH および TSLPRM_TKEY_Detect_OUT_TH パラメータをデフォルトの 110 & 120 のままにしておくと、プロジェクトはエラーなしでコンパイルされます。
// TouchKeys Detect 状態入力しきい値 (範囲 = 0..255)
#定義 TSLPRM_TKEY_DETECT_IN_TH (110)
// TouchKeys Detect 状態出力しきい値 (範囲 = 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)."
ユーザーコードは次のとおりです。
//プライベートマクロ #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, 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();
}
}
何が間違っているのかわかりません。また、このスライダーで 3 つのタッチ キーを調整可能な検出しきい値で構成するにはどうすればよいですか?
私はプロジェクトを Keil に準拠させました。これを共有して、問題をよりよく理解することができます。
これらの質問に対するあなたのサポートは非常に高く評価されており、私が TSC とタッチ アプリケーションを理解して学習するのに非常に役立ちます..
ありがとうございました。