Piotr \"PitLab\" Laskowsk
Guest
Tue Aug 21, 2007 11:32 am
Używam timera do generowania częstotliwości w granicach do kilku kHz.
Wzór na częstotliwość jest postaci: f = fclk/(n*(65536-x))
gdzie n i fclk są stałymi a x zmienną.
Podstawiając kolejne wartości x otrzymuję mocno nieliniowy rozkład
częstotliwości. Potrzebowałbym funkcję lineraryzującą, tak aby dla kolejnych
wyliczonych wartości x otrzymywać liniowo (lub możliwie blisko liniowości)
zmieniającą się częstotliwość.
Inny pomysł to zastosowanie LUT. Tabela miała by powiedzmy 64 pozycje, ale
może są jakieś prostsze metody, możliwe do implementacji na 8-bitowym
kontrolerze..
--
Piotrek.
http://www.pitlab.pl
Blue
Guest
Wed Aug 22, 2007 9:02 am
np. PCA w '51 (Silabs) w trybie frequency output mode wzór na czestotliwość
jest taki:
fwy = f_pca/(2 * PCA0CPH) gdzie PCA0CPH to rejestr 8-bitowy.
B.
Użytkownik "Piotr "PitLab" Laskowski" <pitlab@pulapka.wp.pl> napisał w
wiadomości news:faehpj$l8r$1@node1.news.atman.pl...
Quote:
Używam timera do generowania częstotliwości w granicach do kilku kHz.
Wzór na częstotliwość jest postaci: f = fclk/(n*(65536-x))
gdzie n i fclk są stałymi a x zmienną.
Podstawiając kolejne wartości x otrzymuję mocno nieliniowy rozkład
częstotliwości. Potrzebowałbym funkcję lineraryzującą, tak aby dla
kolejnych
wyliczonych wartości x otrzymywać liniowo (lub możliwie blisko liniowości)
zmieniającą się częstotliwość.
Inny pomysł to zastosowanie LUT. Tabela miała by powiedzmy 64 pozycje, ale
może są jakieś prostsze metody, możliwe do implementacji na 8-bitowym
kontrolerze..
--
Piotrek.
http://www.pitlab.pl
Blue
Guest
Wed Aug 22, 2007 9:16 am
zapomniałem dodać, że dla PCA0CPH większego od 15 liniowość jest już
przyzwoita
B.
Piotr \"PitLab\" Laskowsk
Guest
Wed Aug 22, 2007 10:57 am
Quote:
Używam timera do generowania częstotliwości w granicach do kilku kHz.
Wzór na częstotliwość jest postaci: f = fclk/(n*(65536-x))
Podstawiając kolejne wartości x otrzymuję mocno nieliniowy rozkład
częstotliwości. Potrzebowałbym funkcję lineraryzującą
np. PCA w '51 w trybie frequency output mode wzór na czestotliwość
jest taki: fwy = f_pca/(2 * PCA0CPH) gdzie PCA0CPH to rejestr 8-bitowy.
Zrobiłem z tego wykres i wygląda praktycznie tak samo. Po prostu liniowo
zmienający się mianownik daje nieliniową wartość funkcji.
Na razie doszedłem do etapu że odwróciłem funckję i liczę 'x' dla danego
'f'. Kolejne wartości 'x' wstawiam do LUT i indeksując tablicę otrzymuję
liniowo zmieniającą się częstotliwość. Dla tablicy liczb 8-bitowych udało mi
się uzyskać 48-pozycyjną tablicę.
Zauważyłem z że 8 bitowy timer liczy się prościej: f = fclk / (12 * n).
Po odwróceniu kota ogonem: n = fclk / (12 * f) => (fclk/12) / f
Jeżeli f zmienia się liniowo o jakąś wartość można to przedstawić jako: f =
k * x; gdzie k to krok częstotliwości a x jego indeks
Stąd n = (fclk / (12*k) ) / x
Czyli po pewnych uproszczeniach da się to sprowadzić do jednego dzielenia
16-bitowego.
Wygląda na to że już mam to czego szukałem. Do funkcji podam indeks
częstotliwości i otrzymam wartość rejestru do załadowania do timera.
--
Piotrek.
http://www.pitlab.pl
Piotr \"PitLab\" Laskowsk
Guest
Wed Aug 22, 2007 1:37 pm
Quote:
Zauważyłem z że 8 bitowy timer liczy się prościej: f = fclk / (12 * n).
G...uzik prawda. Powinno być f = fclk / (12 * (256-n)).
A to już znacząco zmienia postać rzeczy.
--
Piotrek.
http://www.pitlab.pl