Pulse Counter

H

HeiFelix

Guest
I am PIC16F87A uporabljajo za odkrivanje frequncy sprememb na RA4 s štetjem vhodni pulz TMR0.Pogostnost je približno 80KHz glede na senzor in OSC je 8MHz.V vsakem 160ms, število impulzov je 0x36B5 ali 0x36B6 kar pomeni pogostost je stabilna.
Hočem odkriti eno ali dve več impulzov v tem obdobju, kakor hitro je mogoče.Torej, sem FIFO za beleženje števila impulza pri 16 (X10ms) consectutive obdobjih.Na koncu vsakega obdobja, dobim vsoto FIFO in jih primerjajte s standardom.Verjamem, da na ta način sem lahko zazna spremembo v 10ms.Ampak, jaz vsota zadnjega 160ms je nihal od 0x36B3-0x36B6 kar pomeni, da ne morem dobiti standard za preverjanje.Nekatere impulzov je treba izgubil, ko sem ga evidentira.Kako lahko dobim pričakovano vsoto kot 0x35B5 ali 0x35B6 v takih 16X10ms obdobju?Koda je naslednja:
Koda:..........;;;;;;;;;;;;;;;;;; Interrupt Service ;;;;;;;;;;;;;;;;;;;;;

IntService

movwf W_Temp

swapf m, STATUS_Temp

movwf STATUS_Temp

BCF STATUS, RP0

btfsc INTCON, T0IF

klic IntServiceTimer0

swapf STATUS_Temp, w

movwf STATUS

swapf W_Temp, f

swapf W_Temp, w

retfie;;;;;;;;;;;;;;;;;; Interrupt Service za Timer0 ;;;;;;;;;;;;;;;;;;;;;

IntServiceTimer0

BCF INTCON, T0IF

incf TMR0_High, f

vrnitev;;;;;;;;; Main Program ;;;;;;;;

Glavnih

klic InitialPIC

klic InitialDetector

movlw CounterLength

movwf CounterCounter

MainLoop

btfss PIR1, TMR2IF: 10ms overfloe

Goto MainLoop

BCF PIR1, TMR2IF

movf TMR0, w

clrf TMR0

movwf TMR0_TempL

movf TMR0_High, w

movwf TMR0_TempH

clrf TMR0_High

............
Uporaba TMR0_TempL in TMR0_TempH priti vsoto v 16x10ms obdobje .......

.............
odkrivanje sprememb frequncy in do določene operacije .........

Goto MainLoop

 
Morda prekine vašo storitev potrebam imenovani od nekod
z dodajanjem gosub IntService
Namesto klicev, vendar sem tudi za to ni poklicati rutinsko
tako da bo trajalo en čas, potem pa spet ni tako, če je ne motim bo to storil, kot tisto, kar si dobil?<img src="http://www.edaboard.com/images/smiles/icon_rolleyes.gif" alt="Rolling Eyes" border="0" />ftopic85121.html" class="nav"> Nazaj na vrh

<img src="http://www.edaboard.com/templates/subSilver/images/lang_english/icon_profile.gif" alt="View user's profile" title="Poglej uporabnikov profil" border="0" />
 
The Interrupt Service se imenuje za TMR0 motim.TMR0 je 8-bitni register, in se lahko preliva med 10ms obdobju.V TMR0 in TMR2 so initailized v InitialDetector.

 
Ti si poskušal odkriti spremembe okoli 1 / 16000, oziroma 0,006%!Upam, da boste uporabljali visoko stabilnost, nizko tempco ali peči nadzorovano 8MHz kristalov, ker to
je 60ppm sprememba želite zaznati in poceni kristal je 100ppm ali slabši stabilnosti.

V tem primeru boste morali prebrati counter brez ustavljanja ga ne morete izgubiti enotnega count.

Razlog zgubiš šteje se, da ste ponastavljanja nasprotno, vendar bo še štetje popolnoma srečno, če ne ponastavi, vendar namesto, da z začetkom pri 0 spomnite 16-bitno vrednost na začetku obdobja in odšteje od 16-bitno vrednost na koncu obdobja.

Zdi se, da ste dobili protuobavijest v 8-bitnem načinu z wrapover 255 -> 0 povzročajo motim, to so 16-bitni način?(v 16-bitnem načinu ne boste potrebovali prekine rutinsko, pustite števec prešteje input impulzov.

Katerikoli način, ki ga boste morali narediti nekaj podobnega temu:

/ / Inicializacija
startcount = 0
tmr0_low = 0; tmr0_high = 0
...
/ / Vsakih 10ms:
/ / Preberite števec, ki poskušajo dokler nizko counter ni spremenila, medtem ko obravnava nizko in visoko bytes (bodo poskusili le občasno)
do (
countlow = tmr0_low
counthigh = tmr0_high
), Dokler countlow == tmr0_low / / reread nizkih bajt za preverjanje ni spremenila, medtem ko obravnava nizko nato visoko bajt
/ / Delo iz povečanj v tem obdobju
thiscount = ((counthigh <<

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

| countlow)-startcount
/ / Shrani counter vrednost uporablja za odštejemo ob koncu naslednjega obdobja
startcount = ((counthigh <<

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

| countlow)
... uporabe thiscount

Boste verjetno morali zagotoviti, da se zavržejo prvi obravnavi,
in sicer do startcount pravilno sledenje count na začetku obdobja, je 10ms.

Tudi če je v nasprotju ne izgublja,
je natančnost je 10ms vzorčenja protiukrepa je kritično,
saj je treba prebrati zelo natančno, s Treperenje veliko manj kot enem obdobju od 80kHz tečaj ste vzorčenje, torej veliko manj kot 12,5 nas.Saj ne morejo imeti * * koli prekinitve vožnje, ki bi lahko skupaj (v najslabšem primeru) traja več kot 5-6us izvesti.

Srečno!

HTH
Barny

 
Barny451:
Ja, jaz sem poskušal odkriti spremembo za približno 2 / 16000.Tokokrog se pogostost dokaj stabilna.Sem, da test s kristal 20ppm, The counter zdi stabilen z 1 impulz razlika v 160ms obdobju zaradi nizke do visoke prehod samo rezani ali nogo ven iz začetka obdobja.
Vi ste popolnoma prav, da se izgubijo nekatere impulzov z ponastavljanja prekine in storitev.V prvi obravnavi se odstranjujejo z tekoč čez nekaj zank do startcount pravilno sledenje count na začetku obdobja, je 10ms.
V samo 16-bitni časomer je TIMER1, ki sem jih uporablja za druge namene.Ampak brez 16bit časa, ni načina, da bi se izognili motim.I surpose da interrup storitev sprejmejo enako obdobje, razen če se časovnik Timer0 interrup in Timer2 overflow ob istem času, ki je le redko zgodi.
Kakorkoli, hvala vam dobra ideja!Ali obstajajo kakršne koli druge komentar?Obstaja podoben izdelek, ki dela na RA4 in dokaj stabilnega in sem poskusil s tem.

Hvala

 

Welcome to EDABoard.com

Sponsor

Back
Top