Měření otáček PIC16F88 na RB0 v přerušení?

Chtěl bych poradit nějaký nápad jak jít na přesné měření otáček spalovacího motoru, který má snímač se záporným impulzem na každou otáčku. Vzhledem k tomu, že bych na to v microchipu vyhradil časový úsek cca do 100ms nebo na to použít asi TIMER1 jako 16bit?? Nějaká finta s přerušením nebo tak něco. Nápad by byl takový, že změřím časový úsek mezi první a druhou sestupnou hranou impulzu ze snímače. Hodnotu z TIMERu bych už pak dopočítal na požadované otáčky. Doprogramoval bych si to sám, ale nějak mě nenapadá jak na to. Chip běží na 4MHz. Spodní hranice otáček je 1000/min a horní 25000/min. Rozlišení měření není až tak podstatné, ale pokud by bylo alespoň 100ot/min, tak to bude stačit. Díky za nějaké nápady.

Programem bych asi testoval sestupnou hranu, vynuloval TIMER a spustil ho jako čítač synchronizovaný s taktem krystalu. Při další sestupné hraně bych ho zastavil a přečetl počet cyklů?

Najlespie bude pouzit ten citac v ktorom sa budu pocitat impulzy, v preruseni potom len zistis pocet napocitanych impulzov a zresetuje citac.

S přerušením od časovače může být trochu problém s přesností ve vyšších otáčkách. Pro 25tis (tedy 417 Hz) je interval mezi impulzy 2.4 ms. Bude-li časovač přerušovat s 10kHz (tj. 100us, což je už docela časté přerušení), dosáhne se tím při 25 tisících chybovosti 1 tisíc otáček, nevím jestli by to stačilo? U nižších otáček přesnost samozřejmě roste.

Pokud by se jen četl čítač časovač, bylo by těžké rozlišit, kolik celých cyklů už uplynulo, bylo by tak obtížné měřit nízké otáčky. Kombinace číst časovač + počítat impulzy od časovače není vhodná, protože se nedá jednoznačně odlišit, zda kolem 0 nastalo už přerušení nebo ne. Řešením by bylo buď počítač cykly časovače softwarově (číst opakovaně časovač a při detekci skoku hodnoty o >32K inkrementovat počítadlo) nebo použít 2 nezávislé časovače, pomalejší časovač by poskytl referenční informaci o počtu cyklů rychlého časovače.

Časovač by se neměl spouštět softwarově, tím by vznikala chyba způsobená prodlevou software. Měl by jet nepřetržitě (tedy alespoň předpokládám, že uvedený PIC podporuje čtení časovače za běhu).

Problém je právě v tom, že nemůžu zvýšit počet impulzů na otáčku. Počítal jsem délky pulzů, které jsou při určitých otáčkách. Jak již bylo uvedeno pro 1000RPM to je 60ms, 5000RPM 12ms, 10000RPM 6ms, 15000RPM 4ms, 20000RPM 3ms a 25000 je 2.4ms.
Přemýšlel jsem nad tím, že by TIMER 2 načítal počet taktů od jedné hrany signálu k druhé. Při F=4MHz to má za 1s 1 000 000 taktů což by při mém opakování měření každou sekundu a odhadovaném časovém úseku bylo 100ms. Což by vyšlo na hodnotu 60000 v TIMER2 a to je do 16b hodnoty.

Proto mi z toho vyšlo že při otáčkách 1000RPM by TIMER načítal 60000jednotek. Při 5000RPM 12000jednotek atd až po 25000RPM kdy to je 2400jednotek = 2.4ms. Pokud to dobře počítám. Teď je otázka zda se z tohoto počtu jednotek dají dopočítat otáčky? Není tu přímá úměra otáček/načtených cyklů. Nebo tuhle variantu úplně opustit.

Nebo to celé nechat běžet pod přerušením a třeba po 900ms spočítat počet otáček. Tak abych měl čas je zpracovat a zobrazit každou vteřinu.

TMR0 - preruseni 1s + preruseni od nabezny/spadovy hrany “otacky++;” v mainu po preteceni timeru prepocitat a zobrazit otacky, a znovu…
myslim ze sem se vesel do tolerance +/- 100 otacek…

Prosím pěkně, co to je “přerušení jeden Siemens” (1S)?? :open_mouth:

Pořád to tady počítám a nějak mi to nevyhází. Nějak se nemůžu dopracovat lepších výsledků. Dám sem pak info až to nějak dovymyslím. Díky.

pro stouraly opraveno :laughing:

Prometheuss: ceho se nemuzes dopocitat ?

Nebylo by jednodušší a časově nenáročné měřit délku mezi impulzy?

Rychlejší by to asi bylo, měřit jen ten impuls. Ale jak z jeho hodnoty vypočítat otáčky, jsem ještě nevymyslel. Včera večer jsem jeden nápad dostal, ale už jsem to nepočítal. Podle mě to bude snadná matematika, tak doufám že mě to brzy napadne. Vypočítat to nějak tak, aby to programově nebylo extra složité. Trochu váhám zda se to může obejít bez 24bitové matematiky. Tu jsem schopen použít. Takže vlastně zbývá najít vzorec na to, jak vypočítat :slight_smile:

Když při frekvenci čítače 1 MHz naměříš interval N, tak otáčky za minutu pak jsou: ot = 60*1000000/N. Dělenec by byl DWORD (4 bajty) a dělitel WORD (2 bajty). Aby se obešla potřeba dělení, lze to dělat postupně po částech odečítáním:

  • do dělence se uloží konstanta 60000000 (3938700h)
  • střadač výsledku WORD se vynuluje
  • dokud jsou horní 3 bajty >= dělitel, odečítá se dělitel od dělence a horní bajt střadače se zvýší o 1
  • dolní 2 bajty + 3. bajt zbytek po dělení se dělí obdobně, dokud je >= dělitel, odečte se dělitel a dolní bajt střadače se zvýší o 1

Dělitel by měl mít minimálně 394h (916), tj. nejvyšší otáčky 65k.

Panda38: Díky moc. Dostal jsi mě na správnou stopu. Ten tvůj výpočet mě dostal kam jsem potřeboval. Sice jsem pochopil jen tu první větu a pak to dělení už šlo mimo můj mozek.

Ale výsledkem je co jsem potřeboval. Jen to provedu trochu jinak. Vezmu konstantu 6 000 000 a budu jí dělit změřený úsek mezi impulzy. Což při f=1MHz je za 100ms max 60 000 cyklů na TIMER2 což bych zvládl. A odpovídá to minimálním otáčkám 1000/min. Motor má volnoběh až nad 5000, což mi bohatě stačí. Rozlišení je tak pouhých 10ot./min a to je pro mě naprosto dostačující. Ten výpočet nejsem schopen si sám naprogramovat, ale používám nějakou rutinku pro 24b výpočty a za její pomocí to jsem schopen do PIC dostat a spočítat.

Děkuji moc. Pomohlo mi to.