質問するログイン新規登録

回答編集履歴

3

記載プログラムの修正

2015/11/03 04:45

投稿

ItoTomonori
ItoTomonori

スコア1283

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(!digitalRead(rot_pinA) && !digitalRead(rot_pinB)){
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 = digitalRead(rot_pinA);
47
+ oldPinA = sigPinA;
45
- oldPinB = digitalRead(rot_pinB);
48
+ oldPinB = sigPinB;
46
49
  }
47
50
  ```
48
51
 

2

記載プログラムの間違い修正

2015/11/03 04:45

投稿

ItoTomonori
ItoTomonori

スコア1283

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

チャタリング対策について、追記

2015/11/03 04:43

投稿

ItoTomonori
ItoTomonori

スコア1283

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
+