• ベストアンサー

PICでパルス数をカウントする方法

PICで不規則な幅のパルス数をカウントする為にはどうのようなプログラムになるのでしょうか? ループで入力ポートを監視するのでは出来ないように思うのですがどのような方法を用いると出来ますでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • likipon
  • ベストアンサー率38% (44/114)
回答No.1

「不規則な幅のパルス」とはどのような意味でしょうか? 適当に解釈すると: 1.幅が不規則なだけでパルスの最小幅がそれほど短くない. この場合なら, ループで入力ポートを監視するだけでもカウントは可能だと思います. 入力がHだったら1カウントして, 次に入力がLになってからまたHになった時に 次の1カウントするだけですね. (もちろん, 後述の方法でも可能です) 2.最小幅が短い場合 プログラムのループ周期よりもパルス幅が短いような場合は, プログラム的にカウントしても パルスの取りこぼしが考えられます. PICに限らずたいていのワンチップマイコンにはタイマ機能というのが用意されており, これを応用することでカウントを行うことができます. タイマは普通時間を計るために使い, クロックが入力されるとカウンタがプラスされると いうものです. このタイマは内蔵クロックで動作させる (カウンタを回す) こともできますが, このクロックを外から入力してやることもできます. タイマは基本的にクロックが入力された数だけカウンタが増えますので, 最初にカウンタをクリアしてやれば, その後のカウンタの値はクリア後に入力された パルスの数であるということになります. パルスの幅が不規則であったとしても, よほど高速でない限りは関係ありません. 機能の詳細はデータシートや関連書籍に書いてありますので, 調べてみてください.

poohpiglet2
質問者

お礼

詳細に説明していただきありがとうございました。 タイマについて勉強してみます。

その他の回答 (1)

  • Qwerty-36
  • ベストアンサー率25% (58/226)
回答No.2

通常の組込用のマイコンでは・・・ですが。 パルスをポートに入れる。 そのポートがタイマー/カウンタポートなら、カウンタモードに設定し、立ち上がり/下がりのどちらかのエッジで割り込みをかけ、割り込み処理の中でカウント値を+1する。 ポートが通常の入力ピンで有れば、ポーリングで"1"から"0"もしくは"0"から"1"に変わったらカウント値を+1する。

poohpiglet2
質問者

お礼

理解することができました。 ありがとうございました。

関連するQ&A

  • PICでパルス数をカウントし、カウント数に応じで、ある操作をする

    PICにファンクションジェネレータからパルス(数100ms程度の幅)を0.2~1Hzで入力して、たとえば10回のパルスが入ってきたら、10回目のパルスの後、数ms後にパルスを出力するといった事をしたいのですが、わかりません。 PIC初心者です。よろしくお願いします。

  • PICで内部タイマーを使わずカウントダウンする方法

    こんにちは。 今回、PICのプログラムをアセンブラで組むことになりました。 その中で「100ミリ秒間、あるポートからの入力を監視する」という部分があり、 これを内部タイマーなどは使わずに実装するとします。 自分なりには、 PICのクロック数とループ内のサイクル数で 何回ループを回せばよいのかを予め計算しておいて その回数だけループを回せばよいのかな? と考えました。。。 しかしループ内のサイクルがせいぜい数μSですので、 100mSecとなると10万回単位でループを回さなければなりません。 しかしPICでは変数が8Bitしか無いので255までしかカウントできないと思うのですが、 こういう大きい数字のカウントをしたい場合、どうしたら良いのでしょうか? 宜しくお願いします。

  • PICでパルス発生プログラム

    ステッピングモータを回すために、PIC16F84Aを使ってパルス信号を発生させる回路を作っています。PICにはどのようなプログラムを組めばよいのでしょうか? サンプルなどあれば教えてくださいm(_ _)m

  • ロータリーエンコーダのパルスをカウント

    現在電子工作をしており、それにPIC16F877Aを使っています。プログラムはC言語を使っています。 2相のステッピングモータを回転させてロータリーエンコーダで読み取り、そのパルスをカウンタICを使おうと思っています。 それを最終的にモータにボールねじを取り付け、カウンタICで読み取ったパルスをPICに送り距離に換算しようと思っています。 400パルスまでカウントしたいため、どのICを使うか悩んでいます。 2相ステッピングモータはオリエンタルモーターの「PK225PB」の両軸タイプ、 ロータリーエンコーダはオムロンの「E6A2-CWZ3C」のA相,B相,Z相の3相のオープンコレクタです。

  • パルスモーターの回転のためのパルスつくり

    パルスモーターを回転させるために2-2相励磁をPIC16f628を使って作りました。MPLABでパルスを作成するプログラムを作り、 完成した後、トランジスタで増幅する回路を作りオシロスコープで見てみるとPICのピンの方で2-2相励磁ができてませんでした。 そして、そのあと、PICのポートを変更してオシロスコープで見てみると、(このときは、トランジスタにはつなげていません)きちんとした2-2相励磁のパルスができていました。 どうして、こうなるのかを教えてもらえませんか? ちなみに、ダイオードはつけていません。

  • 入力回数のカウントをする方法

    PICを用いてC言語のプログラムを作成しているのですが、センサの反応によってピン(a4)に入力が入った回数をカウントしたいのですが、反応している間ずっとカウントをしています。1度の反応ではカウントする数を1にしたいのですが、どうしたらいいのでしょうか。

  • PICにおけるパルス波形の検出方法

    PICのプログラムなんですが 考え方を教えてください あるパルス波形を検出したいのですが デューティー比が変化します だいたい 10% 30% 50%の3パターンなのですが この変化を検出して どのパターンなのか知りたいのです ただし 波形のサイクルは約3mSですが 若干変化します 皆さんでしたら どのようなプログラムを組みますか? よろしくお願いいたします

  • パルスエンコーダの誤カウント

     工事用エレベータに光洋トーテムポール出力型エンコーダDC24VとMelsec_QD62高速カウンタ ユニットにて かご の位置制御をしてます。  設定条件:高速カウンタユニット 2相 10KPPS 4逓倍       (入力パルスは、3000パルス/秒)       インバータ制御  問題点は、       階床位置をパルスカウント数にて記憶させてますが、その記憶パルスに      対して、数10パルス手前で、記憶パルスに到達に至り、階床位置とズレ      が生じています。       この方式での制御方法は、かなりの数の実績が有り、異なる点は      以前は、A1SCPUを用いていた点だけです。       プリセットは行っていません。(行わなくてもO.K.で有った)       ラック自走式エレベータなのでギヤのバックラッシュも小さいです。             振動は、ロープ式より有ります。       また、症状は、上昇時のみ顕著に表れます。       ノイズ対策もしてます。       対策方法をご教示下さい。  

  • PICの出力パルス幅について

    初心者です。 PIC24FJ64GB002を使用し、添付ファイルのソース(シリアル出力)を作成しました。 ●仕様 スイッチ入力→シリアル出力(1パルス=約10μs) 実際動作させると、望み通りのシリアル信号が出力されるのですが、連続的に出力すると、1秒間隔位でシリアル出力のパルス幅が何倍かに延びるヶ所があります(延びるヶ所は不特定)。 考えられる原因はございますでしょうか? よろしくお願い致します。

  • PICマイコンができること

    PICは入力信号によって「Yes」か「No」かを出力させるという仕事はできるが、入力信号をそのまま出力させるという仕事はできないものなのでしょうか? 今、PICマイコンに入力する信号は、サーボモータを動かすためのパルス信号であり、サーボモータが右に動くときと、左に動くときとで別々のポートから信号を出力させることを考えてます。 そのために、入力信号のパルス幅をタイマーで計測し、判断させているのですが、問題は判断項目(while や if)が加わると入力信号をそのまま出力することができないことです。 一応、PIC16F84Aを用いて10MHzの内部クロックで 1.判断項目がないとき入力信号をそのまま出力(別々に出力はしない) 2.判断項目は同じとして出力を入力信号にせず、5Vにして別々に出力 の2つについて実際にできました。 結構、厳しい条件ですがPICに期待しすぎなのかわからなくなったので質問しました。 よろしくお願いします。

専門家に質問してみよう