パルスカウンタ

H

HeiFelix

Guest
私はTMR0の入力パルスを数えることでRA4にfrequncy変化を検出するPIC16F87Aを使用しています。周りのセンサーとは
、 周波数80KHzのOSC 8MHzのですが応じている。安定しているすべての160msでは、パルスの数0x36B5
、 0x36B6の周波数を意味しています。
私はこの時期の他のパルスを検出する1つまたは2つの可能¥な限り迅速に。だから、私は
16 ( X10ms ) consectutive期間は
、 パルスの数を記録するためにFIFOを設定してください。各期間の最後に、私のFIFOの合計を取得し
、 標準との比較。10msの私の変化を検出することができますこのように考えている。しかし
、 最後の160msで、私は合計0x36B3からです0x36B6揺れたが
、 わたしを確認するための基準を得ることができないことを意味します。いくつかのパルスを失ったときに私はそれを記録する必要があります。16X10ms時代
に はどうすればこのような0x35B5または0x35B6として期待される金額を得ることができます
か ?このコードは以下の通りです:
コード:..........;;;;;;;;;;;;;;;;;;割り込みサービス;;;;;;;;;;;;;;;;;;;;;

IntService

movwf W_Temp

swapfワット、 STATUS_Temp

movwf STATUS_Temp

bcf状況、 RP0

btfsc INTCON 、 T0IF

コールIntServiceTimer0

swapf STATUS_Temp 、ワット

movwf状況

swapf W_Tempは、 F

swapf W_Temp 、ワット

retfie;;;;;;;;;;;;;;;;;;割り込みサービスTimer0の;;;;;;;;;;;;;;;;;;;;;

IntServiceTimer0

bcf INTCON 、 T0IF

incf TMR0_Highは、 F

復帰;;;;;;;;;メインプログラム;;;;;;;;

本線

InitialPICコール

InitialDetectorコール

movlw CounterLength

movwf CounterCounter

MainLoop

btfss PIR1 、 TMR2IF : 10msのoverfloe

後藤MainLoop

bcf PIR1 、 TMR2IF

movf TMR0 、ワット

clrf TMR0

movwf TMR0_TempL

movf TMR0_High 、ワット

movwf TMR0_TempH

clrf TMR0_High

............
....... 16x10ms期間の合計をTMR0_TempLとTMR0_TempH使用

.............
とは、特定の動作の変化を検出frequncy .........

後藤MainLoop

 
TMR0割り込みは
、 割り込みサービスと呼ばれています。TMR0は8ビット
の レジスタと
、 5月には
、 10msの 期間中にあふれている。TMR0とTMR2のInitialDetectorでinitailizedされています。

 
あなたの変更を約1
/ 16000 、 または0.006%を検出しようとして
いる !ているため
、 これを検出
しようとし て
いる60ppm を変更すると、安価な結晶
の 私はあなたの高い安定性を使用し
ている 希望を、低温度やオーブンで8MHzの水晶制御が100ppmも悪くも安定
している 。

あなたはそれを止めることなく
、 カウンターを読む必要があります。では
、 1つ
の カウントを失うことはできません。

その理由は
、 カウントを失う場合は
、 カウンタをリセット
しています が、完璧に幸せをリセットしない場合は
、 カウントが0の代わりには
、 期間の開始時には
、 16ビット
の 値を覚えていきますで開始とは
、 16ビット
の値 からの期間の終了時にそれを引く。

巻きのような場合は
、 255で
8 ビットモードではカウンタを持って
いる よう
だ- >
0 の割り込みが発生;場合には、 16ビットモードはあります
か ?16 (ビットモードの場合
は、 割り込みルーチンの場合
、 入力パルスカウンタがカウントさせる必要はありません。

どちらのモードでは、このような処理を
行なう必要 がある
でしょう :

/ /初期化
startcount = 0
tmr0_low = 0 ; tmr0_high = 0
...
/ / 10msのすべて:
一方
、 低いと
高い バイトレディング/ / 、ローカウンターまでを繰り返して
、 カウンタを読む(非常にまれに)再試行されますが変更していない
を行う(
countlow = tmr0_low
counthigh = tmr0_high
)までcountlow == tmr0_low / /下位バイト再読しながら
、 低レディングは変わっていない上位バイトをチェックする
/ /この期間内の増分を立てる
thiscount = ( ( counthigh < <

<img src=¥"http://www.edaboard.com/images/smiles/icon_cool.gif¥" alt=¥"涼しい¥" border=¥"0¥" />

| countlow ) - startcount
/ /カウンタの値は
、 次の期間の終了時に減算するために使用保存
startcount = ( ( counthigh < <

<img src=¥"http://www.edaboard.com/images/smiles/icon_cool.gif¥" alt=¥"涼しい¥" border=¥"0¥" />

| countlow )
... thiscount使用

おそらく
、 最初の読書
は 、破棄されていることを確認する必要が
あります すなわちstartcountまで正確に
10msの 期間の開始時には
、 カウントを追跡されています。

カウントを失っていないときでも
、 カウンタは、カウンタの
10msの サンプリングの精度
が 重要
です が、非常に正確には
、 ジッタくらい
し て
いる 80kHzのサンプリングレートは、 1つの時代よりもはるかに少ないすなわち12.5未満で読むことが必要わたしたちに。* すべての
*は、 最悪の場合は一緒かもしれない
( 5 )以上を取る6usを実行するために実行している割り込みをすることはできません。

頑張って!

HTH返答
Barny

 
Barny451 :
はい、私は約
2 の変更/ 16000を検出しようとしている。この回路の周波数はかなり安定しています。私は
、 20ppmの結晶で、カウンタの安定
の1 パルスの違いだと160msの期間でテスト
した ので
、 ローからハイに遷移だけの期間の最初から足
を 切ったり。
あなたは絶対的に正しいことはいくつかのパルスのリセット
、 サービスを中断によって失われます。startcountまで正確に10msの期間の開始時には
、 カウントの追跡は
、 最初のいくつかのループの後に読んで行くことによって破棄されます。
唯一の16ビットタイマTIMER1他の目的には使用
したこと です。しかし
、 16ビットタイマをせずに、割り込みを回避する方法はありません。私は
、 同じ期間にタイマーのinterrupサービスsurposeはめったに発生しない限りは
、 同時にinterrupとTimer0オーバーフローTimer2 。
とにかく、良いアイデアをありがとう!何か他の提案はあります
か ?そこにRA4でかなり安定して動作し
、 私はそれに従う必要があります似たような製品です。

ありがとう

 

Welcome to EDABoard.com

Sponsor

Back
Top