本文へ移動
サポートシェアリングソリューション
OKWAVE Plus

このQ&Aは役に立ちましたか?

締切済み
※ ChatGPTを利用し、要約された質問です(原文:ロータリーエンコーダからの信号を処理するプログラム)

ロータリーエンコーダの信号処理プログラム

2023/10/18 18:27

このQ&Aのポイント
  • フリーのC18でPIC18F2550を使って、A相、B相、Z相出力のオープンコレクタのロータリーエンコーダの信号を処理するプログラムを作成したいです。
  • A相のパルスの読み取りで一定のパルス数になったら割り込みが発生し、その間の90パルスの間はマイコンから信号が出力されます。
  • この流れのプログラムについて教えていただきたいです。
※ 以下は、質問の原文です

ロータリーエンコーダからの信号を処理するプログラム

2011/03/08 18:35

フリーのC18でPIC18F2550を使っています。
A相、B相、Z相出力のオープンコレクタのロータリーエンコーダを使ってます。
A相のパルスの読取りである一定のパルス数になったら割り込み、割り込み発生から90パルスの間マイコンから信号出力、マイコンからの信号OFFといった流れのプログラムを書きたいんですが教えて頂けませんか?

回答 (2件中 1~2件目)

2011/03/09 01:53
回答No.2

回転方向が反転しない前提で

>A相のパルスの読取りである一定のパルス数になったら割り込み
(1)タイマーをTxCKIの入力エッジ回数をカウントするカウンタモードで
タイマーカウンタの最大値から要求値を引いた分を予めカウンタに設定し
カウンタオーバーフローでオーバーフロー割り込み
(2)タイマーをコンペアモードで動作させ
TxCKの入力エッジ回数を予め設定したコンペアレジスタ値と一致したら割り込み
のいずれかで可能です。

タイマー割り込みが来たら、マイコンから信号出力して
最初と同様にタイマーに90カウントを設定して待つ
再度タイマー割り込みがきたら、マイコンからの信号OFF。

すべて、PIC18F2550内蔵のタイマーモジュールの機能で実現可能です。

オーバーフローを使う場合には、タイマーのカウンタ値とA相の絶対位置はズレるのを忘れないでください。
1710パルス目でオーバーフローを発生させるためには、
16bitタイマだったら初期値として65536-1710=64826(0xFD3A)を入れておく必要があります。
64826から65535まで足されて、65536ではなく0に戻る時にオーバフロー割り込みが発生します。(もちろん割り込み許可設定も必要です)
8bitタイマだとプリスケーラーを使わないとダメなので今のところ使わないでおきましょう。
 
処理フローのフローチャートとかステート遷移図とかは作っていますか?
日本語のままでいいのでちゃんと文書化しましょう。
特に割り込みのような例外処理を使って処理を進行させるようなプログラムを
あいまいなまま作ってもいずれは破綻しますよ。

お礼

2011/03/09 19:09

回答ありがとうございます。
また質問ですが、(1)タイマーをTxCKIの入力エッジ回数をカウントする・・・の方法でやってみたところ自分の力ではうまくカウンタオーバーフローのプログラムが書けません。
A相の出力1710パルス目でマイコンから出力(1710パルスから1800パルスの間)マイコンからの出力OFF。
この動作を繰り返す。
Z相でA相のパルス数をゼロにしています。
教えていただけませんか?

質問者

このQ&Aは役に立ちましたか?

この質問は投稿から一年以上経過しています。
解決しない場合、新しい質問の投稿をおすすめします。

質問する
2011/03/08 23:30
回答No.1

「一定のパルス数になったら割り込み」というのを実現しようと思えば
外部にハードを設け、カウンター処理をしなければなりません。
また、方向が逆になる場合も配慮が必要です。
A相のパルス自体を割り込み端子に接続して、プログラム内でカウントする
方法が一般的ですが、できない速さなのでしょうか?
可能な速度であれば90パスルも読めますし、後は簡単です。

お礼をおくりました

さらに、この回答をベストアンサーに選びますか?

ベストアンサーを選ぶと質問が締切られます。
なおベストアンサーを選びなおすことはできません。