#はじめに
書籍に沿って引き続き進めていきます。
#チャタリングとは?
スイッチを押したときに、その反動でONとOFFを短い間隔で繰り返すことです。
マウスを使用しているときにワンクリックしたはずなのに、ダブルクリックとして判定されてしまった。スイッチの劣化に伴って振動も増えてきたりするので、そんなことがあると思います。(私はありました(´・ω・`))
これを防止するためにはプログラムで防止する方法と、電子回路で防止する方法があります。
#使用部品
#プログラムで防止
スリープさせてチャタリングを解消しましょう。
イメージとしては以下。一度ONしたら数ミリ秒の間、スイッチの状態を読み込まないようにする。
欠点として、スリープさせるのでその間の時間が無駄になる。
##回路図
ボタンを追加(※pull UP)
※常時電流ががピンに対して流れている(ON)。ボタンを押すとグランド(-)とつながり、電流がグランドに流れてピンには流れなくなる(OFF)。なぜグランドに流れるようになるのかというと、電流も人間と同じで近道を通りたいので、わざわざPsoCを通ってグランドへ行きたくない。そんな感じです。逆にpull downも存在します。(ボタン押すとピンに電流が流れる。わかりやすいが少々問題がある。)
ボタンと抵抗の位置を逆にするとpull downになります。
プルアップのボタンに対してつけている抵抗をプルアップ抵抗と呼び、一般的には10kΩを使用するみたいです。私は1kΩ使用しました。この抵抗値は適当でいいですが(ショートしないように)、10kΩを使用すると覚えておけばいいと思います。
##プログラム
待ち時間5m秒を与えてやります。
ちなみにこのプログラムはボタンを押すとLEDが消灯します。
#include "project.h"
int main(void)
{
CyGlobalIntEnable;
int sw = 0;
for(;;)
{
if(sw != SW_Read()){
sw = SW_Read();
CyDelay(5);
}
if(sw == 1){
LED_Write(1);
}else{
LED_Write(0);
}
}
}
#電子回路で防止
コンデンサを使用して電圧の上昇を緩やかにします(充電してます)。それにより、一瞬で5Vに上がることが無くなり、チャタリングが防止されます。コンデンサにはいろいろな役割がありますが、ここでは電圧の上昇を緩やかにするものだと思ってください。
そして、シュミットトリガを使用して2値化します。シュミットトリガ...かっこいい名前(^u^)
シュミットトリガとは...2つの閾値を利用してONかOFFを分ける方式。
分けている2つの閾値をスレッショルド電圧と呼びます。かっこいい名前(^u^)
今回はSN74HC14Nを使用。
SN74HC14Nの場合、VT+が今回の場合3Vくらいかな?VT-が2Vくらい。(要仕様書参照)
VT+を越えた時ONになり、VT-を下回らないとOFFにはなりません。
- コンデンサを使用した波形(黄色)
- シュミットトリガ使用後の波形(下図)
##回路図
コンデンサには極性が無いので安心て付けてください。(電解コンデンサとかは極性がある)
コンデンサにつながってる470Ωの値を変更することで電圧の上昇が変化します。
抵抗を大きくするとさらに緩やかに電圧が上昇するようになり、小さくするとすぐに上昇するようになります。この抵抗の値はチャタリングしている時間によって変更してください。
計算してくれるサイト
今回の場合:
5V
1kΩ+470Ω=1.47kΩ
10uF
0.06811046705076393秒
でも、満充電の場合の時間だから…
SN74HC14Nの配線に注意。〇が書いてある部分が1番ピンの位置になります。
SN74HC14Nはシュミットトリガ付きのNOT回路なので、2回通すことによって元の値に戻ります。
##プログラム
先に書いたプログラムからチャタリング防止用のスリープを取ったものになります。
#include "project.h"
int main(void)
{
CyGlobalIntEnable;
int sw = 0;
for(;;)
{
if(sw != SW_Read()){
sw = SW_Read();
}
if(sw == 1){
LED_Write(1);
}else{
LED_Write(0);
}
}
}
#あとがき
オシロスコープで実際の値を見てみましたが、今回使用したスイッチはあまりチャタリングしないようです…
こんなボタンがチャタリングしやすいみたいです。