回答編集履歴
3
記載プログラムの修正
answer
CHANGED
@@ -24,9 +24,12 @@
|
|
24
24
|
|
25
25
|
//
|
26
26
|
void rotary_changedPin(void){
|
27
|
-
|
27
|
+
//
|
28
|
+
bool sigPinA = digitalRead(rot_pinA);
|
29
|
+
bool sigPinB = digitalRead(rot_pinB);
|
30
|
+
|
28
31
|
//A相、B相共にGNDレベルなら
|
29
|
-
if(!
|
32
|
+
if(!sigPinA && !sigPinB){
|
30
33
|
|
31
34
|
//ハードでチャタリング対策をしないなら、ここで数〜数十msecのwaitで回避できます
|
32
35
|
//しかしエンコードの高速回転についていけなくなります。
|
@@ -41,8 +44,8 @@
|
|
41
44
|
}
|
42
45
|
|
43
46
|
//A相、B相の状態を記録
|
44
|
-
oldPinA =
|
47
|
+
oldPinA = sigPinA;
|
45
|
-
oldPinB =
|
48
|
+
oldPinB = sigPinB;
|
46
49
|
}
|
47
50
|
```
|
48
51
|
|
2
記載プログラムの間違い修正
answer
CHANGED
@@ -16,6 +16,7 @@
|
|
16
16
|
int main(void){
|
17
17
|
//割り込みの設定(A相割り込みもB相割り込みも同一処理で可能)
|
18
18
|
wiringPiISR(rot_pinA, INT_EDGE_BOTH, rotary_changedPin);
|
19
|
+
wiringPiISR(rot_pinB, INT_EDGE_BOTH, rotary_changedPin);
|
19
20
|
//
|
20
21
|
・・・
|
21
22
|
//
|
1
チャタリング対策について、追記
answer
CHANGED
@@ -43,4 +43,11 @@
|
|
43
43
|
oldPinA = digitalRead(rot_pinA);
|
44
44
|
oldPinB = digitalRead(rot_pinB);
|
45
45
|
}
|
46
|
-
```
|
46
|
+
```
|
47
|
+
|
48
|
+
なお、チャタリング対策については、A相、B相ともに、シグナル線を、
|
49
|
+
・10Kのプルアップ
|
50
|
+
・0.01uFのコンデンサでGNDに接続
|
51
|
+
で、かなり良好な結果がでるかと思います。
|
52
|
+
立ち上がりのエッジが気になるなら、プルアップ抵抗を4.7Kなど、小さくするとオシロでの見た時のシグナルは綺麗に見えてきます。ただ、CPUのトリガーエッジに引っかかるタイミングは、あまり変わらないので、このあたりは、綺麗な方形波を目指すことも無いかと?思います。
|
53
|
+
|