今年の初め、 アリマンの立派な市民が、静電容量式タッチセンサーをマイクロコントローラーにねじ込む方法に関する記事を書きました 。 一部のデバイスのタッチキーは機械式のものよりもはるかにフィットするため、このアイデアは私にとって非常に有望であるように思われました。 この記事では、STM32 Discoveryデバッグボードに基づいたこの便利なテクノロジーの実装について説明します。
そこで、STM32を学び始めたばかりの私は、タッチを検出する機能をデバイスに追加するための演習として決定しました。 前述の記事で理論と実践を理解し始めたので、 Comim Arimanのスキームを繰り返しました 。 それは完璧に機能しましたが、ミニマリズムのファンである私は、不要な要素を取り除くことでそれを簡素化したいと考えました。 私の意見では、外部抵抗と電力経路は不要であることが判明しました。 これはすべて、AVRやSTM32を含むほとんどのマイクロコントローラーで既に行われています。 入力/出力ポートのプルアップ抵抗を意味します。 プレートと指をそれらを通して充電しませんか? トリックを見越して、モックアップにサーキットを組みましたが、驚いたことに、最初はうまくいきました。 実際のところ、これを回路と呼ぶのは面白いことです。必要なのは、単にコンタクトプレートをデバッグボードの脚に接続するだけだからです。 マイクロコントローラーがすべての作業を処理します。
プログラムはどのようなものですか? まず、2つの機能:
最初は、センサーレッグに論理「0」を表示します(レジスタCのゼロピン)
void Sensor_Ground (void) { GPIOC->CRL = 0x1; GPIOC->BRR |= 0x1; }
2つ目は、電源にプルアップして、同じ出力を入力に設定します。
void Sensor_InPullUp (void) { GPIOC->CRL = 0x8; GPIOC->BSRR |= 0x1; }
ここで、ポーリングサイクルの開始時に、Sensor_Ground()を呼び出し、センサー上のすべての残留電荷を地面に放電するまでしばらく待ちます。 次に、カウント変数をリセットします。これはセンサーの充電時間と見なされ、Sensor_InPullUp()を呼び出します。
Sensor_Ground(); Delay(0xFF); // count = 0; Sensor_InPullUp();
これで、センサーは数十KOhm(STM32の場合は30..50KOhm)の面値を持つ内部プルアップ抵抗を介して充電を開始します。 そのような回路の時定数は数クロックサイクルに等しいため、デバッグボードの水晶振動子を20 MHzのより高速なものに変更しました(ちなみに、STM32 Discoveryの水晶振動子がはんだ付けなしで変化することにすぐには気付きませんでした)。 そのため、入力に論理ユニットが表示されるまでプロセッサクロックをカウントします。
while(!(GPIOC->IDR & 0x1)) { count++; }
このサイクルを終了すると、変数カウントにはセンサープレートの容量に比例した数値が保存されます。 私の場合、20 MHzチップの場合、カウント値は押されていないときは1、最も軽いタッチでは7〜10、通常のタッチでは15〜20です。 残っているのは、それをしきい値と比較し、Sensor_Ground()を再度呼び出して、次のポーリングサイクルまでにセンサーが既に放電していることを忘れないことです。
結果として得られる感度は、ベアメタル領域へのタッチを自信を持って決定するのに十分です。 センサーを紙またはプラスチックのシートで覆うと、感度は3〜4倍低下します。プレスが明確に定義されていることのみを確認してください。 センサーを保護材で覆う必要がある場合に感度を上げるには、マイクロコントローラーのクロック周波数を上げることができます。
Arimanの実装と比較して、私のアプローチははるかに速く(1つのセンサーをポーリングするのに約12クロックサイクル)動作するため、タイマー割り込みを設定してプログラムを複雑にすることはありませんでした。
最後に、センサーの動作を示すビデオ。
Main.cテストプログラム。
マイクロコントローラのリファレンスマニュアル
非常に有用な記事ARM STM32FマイクロコントローラーのALPINE63rusに感謝します。 STM32-Discoveryのクイックスタート 、アイデアと明確な理論的説明のためのアリマンユーザー。
UPD。 ew1abzのコメントの後、クロッキングを扱うことにし、STM32ディスカバリーがデフォルトでクロック周波数に設定されていることがわかりました
(HSE / 2)* 6 = 24 MHz、ここでHSEは外部水晶の周波数です。 したがって、クォーツを8から20 MHzに変更して、私はSTM'kuを60 MHzで動作させました。 第一に、結論のいくつかは明らかに完全に正しいわけではありません。第二に、私がやっていたことはチップの故障につながる可能性があります。 このような障害の場合、マイクロコントローラーにHardFault割り込みがあり、それを使用して、より高い周波数を確認しました。 そのため、チップは70 MHzでのみ故障し始めます。 しかし、コントローラーはこの特定のプログラムを60 MHzでダイジェストしますが、周辺機器を使用したり、フラッシュメモリを操作したりすると、予測できない動作をする可能性があります。 結論:このトピックを実験として扱い、自分の責任とリスクでのみ繰り返してください。