CapSense auto reset

Tip / Sign in to post questions, reply, level up, and achieve exciting badges. Know more

cross mob
RyYo_1406951
Level 5
Level 5
100 replies posted 50 replies posted 25 replies posted

CapSenseボタンで長押しをしたいですが、
「Enable sensor auto-reset」をON設定しているため、長押しがキャンセルされます。

Auto-Resetがかかるまでの時間変更する方法ございますか?

もしくは、長押ししたい場合、「Enable sensor auto-reset」はOFF設定すべきでしょうか?

0 Likes
1 Solution

例として、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

View solution in original post

0 Likes
11 Replies
HirotakaT_91
Moderator
Moderator
Moderator
500 replies posted 250 replies posted 100 replies posted

こちらのKBAは参考になりますでしょうか?

PSoC 4 CapSense Sensor Auto-Reset – KBA222882

"Enable sensor auto-reset" がON設定の時、通常は5~10秒でリセットされますが、

Baseline_Update_Buffer のサイズを変更することで、この時間を伸ばす事が可能です。(通常サイズは8bit)

よろしくお願い致します。

Hirotaka Takayama

0 Likes

>Baseline_Update_Buffer のサイズを変更することで、この時間を伸ばす事が可能です。(通常サイズは8bit)

⇒「Baseline_Updatte_Buffer」はどこで変更可能ですか?

0 Likes

例として、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

0 Likes

回答ありがとうございます。

上記手順(Baseline_Update_Bufferを8bit -> 10bitに変更する場合の手順)は、

自動生成されるAPIを変更することになりますが、

自動生成されるAPIを変更することは動作上問題ないのでしょうか?

0 Likes

動作上問題はありません。

この変更は既にサイプレスのエンジニアにより検証されており、問題ないことが確認されています。

サイズなどを変更することに問題はなく、他のコードに影響を及ぼさないように記述されています。

唯一、問題を挙げるとすると、コンポーネント構成の変更等の後に変更が書き換えられる可能性があることです。

これを防ぐ良い方法としては、main.cで自動リセット機能を書き直すこと、またはカスタマイズされたCapSenseコンポーネントをインポートすることですが、これらの例は今のところございません。

よろしくお願い致します。

Hirotaka Takayama

0 Likes

返信ありがとうございます。

自動生成されるAPIを変更する以外に、Auto-Reset時間を変更する方法はありますか。

たとえば、CapSenseパラメータを変更してAuto-Reset時間を変更する方法はないということで間違いないでしょうか。

0 Likes

はい。今のところはこの方法のみでございます。

Hirotaka Takayama

0 Likes

動作確認いたします。

また、以下確認させてください。⇒

2. CapSense_Filter.cのCapSense_FtIIR1stOrder_custom APIの一部を変更します。⇒"CapSense_FtIIR1stOrder_custom"のAPIがCapsense_Filter.cにありません。

 このAPIは自身で作成すべきものでしょうか?

 ※"CapSense_FtIIR1stOrder"はあります。

0 Likes

すみません。間違えたのでその返信を修正致しました。

ご認識いただいている通り、新たにCapsense_Filter.cにて作成をお願い致します。

Hirotaka Takayama

0 Likes

回答いただいた通り、コード変更し、Auto-Reset時間が延長されるのを確認しました。

このAuto-Reset時間の変更方法についてのアプリケーションノート等は出ますか?

また、コードの変更手順ですが、「CapSense_FtIIR1stOrder_custom」の宣言が必要になりました。

0 Likes

コード変更で問題が解決されたこと、大変嬉しく思います。

アプリケーションノートは今のところ出ていません。出す予定は今のところ立っておりません。

Auto-Reset時間の設定をより簡単にできるようにすることは社内で検討しておりますが、申し訳ありませんが具体的な日程は決まっておりません。

また、コードの変更手順についてのご指摘ありがとうございます。

Hirotaka Takayama

0 Likes