前回の続きでプログラムの考え方を紹介します。
まずは、シグナルゼネレーターの作成です。以前にも作成したことがあるので案外と簡単にできました(^^)
出力波形もご覧の通り
それでは、プログラムの考え方です。
今回は前回紹介した、9突起ローターの信号を0V-5Vで分類して0~8の番地で管理する方法を考えました。
PICには「INT割込み」てのがあって、決まった端子の電圧が立ち上がったり、立ち下がったりした瞬間に通常の処理を一旦止めて決められた割込み処理をすることができます。
今回はその「INT割込み」処理を活用して、クランク角の番地管理を行います。
今回はその「INT割込み」処理を活用して、クランク角の番地管理を行います。
↓の波形は前回紹介した物です。最初の0Vだけが少し長くなってますね。
これはいわゆる波形進角しているものと思われます。
SP-TDCではそこを考慮して次の立ち上がりを基準にしてあります(リッパですね)
なので、ここでも立ち上がり波形を基準として考えます。
次に立ち上がりに割込みを発生させた時の処理です。
基本は割込みが発生したら、番地を記憶するメモリに「1」プラスします。
ただそれだけではメモリ値が増える一方なので、どこか基準を設けてリセット「0」にする必要がありますね。
やり方は色々あると思いますが、今回は毎回番地の時間を計測して、一つ前の時間を比べて明らかに短い場合に「0」としました。
具体的には上の波形で5Vが長いサイクルがあります、これは120度の凹部にあたる所で、他のサイクルと比べると4倍の長さがあります。
そこで、一つ前の時間を1/2にして、今の時間を引きます。前の場所が通常サイクルの所なら答えはマイナスになります。
でも、120度凹部なら1/2してもまだ2倍の長さがあるのでマイナスになりませんよね。
割込みの都度その引算を実施させ、答えがプラスだった場合にリセット「0」にします。
そうすると、クランク角と番地の関係が↓のように成立します。
さて、うまくクランク角の制御が出来ているか確認です。
割込みの他に下記のプログラムをメインルーチンで実行させて、番地制御がうまく出来ているか確認です。
*******************************************************
B0
MOVLW D'0' ;
SUBWF 027H,W
BTFSS STATUS,Z
MOVLW D'0' ;
SUBWF 027H,W
BTFSS STATUS,Z
GOTO B0
BSF PORTB,4 ;
B7
MOVLW D'7' ;
SUBWF 027H,W
BTFSS STATUS,Z
BSF PORTB,4 ;
B7
MOVLW D'7' ;
SUBWF 027H,W
BTFSS STATUS,Z
GOTO B7
BCF PORTB,4 ;
GOTO B0
*******************************************************
BCF PORTB,4 ;
GOTO B0
*******************************************************
説明すると、「7番地」になったらPORTB.4番ピンを0Vに、その後「0番地」になったら5Vにしなさいって命令です。
オシロで計測してみると
ちゃんと番地管理しているようですね。(^^)
気が向いたら次はドエルタイムの確保方法の考え方でも紹介しますね!