Küsimus:
Kas riistvaraliste taimerite katkestustena määramisel peaksin eelistama madalamat eelkalkeri väärtust või madalamat CTC-d?
Roberto Santalla
2014-09-02 02:42:00 UTC
view on stackexchange narkive permalink

Praegu mängin Arduino riistvaraliste taimeritega ja mulle tuli küsimus. Lubage mul seda veidi lahti seletada.

Oletame, et tahan, et iga 1024 kellapunkti korral täidaks teatud funktsioon. AFAIK, ma saaksin seda saavutada mitmel viisil, mängides Timer2 ja selle CTC eelskaalaväärtuse abil:

  1. eelskaala seadmine 1 ja CTC väärtusele 1024
  2. seadistamine eelkaaler 8-le ja CTC 128-le
  3. ...
  4. Eeskaleri seadmine väärtusele 1024 ja CTC väärtusele 1.

Kõik need kuidas saavutada soovitud, kuid milline neist on tõhusam? Või pole see üldse oluline?

Täname juba ette teadmiste jagamise eest: P

Suuremate eelkalkulaatori väärtuste korral väheneb energiatarbimine väga vähesel määral, kuna mis tahes eelskaleri väljundiga ühendatud vooluahel lülitub madalama sagedusega ja energiatarve on proportsionaalne väärtusega c v ^ 2 f.
CTC ei ole number, see on loenduri töörežiim (2. režiim). Taimeri ajavahemiku saate määrata, määrates "OCR2A", tegelikuks perioodiks on ((OCR2A + 1) × prescaler) protsessori tsüklid. Seega, kui määrate eelskaala väärtuseks 8, peate määrama `OCR2A = 127`.
Kaks vastused:
Janakiram
2014-09-02 09:11:50 UTC
view on stackexchange narkive permalink

Kui 'kellakeeramise' arv (siin 1024), kasutatud taimeri laius ja MCU kell on konstantsed (fikseeritud väärtus), ei valiks ma viimast valikut, st preskalar 1024 ja CTC 1. Siin on minu põhjused (spetsiaalselt Arduino)

1) Kui CTC on nullilähedane (näiteks 1-> 10), käitub taimer mõnikord nii, nagu oleks arv null ja väljastaks ruutu laine (50% -lise koormussuhtega) poole nõutud sagedusega . Nii et tehke CTC mõistlikult suureks. Kuid ka kõrge taktsageduse (enne skalaari 1) valimine võib näidata täpsuse vähenemist. Vahepealne variant on minu arvates parem.

2) Kui loenduse CTC protsessis dünaamiliselt muutub, tuleks taimeri eelskalaar valida selliselt, et CTC arv oleks kogu taimeri laiusest väiksem või võrdne kogu protsessiga.

st. maksimaalne taimeri puugide arv peaks taimer mugavalt vastama sellele antud laiusele. Isegi siin tekib jälle sama dilemma, siis on parem valik punkti 1 alusel.

Kui sellest ei piisa, on minu arvates ainus viis rakendada iga juhtumit füüsiliselt ja kontrollida, milline kombinatsioon annab teile parimad tulemused. Praktilised tulemused on minu arvates usaldusväärsemad (võib-olla saate lauale konkreetse tõhusa kombinatsiooni!)

Ma ei näe mõistlikku algpõhjust teie märkuse kinnitamiseks madalate CTC väärtuste kohta, mis võivad täpsust vähendada. Eelkõige on ilmselgelt vale "mõnikord taimer käitub ...": miks ei oleks AVR-arhitektuuri taimeritel sel juhul korratav käitumine?
Ma ütlesin, et madalad eelskalaarid (mitte CTC väärtused) võivad vähendada täpsust. Madalad CTC väärtused võivad anda taimeritelt soovimatuid väljundeid.
'Mõnikord' tähendab siin Arduino 'mõne tahvli' jaoks. Kasutasin seda sõna, kuna konkreetsele tahvlile ei esitatud küsimust. Olen mitu korda töötanud taimeritega 'Arduino Due', taimerite sagedusega 10,5 MHz ja alati, kui andsin CTC-loenduse alla 15 (või lähedal) taimeri, sain ruudu laine, nii et ilmne põhjus on see, et loendust võetakse nullina. See pole matemaatiline, vaid praktiline tähelepanek. Nagu öeldud, olen oma eesmärgil töötanud ainult 'Due'iga, mis on ARM (mitte Arduinos kasutatavate väiksemate taktsagedustega AVR) ja seega on' mõnikord 'kasutamine minu arvates õige.
Nick Gammon
2016-01-14 16:14:34 UTC
view on stackexchange narkive permalink

Eraldusvõime ja saavutatavate sageduste vahel on kompromiss. Mainite taimerit 2, kuid Atmega328P-s on taimer 2 8-bitine taimer, seega ei saaks te CTC-d seada väärtuseks 1024.

Oletame, et räägime 16-bitisest taimerist, nagu Atmega328P taimer 1. Ühe eelskaalaga saate aja (eeldades 16 MHz kella) ajavahemikku 1 kuni 65536 "puugid", see tähendab 62,5 ns kuni 4096 µs.

See oleks kõige täpsem mõõtmine, kuna kasutate ühte (protsessori) kellamärki taimeri linnukese kohta (ühe eelkalkulaator).

Kui aga plaanite ajastada kauem kui 4,096 ms, peate eelkalkulaatori üles tõstma . Taimeri 1 järgmine eelkaaler on 8, nii et nüüd saate ajavahemikuks 8 korda nii kaua (32768 µs) aega veeta, kuid teie täpsus (täpsus) on nüüd vähenenud 8 korda. detailsus Taimeri arv on suurenenud 62,5 ns-lt 62,5 * 8 ns-le, mis on 500 ns.

Kui peate aega võtma kauem kui 32,768 ms, peab eelkalkeraator olema jälle suurem, järgmine on 64. Nii et nüüd saate aega kulutada kuni 262144 µs, kuid täpsusega 62,5 * 64, mis on 4000 ns (4 µs).

Minu ettepanek oleks kasutada võimalikult madalat eelkalkulaatorit, kuid siiski saada soovitud intervall. Nii et ilmselgelt ei saa te kasutada eelskaalat üks kord 10 ms.


Mul on taimeritega seotud arutelu saidil http://www.gammon.com.au/timers.

Sellel lehel on diagramm, mis aitab visualiseerida erinevate eelseadmete mõjusid:

Timers and prescalers

Ülemine osa (ühe arv) annab teile tõhusamalt iga eelkaaleri üksikasjalikkuse. Näiteks eelkaaleri 256 granuleeritavus on 16 000 ns (16 us). Teatud sagedused (võimsus 2) sobivad kombinatsioonide jaoks (nt. Eelkalkulaator 1 arvuga 256 või eelkalkeraator 256 arvuga 1).

Kuid sageduste puhul, millel pole selle omaduse korral annab väiksem eelkaaler (kui seda saab kasutada) peenema täpsuse.

Kõrgema eelkaaluri kasutamine ei kaota üldse täpsust. Saate küll suurema detailsuse, kuid kui sihite tsüklite arvu, mis on kahe võimsus (nagu küsimuses), pole täpsus probleem.
Aga kui ei, siis võimaldab alumine eelkaaler sihtmärgile lähemale jõuda. Oletame, et soovite ajastada 30 taktsüklit. Eelskaala 1 võimaldab sisestada numbri 30 otse. 8-astmeline eelskaal tähendab, et peate kasutama 30/8 (3,75), mida te ei saa otse registrisse sisestada, kaotades sellega täpsuse.
Küsimus oli sõnastatud 1024 loendusega, nii et minu märkused sellele ei kehti, kuid püüdsin anda üldisema vastuse, juhul kui asjaolu, et 1024 on üsna eriline juhtum, polnud ilmne.


See küsimus ja vastus tõlgiti automaatselt inglise keelest.Algne sisu on saadaval stackexchange-is, mida täname cc by-sa 3.0-litsentsi eest, mille all seda levitatakse.
Loading...