cancel
Showing results for 
Search instead for 
Did you mean: 

PSoC 4 MCU

New Contributor II

静電ボタン検査ツール向けに毎回キャリブレーションを実施し、検査前のシグナル値0を保証したいです。

キャリブレーションを実行するAPIは下記で合っていますでしょうか?
・個別用 CapSense_CalibrateWidget(uint32 widgetId)
・全体用 CapSense_CalibrateAllWidgets(void)

又、CapSenseでタッチ動作後にシグナル値が0にならない場合、下記No3(USB抜差)しかシグナル値がリセットされませんでしたが、

No1,2はキャリブレーション無し、No3はキャリブレーション有りで認識合っていますでしょうか?

  No1. 再接続 [Stop]->[Disconnect]->[Connect]->[Start]
  No2. 再起動 [Stop]->[Disconnect]->CapSense終了->CapSense起動->[Connect]->[Start]
  No3. USB抜差[Stop]->[Disconnect]->USB抜差->[Connect]->[Start]

(環境)
Hardware    : CY8CKIT-145-40XX PSoC 4000S Prototyping Kit
IC          : CY8C4045AZI-S413
Sofware     : PSoC Creator 4.2, CapSense
Base Project: CY8CKIT-145 Code Example.zip

0 Likes
Reply
1 Solution
Moderator
Moderator

御所望の処理「シグナル値の0リセット」は可能と考えます。

考えられる方法としては下記になります。(英語表記で申し訳ございません)

1. Sensor is Active for N * main cycles, regards the sensor is stuck, call CapSense_InitialAllBaselines();

2. Sensor is Inactive for N * main cycles, regards the sensor is stuck, call CySoftwareReset() to reset chip.

3. Use a customized threshold, if signal larger than the signal for N * main cycles, call CapSense_InitialAllBaselines();

4. If there is no long touch requirement, enable Sensor Auto Reset.

5. Unplug/Re-plug device may have risk: when power on, the ripple would be larger than other moment, if CapSense_Start() executed immediately, it may cause wrong calibration value.

6. CapSense_ProcessAllWidgets() won’t change IDAC. So..the you may need to double-check if it is other code changed IDAC(SmartSense enabled? ).

になり、システムに応じた実装(上記全てか、部分的か)して頂ければと思います。

View solution in original post

0 Likes
Reply
15 Replies
New Contributor II

CapSense_CalibrateAllWidgets()を使おうとしましたが、
CapSense_Sensing.h で CapSense_ANYMODE_AUTOCAL の定義が無効となっており、
CapSense_CalibrateAllWidgets()が無効となっている様です。

CapSense_CalibrateAllWidgets()以外でシグナル値をリセット可能なAPIを教えて下さい。

0 Likes
Reply
Moderator
Moderator

先ず、キャリブレーションを実行するAPIについてですが、

・個別用 CapSense_CalibrateWidget(uint32 widgetId)

・全体用 CapSense_CalibrateAllWidgets(void)

で、合っています。

また、CapSense_ANYMODE_AUTOCALの定義はCapSense_Configuration.h内で

#define CapSense_ANYMODE_AUTOCAL (((0u != CapSense_CSX_IDAC_AUTOCAL_EN) \

                                       || (0u != CapSense_ISX_IDAC_AUTOCAL_EN)) \

                                       || (0u != CapSense_CSD_IDAC_AUTOCAL_EN))

となっております。

CapSenseコンポーネント内のIDACのauto-calibrationを有効にすることによりCapSense_ANYMODE_AUTOCALが1になります。

0 Likes
Reply
Moderator
Moderator

追記ですが、下記記述についてもう少しご説明を頂けないでしょうか?

> 又、CapSenseでタッチ動作後にシグナル値が0にならない場合、下記No3(USB抜差)しかシグナル値がリセットされませんでしたが、

> No1,2はキャリブレーション無し、No3はキャリブレーション有りで認識合っていますでしょうか?

>   No1. 再接続 [Stop]->[Disconnect]->[Connect]->[Start]
>   No2. 再起動 [Stop]->[Disconnect]->CapSense終了->CapSense起動->[Connect]->[Start]
>   No3. USB抜差[Stop]->[Disconnect]->USB抜差->[Connect]->[Start]

0 Likes
Reply
New Contributor II

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

1.キャリブレーションAPI呼出し

解決しました。

CapSense設定を変更でCapSense_ScanAllWidgets()が呼び出し可能になりました。

(設定変更)

TopDesign.cyschの[Configure 'CapSense_P4']ダイアログ

タブ->[CSD Settings]タブ

"Enable IDAC auto-calibration" を チェック

2.USB抜差でシグナル値残り解消

タッチ動作を行うとたまに指を外してもシグナル値が20~50程度残る事があります。

おそらく何らかの要因でBaselineが変動(下降)し、アイドル状態のRawDataと差分が

発生したと考えております。

このシグナル値が残る問題が発生した場合、CapSense再起動(No1,No2)では解消されず、

USB挿抜(No3)が必要になります。

この為、「CapSenseの起動処理ではキャリブレーション(*)は行われておらず、

IC初回電源ON時のみキャリブレーションが実行される」

と想定しています。

CY8CKIT-145-40XX(CY8C4045AZI-S413)のキャリブレーションは

IC初回電源ON時のみであり、CapSenseでは行われない

という認識はOKかを確認したいです。

(*)現状のBaselineとRawDataを基準とし、シグナル値(=RawData-Baseline)を0とする処理

0 Likes
Reply
New Contributor II

CapSense_ScanAllWidgets()を実行した所、

Modulator IDAC や Compensation IDAC の設定が自動的に変更されてしまい、

ボタンが反応しなくなりました。

Modulator IDAC や Compensation IDAC の設定はそのままで、

シグナル値が残る問題を解決させる(Raw DataとBaselineのズレを0にする)方法を教えて下さい。

0 Likes
Reply
Moderator
Moderator

ご連絡が遅くなり、申し訳ございません。

調査を加速するために、お使いのプロジェクトを共有して頂く事は可能でしょうか?

以上、宜しくお願い致します。

0 Likes
Reply
New Contributor II

こちらの環境を共有します。

以下のURLからダウンロードしてください:

<https://upload.hdedrive.com/ui/gunze.co.jp/dl/SB1562727812-1947482c-9edf-4980-917c-5026318dd517>

URLの有効期限: 2019年7月17日 午後12時3分

パスワードは別途連絡します。

0 Likes
Reply
New Contributor II

「任意のタイミングでIDAC等の設定値は変更せずにシグナル値を0リセットするAPI or 処理」

について進展ありましたでしょうか?

0 Likes
Reply
Moderator
Moderator

アップデートが遅くなり、申し訳ございません。

今回のシグナル値を0に戻すことについてですが、考えられる幾つかの提案がございます。

1)IIR filter及び、median filterを有効にする。これはノイズを減少させます。

2)Sense clock、modulator IDAC及び、compensation IDACの再チューン。

共有頂いたCompensation IDACが大きいと思われます。modulator IDACまたはcompensation IDACのどちらかが30未満になることが望まれます。また、1500KHZ または750KHZ sense clock modeで減少の再確認をして頂く。

上記再チューンを実行する際はAuto-calibrationを使用してIDACの値を取得し、そのIDACの値を使用して手動で他のパラメータをチューニングするのが良いかと思います。

3)Tune thresholds:

 - Finger thresholdをFinger Signal (Diffcount)の60~80%に設定

 - Noise threshold及びNegative Noise thretholdをFinger Signal (Diffcount)の40から50%に設定

4)両面テープにてOverlayとFPCを圧着

以上、宜しくお願い致します。

IIR filter and median filter

0 Likes
Reply
New Contributor II

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

No1~3のチューニング方法については今後の参考にさせて頂きます。

ただ、今回頂いた提案No1~4は全てシグナル値のズレを発生させない為の事前対策であり、

私が求めている発生後の事後対策(シグナル値の0リセット)とは違う気がしております。

オートキャリブレーション(CapSense_ProcessAllWidgets)では、

IDAC等の設定値が自動的に変更されてしまいますが、

USB挿抜では、設定値はそのままでシグナル値が0リセットされる期待動作が行われる事を

Sense Tunerで確認しております。

IC(CY8C4045AZI-S413)の電源投入時に毎回1回だけ行われる処理に

「シグナル値の0リセット」が含まれており、それをプログラム上で実行出来れば

やりたい事が出来ると考えておりますが、可能でしょうか?

それともシグナル値のズレは発生させてはいけないものであり、

発生後の対処方法は手動のUSB挿抜しか無い という事でしょうか?

0 Likes
Reply
Moderator
Moderator

御所望の処理「シグナル値の0リセット」は可能と考えます。

考えられる方法としては下記になります。(英語表記で申し訳ございません)

1. Sensor is Active for N * main cycles, regards the sensor is stuck, call CapSense_InitialAllBaselines();

2. Sensor is Inactive for N * main cycles, regards the sensor is stuck, call CySoftwareReset() to reset chip.

3. Use a customized threshold, if signal larger than the signal for N * main cycles, call CapSense_InitialAllBaselines();

4. If there is no long touch requirement, enable Sensor Auto Reset.

5. Unplug/Re-plug device may have risk: when power on, the ripple would be larger than other moment, if CapSense_Start() executed immediately, it may cause wrong calibration value.

6. CapSense_ProcessAllWidgets() won’t change IDAC. So..the you may need to double-check if it is other code changed IDAC(SmartSense enabled? ).

になり、システムに応じた実装(上記全てか、部分的か)して頂ければと思います。

View solution in original post

0 Likes
Reply
New Contributor II

ありがとうございます。

頂いた処理を試してみます。

名前から CySoftwareReset() にシグナル値の0リセットを期待します。

0 Likes
Reply
New Contributor II

CapSense_InitialAllBaselines()と CySoftwareReset() を行った所、

シグナル値が0リセットされ、期待通りの動作が出来ました。

ただ、デバッグで処理を追ってみると CySoftwareReset()で処理が止まり、

CySoftwareReset()以降の動作が行われませんでした。

※メインループ(main.c main())は生きておりその後のボタン検知はOK

CySoftwareReset()実行後、処理はそこで終了する(以降のプログラムコードは実行されない)

という認識であっていますでしょうか?

もしCySoftwareReset()実行後に CapSense_Start()を実行する必要がある場合は

タイマ処理で別ルートの対応が必要という事でしょうか?

===============================================================

+---・タイマ設定(ソフトウエアリセット後処理用タイマ ex.1秒)

|

| ・CySoftwareReset() -> 処理STOP

|

(1秒後)

|

|

+-->・CapSense_Start()

===============================================================

0 Likes
Reply
Moderator
Moderator

CySoftwareReset()ではCM0P_AIRCRレジスタのSYSRESETREQを1にセットしています。

pastedImage_0.png

これにより、Systemはリセットされているので処理はそこで終了しています。

その後、main()関数が再度実行されています。

簡単なCY8CKIT-145のテストプログラムを添付します。

プログラム実行時はLED1が点灯しており、SW2を押下するとLED1が消えます。

その後、CySoftwareReset()が実行されるのでSystemリセットがかかり、再度main()が実行されLED1が点灯します。

尚、CE210709をベースとしているのでCapSenseも動作します。

0 Likes
Reply
New Contributor II

処理終了が想定通りである事、理解しました。

本件、クローズ致します。

0 Likes
Reply