Sida 1 av 1

Frekvensbestämning med input capture? (AVR)

Postat: 21 november 2007, 10:09:02
av Ardeath
Har lite problem, skall mäta frekvenser med en ATmega 644 och tänkte mig använda input capture. Problemet är att jag behöver kunna mäta i intervallet 0-9999Hz med+-1Hzs noggrannhet. Är det ens möjligt?

Enligt datablad är det "jätteenkelt" att använda ICR för att beräkna frekvensen på inkommande pulser, men hittar inte hur man skall skriva koden för det. Är det bäst att beräkna tiden pulsen är 1 och på så sätt ta reda på periodtiden (har 50% duty cycle) eller finns det något smartare sätt?

Tacksam för svar...

//Erika

Postat: 21 november 2007, 11:10:46
av Spinky Spendrup
Det bör väl gå att göra så här:

1 ställ in timern som är kopplad till din capture enhet till någon lämplig frekvens. Prescaler settings osv.

2 Ställ in capture på positiv eller neg. flank.

3 Aktivera interruptet och gör koden för detta.

I interruptsnutten sparar du undan ICR värdet:

Kod: Markera allt

time = oldVal - ISR
oldVal = ISR
Och 1/time = frekvensen. Det finns effektivare lösningar för det där...

ISR talet bestäms av dina valda klockinställningar så vill du ha hög upplösning så får man ta mindre klockdelning. Du kan ju räkna baklänges utifrån det här och se om upplösningen blir tillräcklig för dina krav.

Postat: 21 november 2007, 11:13:37
av speakman
Här är ett liknande projekt.

Postat: 21 november 2007, 12:07:41
av Ardeath
Jo, det verkar stämma med vad jag hade tänt mig,

men för att få en upplösning på 1Hz bör timern gå i 100MHz om jag skall kunna mäta 10KHz eller tänker jag fel? Kan bli svårt att hitta en prescaler som passar till det =)

Postat: 21 november 2007, 12:35:23
av speakman
"Four ranges, with 10 Hz and 1Hz resolution to at least 40 MHz."
Det tolkar jag som 1Hz även vid 40MHz. Det framgår dock inte solklart på sidan så vitt jag kan se.