- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
CapSenseボタンで長押しをしたいですが、
「Enable sensor auto-reset」をON設定しているため、長押しがキャンセルされます。
Auto-Resetがかかるまでの時間変更する方法ございますか?
もしくは、長押ししたい場合、「Enable sensor auto-reset」はOFF設定すべきでしょうか?
Solved! Go to Solution.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
例として、Baseline_Update_Bufferを8bit -> 10bitに変更する場合の手順を示します。
変更する部分はテキストの色を赤色にしています。
1. CapSense_Structure.hで, CapSense_RAM_SNS_STRUCT.bslnExtの宣言を変更します。
uint16 bslnExt [CapSense_NUM_SCAN_FREQS];
2. CapSense_Filter.cにCapSense_FtIIR1stOrder_custom APIを作成します。
uint32 CapSense_FtIIR1stOrder_custom(uint32 input, uint32 prevOutput, uint32 n, uint32 shift)
{
uint32 filteredOutput;
/*
* n - IIR filter coefficient (n/1024)
* shift - Used to shift input data to have free LSB bits
* for fraction storage of filter output calculation
*/
filteredOutput = ((n * (input << (shift+2))) + ((1024u - n) * prevOutput)) >> 10u;
/* Shift operation of output will be done in upper level API if needed */
return filteredOutput;
}
3. CapSense_Filter.cのCapSense_FtUpdateBaselineの一部を変更します。
#if (CapSense_BASELINE_TYPE == CapSense_IIR_BASELINE)
/* Calculate baseline value */
if ((CapSense_WD_TYPE_ENUM)wdType != CapSense_WD_PROXIMITY_E)
{
#if (CapSense_REGULAR_SENSOR_EN)
#if (CapSense_REGULAR_IIR_BL_TYPE == CapSense_IIR_FILTER_PERFORMANCE)
history = (uint32) ptrSensor->bsln[freqChannel] << 10u;
history |= ptrSensor->bslnExt[freqChannel];
#else
history = ptrSensor->bsln[freqChannel];
#endif /* (CapSense_REGULAR_IIR_BL_TYPE == CapSense_IIR_FILTER_PERFORMANCE) */
#if (CapSense_ENABLE == CapSense_WD_BSLN_COEFF_EN)
baselineCoeff = ptrWidgetRam->bslnCoeff;
#else /* (CapSense_ENABLE == CapSense_WD_BSLN_COEFF_EN) */
baselineCoeff = CapSense_REGULAR_IIR_BL_N;
#endif /* (CapSense_ENABLE == CapSense_WD_BSLN_COEFF_EN) */
history = CapSense_FtIIR1stOrder_custom((uint32)ptrSensor->raw[freqChannel], history, baselineCoeff, CapSense_REGULAR_IIR_BL_SHIFT);
#if (CapSense_REGULAR_IIR_BL_TYPE == CapSense_IIR_FILTER_PERFORMANCE)
ptrSensor->bsln[freqChannel] = LO16(history >> 10u);
ptrSensor->bslnExt[freqChannel] = LO16(history & 0x03FF);
#else
ptrSensor->bsln[freqChannel] = LO16(history);
#endif /* (CapSense_REGULAR_IIR_BL_TYPE == CapSense_IIR_FILTER_PERFORMANCE) */
#endif /* (CapSense_REGULAR_SENSOR_EN) */
}
よろしくお願い致します。
Hirotaka Takayama
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
こちらのKBAは参考になりますでしょうか?
PSoC 4 CapSense Sensor Auto-Reset – KBA222882
"Enable sensor auto-reset" がON設定の時、通常は5~10秒でリセットされますが、
Baseline_Update_Buffer のサイズを変更することで、この時間を伸ばす事が可能です。(通常サイズは8bit)
よろしくお願い致します。
Hirotaka Takayama
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
>Baseline_Update_Buffer のサイズを変更することで、この時間を伸ばす事が可能です。(通常サイズは8bit)
⇒「Baseline_Updatte_Buffer」はどこで変更可能ですか?
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
例として、Baseline_Update_Bufferを8bit -> 10bitに変更する場合の手順を示します。
変更する部分はテキストの色を赤色にしています。
1. CapSense_Structure.hで, CapSense_RAM_SNS_STRUCT.bslnExtの宣言を変更します。
uint16 bslnExt [CapSense_NUM_SCAN_FREQS];
2. CapSense_Filter.cにCapSense_FtIIR1stOrder_custom APIを作成します。
uint32 CapSense_FtIIR1stOrder_custom(uint32 input, uint32 prevOutput, uint32 n, uint32 shift)
{
uint32 filteredOutput;
/*
* n - IIR filter coefficient (n/1024)
* shift - Used to shift input data to have free LSB bits
* for fraction storage of filter output calculation
*/
filteredOutput = ((n * (input << (shift+2))) + ((1024u - n) * prevOutput)) >> 10u;
/* Shift operation of output will be done in upper level API if needed */
return filteredOutput;
}
3. CapSense_Filter.cのCapSense_FtUpdateBaselineの一部を変更します。
#if (CapSense_BASELINE_TYPE == CapSense_IIR_BASELINE)
/* Calculate baseline value */
if ((CapSense_WD_TYPE_ENUM)wdType != CapSense_WD_PROXIMITY_E)
{
#if (CapSense_REGULAR_SENSOR_EN)
#if (CapSense_REGULAR_IIR_BL_TYPE == CapSense_IIR_FILTER_PERFORMANCE)
history = (uint32) ptrSensor->bsln[freqChannel] << 10u;
history |= ptrSensor->bslnExt[freqChannel];
#else
history = ptrSensor->bsln[freqChannel];
#endif /* (CapSense_REGULAR_IIR_BL_TYPE == CapSense_IIR_FILTER_PERFORMANCE) */
#if (CapSense_ENABLE == CapSense_WD_BSLN_COEFF_EN)
baselineCoeff = ptrWidgetRam->bslnCoeff;
#else /* (CapSense_ENABLE == CapSense_WD_BSLN_COEFF_EN) */
baselineCoeff = CapSense_REGULAR_IIR_BL_N;
#endif /* (CapSense_ENABLE == CapSense_WD_BSLN_COEFF_EN) */
history = CapSense_FtIIR1stOrder_custom((uint32)ptrSensor->raw[freqChannel], history, baselineCoeff, CapSense_REGULAR_IIR_BL_SHIFT);
#if (CapSense_REGULAR_IIR_BL_TYPE == CapSense_IIR_FILTER_PERFORMANCE)
ptrSensor->bsln[freqChannel] = LO16(history >> 10u);
ptrSensor->bslnExt[freqChannel] = LO16(history & 0x03FF);
#else
ptrSensor->bsln[freqChannel] = LO16(history);
#endif /* (CapSense_REGULAR_IIR_BL_TYPE == CapSense_IIR_FILTER_PERFORMANCE) */
#endif /* (CapSense_REGULAR_SENSOR_EN) */
}
よろしくお願い致します。
Hirotaka Takayama
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
回答ありがとうございます。
上記手順(Baseline_Update_Bufferを8bit -> 10bitに変更する場合の手順)は、
自動生成されるAPIを変更することになりますが、
自動生成されるAPIを変更することは動作上問題ないのでしょうか?
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
動作上問題はありません。
この変更は既にサイプレスのエンジニアにより検証されており、問題ないことが確認されています。
サイズなどを変更することに問題はなく、他のコードに影響を及ぼさないように記述されています。
唯一、問題を挙げるとすると、コンポーネント構成の変更等の後に変更が書き換えられる可能性があることです。
これを防ぐ良い方法としては、main.cで自動リセット機能を書き直すこと、またはカスタマイズされたCapSenseコンポーネントをインポートすることですが、これらの例は今のところございません。
よろしくお願い致します。
Hirotaka Takayama
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
返信ありがとうございます。
自動生成されるAPIを変更する以外に、Auto-Reset時間を変更する方法はありますか。
たとえば、CapSenseパラメータを変更してAuto-Reset時間を変更する方法はないということで間違いないでしょうか。
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
はい。今のところはこの方法のみでございます。
Hirotaka Takayama
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
動作確認いたします。
また、以下確認させてください。⇒
2. CapSense_Filter.cのCapSense_FtIIR1stOrder_custom APIの一部を変更します。⇒"CapSense_FtIIR1stOrder_custom"のAPIがCapsense_Filter.cにありません。
このAPIは自身で作成すべきものでしょうか?
※"CapSense_FtIIR1stOrder"はあります。
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
すみません。間違えたのでその返信を修正致しました。
ご認識いただいている通り、新たにCapsense_Filter.cにて作成をお願い致します。
Hirotaka Takayama
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
回答いただいた通り、コード変更し、Auto-Reset時間が延長されるのを確認しました。
このAuto-Reset時間の変更方法についてのアプリケーションノート等は出ますか?
また、コードの変更手順ですが、「CapSense_FtIIR1stOrder_custom」の宣言が必要になりました。
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
コード変更で問題が解決されたこと、大変嬉しく思います。
アプリケーションノートは今のところ出ていません。出す予定は今のところ立っておりません。
Auto-Reset時間の設定をより簡単にできるようにすることは社内で検討しておりますが、申し訳ありませんが具体的な日程は決まっておりません。
また、コードの変更手順についてのご指摘ありがとうございます。
Hirotaka Takayama