Vidjao sam razne implementacije tih brojača/frekvencmetra ali ova varijanta sa STM32F4xx ima najoptimalniju strukturu internih tajmera za takve potrebe.
SW implementacije koje sam vidjao nisu ispratile sve najsitnije detalje a jedan vrlo bitan je vezan za vreme kada treba da se interni brojač resetuje, vremenski on bi trebao da se resetuje tačno na dogadjaj ulaznog triger signala (obično 1 sekunda) i pre nego što se restuje mora da se isčita i zapamati vrednost pa da se resetuje i to sve radi preko interapta, ima linija koja na kraju kaze TIM2->CNT=0.
Takvo rešenje nije dobro jer zavisi od interupt latence + ima vremenski offset, nije sinhrono na HW nivou.
TIM2 može da se u toj priči poptuno drugačije "hendluje", to je 32bit tajmer i NE MORA DA SE RESETUJE, dovoljno je vezati HW pin samo na neki njegov Capture/Compare registar, na primer treći kanal TIM2->CCR3 i on "sempluje" vrednost tačno kad treba na HW nivou i tek onda trigeruje interapt rutinu da samo sračuna rezultat (vremenski ne-kritično), sve na svom mestu i ne zavisi od SW!
Postoji counter-overflow situacija (kad odbroji 4294967295 impulsa : ) koja se lako hendluje i opet nije vremenski kritična i ne utiče na rezultat.
PS: U mom primeru za 100Hz ulazni test signal je odbrojao 200 impulsa za jednu sekundu, taj brojač broji/inkrementuje na obe ivice ulaznog signala i zato je odbrojao 200 što i nije loše, dobije se dodatnih "1/2 count" rezolucije jer može da izbroji neparan broj impulsa za to vreme uzorkovanja od 1sec.
SW implementacije koje sam vidjao nisu ispratile sve najsitnije detalje a jedan vrlo bitan je vezan za vreme kada treba da se interni brojač resetuje, vremenski on bi trebao da se resetuje tačno na dogadjaj ulaznog triger signala (obično 1 sekunda) i pre nego što se restuje mora da se isčita i zapamati vrednost pa da se resetuje i to sve radi preko interapta, ima linija koja na kraju kaze TIM2->CNT=0.
Takvo rešenje nije dobro jer zavisi od interupt latence + ima vremenski offset, nije sinhrono na HW nivou.
TIM2 može da se u toj priči poptuno drugačije "hendluje", to je 32bit tajmer i NE MORA DA SE RESETUJE, dovoljno je vezati HW pin samo na neki njegov Capture/Compare registar, na primer treći kanal TIM2->CCR3 i on "sempluje" vrednost tačno kad treba na HW nivou i tek onda trigeruje interapt rutinu da samo sračuna rezultat (vremenski ne-kritično), sve na svom mestu i ne zavisi od SW!
Postoji counter-overflow situacija (kad odbroji 4294967295 impulsa : ) koja se lako hendluje i opet nije vremenski kritična i ne utiče na rezultat.
PS: U mom primeru za 100Hz ulazni test signal je odbrojao 200 impulsa za jednu sekundu, taj brojač broji/inkrementuje na obe ivice ulaznog signala i zato je odbrojao 200 što i nije loše, dobije se dodatnih "1/2 count" rezolucije jer može da izbroji neparan broj impulsa za to vreme uzorkovanja od 1sec.