89C51 - generator



Masz problem? Zapytaj na forum elektroda.pl

Poprzedni Następny
Wiadomość
Spis treści
From: "Krzysztof" <krzysztof.gedroycWYTNIJ_TO_at_nospam_wp.pl>
Subject: 89C51 - generator
Date: Wed, 2 Mar 2005 13:33:00 +0100


Ma ktoś jakiś pomysł jak generować na 89C51 dwie częstotliwości: 400Hz i
401Hz (naraz, tzn. na dwóch osobnych wyjściach) z maksymalnie dużš
dokładnościš. Próbowałem zrobić to na dwóch oddzielnych timerach, ale
ponieważ sš to prawie takie same częstotliwości, to zawsze któraś (o niższym
priorytecie) jest generowana z błędem, bo obsługa timera o wyższym
priorytecie zabiera czas procesora...
Jak to inaczej zrobić?

Pzdr.
K.



Poprzedni Następny
Wiadomość
Spis treści
From: "JJMafia" <jjmafia_at_nospam_poczta.fm>
Subject: Re: 89C51 - generator
Date: Wed, 2 Mar 2005 15:00:56 +0100


Ma ktoś jakiś pomysł jak generować na 89C51 dwie częstotliwości: 400Hz
i
401Hz (naraz, tzn. na dwóch osobnych wyjściach) z maksymalnie dużš
dokładnościš. Próbowałem zrobić to na dwóch oddzielnych timerach, ale
ponieważ sš to prawie takie same częstotliwości, to zawsze któraś (o
niższym
priorytecie) jest generowana z błędem, bo obsługa timera o wyższym
priorytecie zabiera czas procesora...
Jak to inaczej zrobić?
Może tak:
Gdyby udało Ci się wywoływać przerwanie co 1us to prawie jesteśmy w domu.
W przerwaniu inkrementujesz dwa liczniki .
Pierwszy licznik zlicza do 2500.
W ten sposób przepełnienie licznika nastšpi co 2,5ms czyli 400 razy/s.
Drugi licznik zlicza do 2493 w tym przypadku przepełnienie nastšpi 401,12
razy/s.
ewentualnie zlicza do 2494 400,96 raza/s.
Pozostaje jeszcze sprawa korekcji tych wartość (na przeładowanie liczników)
itd.
To tylko taka koncepcja .Jeśli coś pomyliłem to proszę o poprawki.
Pzrd.JJMafia



Poprzedni Następny
Wiadomość
Spis treści
From: "Krzysztof" <krzysztof.gedroycWYTNIJ_TO_at_nospam_wp.pl>
Subject: Re: 89C51 - generator
Date: Wed, 2 Mar 2005 15:42:16 +0100


Gdyby udało Ci się wywoływać przerwanie co 1us to prawie jesteśmy w domu.

Przy rezonatorze 12MHz maksymalnie mogš być przerwania co 1us. A to
oznacza, że cały czas procesora byłby zużyty na przerwania, zresztš którego
by się nawet nie dało obsłużyć, bo 1 us trwa cykl maszynowy
mikrokontrolera...

W przerwaniu inkrementujesz dwa liczniki .
Pierwszy licznik zlicza do 2500.
W ten sposób przepełnienie licznika nastšpi co 2,5ms czyli 400 razy/s.
Drugi licznik zlicza do 2493 w tym przypadku przepełnienie nastšpi 401,12
razy/s.
ewentualnie zlicza do 2494 400,96 raza/s.

Pomysł jest jak najbardziej, ale to wszystko dzieje się zbyt szybko.
Można trochę zwolnić te przerwania (np. 16 razy), ale wówczas nie uzyska się
założonej dużej dokładności...

Pzdr.
K.



Poprzedni Następny
Wiadomość
Spis treści
From: "Marek Dzwonnik" <mdz_at_nospam_WIADOMO_PO_CO_TO.message.pl>
Subject: Re: 89C51 - generator
Date: Wed, 2 Mar 2005 15:59:20 +0100


Użytkownik "Krzysztof" <krzysztof.gedroycWYTNIJ_TO_at_nospam_wp.pl> napisał w
wiadomości news:d04c2d$103$1_at_nospam_nemesis.news.tpi.pl
Ma ktoś jakiś pomysł jak generować na 89C51 dwie częstotliwości:
400Hz i 401Hz (naraz, tzn. na dwóch osobnych wyjściach) z maksymalnie
dużš dokładnościš.

Jak to inaczej zrobić?

Koniecznie na 89C51 ?
Czy ten proc ma robić jeszcze coś innego?

Prawdopodobnie zmodyfikowałbym miniDDSa Jespera Hansena. Układ zbudowany na
2313 jest prosty jak budowa cepa: http://www.myplace.nu/avr/minidds/

Oryginał generuje jednš częstotliwość ale dla tak małych f da się go
przebudować, tak żeby synchronicznie liczyć kilka kanałów. W tej chwili
takt DDSa (f_mclk = częstotliwość inkrementacji akumulatora fazy) sięga
1.1MHz
Na wyjściu potrzebujesz ledwie 400Hz, więc f_mclk rzędu 50KHz będzie z
dużym zapasem (>100 próbek na okres).
To Ci daje 200 cykli maszynowych na jeden okres f_mclk. W tym czasie musisz:
f1=400Hz, drugi dla f2=401Hz).
W jednokanałowym znajduje się prosty 8-bitowy DAC w postaci drabinki R-2R
zapiętej bezpośrednio na wyjściach portu. Ale w tym tempie da się wystawić
wartości szeregowo choćby na dwie sztuki HC595 lub jakieś szeregowe DAC-e.

Dalej dwa filtry d.p. (lub pasmowe na 400Hz) na op-ampach i dostajesz na
wyjściu dwa przebiegi sinus o dokładnie określonych wartościach średnich
(400 i 401Hz z dokładnościš do ułamka Hz). Czystość widmowa zależy od paru
czynników. Ogólnie nie będzie rewelacyjna (krótkie słowo adresujšce LUT
cos(fi), krótkie słowo przetwornika ADC), ale bodajże(!) w tym układzie
odstęp głownego pršżka od zakłóceń i tak wychodzi nie mniejszy niż 30dB.


--
Marek Dzwonnik, GG: #2061027 - zwykle jako 'niewidoczny'
(Uwaga Gadu-Gadulcowicze: Nie odpowiadam na anonimy.)


Poprzedni Następny
Wiadomość
Spis treści
From: "Krzysztof" <krzysztof.gedroycWYTNIJ_TO_at_nospam_wp.pl>
Subject: Re: 89C51 - generator
Date: Wed, 2 Mar 2005 16:09:00 +0100


Jak to inaczej zrobić?

Koniecznie na 89C51 ?

Niestety tak.

Czy ten proc ma robić jeszcze coś innego?

Obsługiwać jeszcze trzy guziki, które odpowienio umożliwiajš
lekkie zmiany tych częstotliwości. Zatem nie jest to dużo, ale jeszcze
pewnš rolę odgrywa pobór pršdu, zatem wszystko musi być na
przerwaniach, by w czasie gdy nie sš obsługiwane, mikrokontroler mógł
wchodzić w tryb Idle.

Wielkie dzięki za szczegółowy opis układu opartego na 2313!

Pzdr.
Krzysztof.



Poprzedni Następny
Wiadomość
Spis treści
From: "Marek Dzwonnik" <mdz_at_nospam_WIADOMO_PO_CO_TO.message.pl>
Subject: Re: 89C51 - generator
Date: Wed, 2 Mar 2005 16:49:31 +0100


Użytkownik "Krzysztof" <krzysztof.gedroycWYTNIJ_TO_at_nospam_wp.pl> napisał w
wiadomości news:d04l79$ms3$1_at_nospam_nemesis.news.tpi.pl

Wielkie dzięki za szczegółowy opis układu opartego na 2313!

Jeśli chciałbyś bawić się w ręczne rzeŸbienie DDS-a, to polecam "DDS
tutorial" ze strony Analoga:
http://www.analog.com/UploadedFiles/Tutorials/450968421DDS_Tutorial_rev12-2-99.pdf


--
Marek Dzwonnik, GG: #2061027 - zwykle jako 'niewidoczny'
(Uwaga Gadu-Gadulcowicze: Nie odpowiadam na anonimy.)


Poprzedni Następny
Wiadomość
Spis treści
From: "Piotr Wyderski" <wyderskiREMOVE_at_nospam_ii.uni.wroc.pl>
Subject: Re: 89C51 - generator
Date: Wed, 2 Mar 2005 21:29:41 +0100


Marek Dzwonnik wrote:

Koniecznie na 89C51 ?

No wlasnie? :o)

Oryginał generuje jednš częstotliwość ale dla tak małych f da się go
przebudować, tak żeby synchronicznie liczyć kilka kanałów. W tej chwili
takt DDSa (f_mclk = częstotliwość inkrementacji akumulatora fazy) sięga
1.1MHz
Na wyjściu potrzebujesz ledwie 400Hz, więc f_mclk rzędu 50KHz będzie z
dużym zapasem (>100 próbek na okres).
To Ci daje 200 cykli maszynowych na jeden okres f_mclk. W tym czasie
musisz:
- inkrementować dwa niezależne 24-bitowe akumulatory fazy (jeden dla
f1=400Hz, drugi dla f2=401Hz).
- pobrać wartości cos(fi) z tablicy
- wystawić je na dwa przetworniki A/C.

IMHO przy tych czestotliwosciach warto liczyc sinus CORDICiem,
to kilkanascie dodawan i shiftow, a dokladnosc tego sinusa mozna
sobie wybrac dowolna, jaka jest potrzebna. Wylatuje przez to z
ukladu duza LUT, a te kilka arcus tangensow mozna sobie na
sztywno wpisac w kod.

Ogólnie nie będzie rewelacyjna (krótkie słowo adresujšce LUT cos(fi),

CORDIC sobie z tym poradzi.

krótkie słowo przetwornika ADC

A z tym juz nie. :-) Poza tym SNR tez bedzie taki sobie -- drabinka
R2R zbudowana z przypadkowych elementow rewelacji nie zapewni. :-(

Pozdrawiam
Piotr Wyderski


Poprzedni Następny
Wiadomość
Spis treści
From: J.F. <jfox_xnospamx_at_nospam_poczta.onet.pl>
Subject: Re: 89C51 - generator
Date: Thu, 03 Mar 2005 13:06:22 +0100


On Wed, 2 Mar 2005 15:59:20 +0100, Marek Dzwonnik wrote:
Użytkownik "Krzysztof" <krzysztof.gedroycWYTNIJ_TO_at_nospam_wp.pl> napisał w
Ma ktoś jakiś pomysł jak generować na 89C51 dwie częstotliwości:
400Hz i 401Hz (naraz, tzn. na dwóch osobnych wyjściach) z maksymalnie
dużš dokładnościš.

Koniecznie na 89C51 ?
Czy ten proc ma robić jeszcze coś innego?

Prawdopodobnie zmodyfikowałbym miniDDSa Jespera Hansena. Układ zbudowany na
2313 jest prosty jak budowa cepa: http://www.myplace.nu/avr/minidds/

Pytania podstawowe:
-co ma wyjsc - sinus, prostokat ?
-jakie "szumy fazowe" sa dopuszczalne ?

Bo jesli zbocza impulsow maja byc w pozycji mozliwie najdokladnieszej,
to
a) stosujemy dwa PLL, albo
b) potrzebujemy zegara 400*401Hz=160400 Hz, lepiej 2x wiecej lub jego
dowolna wielokrotnosc.

I nawet dds tu niewiele pomoze, chyba ze bedzie karmiony
czestotliwoscia z b), albo wygeneruje sinusa, potem dobry filtr
analogowy, komparator analogowy.

Moglby to nawet procek generowac: jedno przerwanie z w/w
czestotliwoscia, w przerwaniu prowadzimy dwa liczniki do 400 i 401,
ustawiamy odpowiednie bity.
Tylko ze 89C51 raczej nie bedzie w stanie tego zrobic. Kwarc powiedzmy
23.0976MHz, cykl rozkazowy 1.9248MHz, zostanie 12cykli na
przerwanie... no i na moj gust sporo zabraknie, bo arytmetyka
jest w '51 mierna. Albo uzyj AVR, albo jakiegos innego klona
'51 ktory nie wymaga 12 cykli zegara na rozkaz.
A w ogole to czemu meczyc procka na cos co pare dzielnikow
moze zrobic - pod warunkiem ze odpowiedni kwarc dostaniesz :-)

Jesli natomiast ta dokladnosc zboczy nie jest bardzo potrzebna
.. to moze nawet nakladanie przerwan nie przeszkadza ?

J.


Poprzedni Następny
Wiadomość
Spis treści
From: "Krzysztof" <krzysztof.gedroycWYTNIJ_TO_at_nospam_wp.pl>
Subject: Re: 89C51 - generator
Date: Thu, 3 Mar 2005 16:02:16 +0100


(...)generować na 89C51 dwie częstotliwości: 400Hz i
401Hz (naraz, tzn. na dwóch osobnych wyjściach)

Pytania podstawowe:
-co ma wyjsc - sinus, prostokat ?
-jakie "szumy fazowe" sa dopuszczalne ?

W moim pierwszym mailu napisałem, że układ ma generować
dwie częstotliwości, naraz, tzn. na dwóch osobnych wyjściach. Choć
nie było to powiedziane wprost, to większość osób od razu pomyślała,
że chodzi o przebiegi sinusoidalne. Ale przecież na "gołym" 89C51 nie
da się tego zrobić... Chodzi o przebiegi prostokštne.
Na dodatek częstotliwość 401Hz jest stała, a tš niższš można ustawiać
w zakresie powiedzmy 380 - 400 Hz.
Zrobić działajšcy taki układ "mniej więcej" jest łatwo, ale przydałoby
się by dokładność była lepsza niż 0,2 Hz.

Pzdr.
Krzysztof.



Poprzedni Następny
Wiadomość
Spis treści
From: J.F. <jfox_xnospamx_at_nospam_poczta.onet.pl>
Subject: Re: 89C51 - generator
Date: Thu, 03 Mar 2005 17:49:23 +0100


On Thu, 3 Mar 2005 16:02:16 +0100, Krzysztof wrote:
Pytania podstawowe:
-co ma wyjsc - sinus, prostokat ?
-jakie "szumy fazowe" sa dopuszczalne ?

Chodzi o przebiegi prostokštne.
Na dodatek częstotliwość 401Hz jest stała, a tš niższš można ustawiać
w zakresie powiedzmy 380 - 400 Hz.

bylo od tego zaczac.

Zrobić działajšcy taki układ "mniej więcej" jest łatwo, ale przydałoby
się by dokładność była lepsza niż 0,2 Hz.

Ale szumy fazowe jakie ?
Bo wygenerowac przebieg ktory ma dokladnie 397 impulsow na sekunde,
czy moze 397*60 imp/minute to jest jeden problem, a czy kolejne
impulsy maja miec okres 2,5188916876574307304785894206549 ms
to jest drugi problem.
czy moze lepiej zeby okres impulsow byl zawsze rowny, a dokladnosc
czestotliwosci to mniej istotna ?

J.