logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Nieprawidłowe generowanie częstotliwości powyżej 1MHz na AD9850 z 89C4051

k_w 28 Gru 2007 11:40 2429 9
REKLAMA
  • #1 4631312
    k_w
    Poziom 12  
    Posty: 98
    Pomógł: 1
    Ocena: 6
    Witam
    Prześledziłem posty na temat AD9850 (wydaje mi się, że wszystkie na elektrodzie) i nie znalazłem odpowiedzi na mój problem.
    Zmontowałem sobie DDS na układzie AD9850, który jest sterowany przez 89C4051 i mam problem. Do częstotliwości 1MHz jest wszystko ok (jeśli chodzi o częstotliwość). Generuje sygnał o zadanej częstotliwości. Problem sie pojawia jak chce ustawić częstotliwość powyżej 1MHz. Gdy ustawię 2Mhz to generuje sygnał o częstotliwości 3MHz, a jeżeli ustawie 3MHz to generuje o częstotliwości 5MHz, przy 4 generuje f=7MHz itd. Tak jak by dodawał co 2MHz. teraz przy zmianie częstotliwości w dół dzieje się coś takiego: powiedzmy ze zmieniam z 7MHz w dół (pamiętajmy ze przy 7MHz ustawionych generuje sygnał o f=13MHz) to przy zmianie na 6 nic sie nie dzieje dalej generuje sygnał o f=13MHz przy zmianie z 6MHz na 5MHz zmienia sie o 2 MHz czyli generuje 11MHz itd. Co dziwne gdy dojdę do 1MHz (ustawię) to generuje właściwą częstotliwość.
    To pierwszy problem. Drugi to zmiana amplitudy wraz ze wzrostem częstotliwości. Im większa częstotliwość tym mniejsza wartość sygnału na wyjściu układu.
    Kod odpowiedzialny za przeliczenie częstotliwości:
    
    Sub Policz                                                    
    Frq = 0                                                       
    Frqz = 0
    Frqz = 1h * 43
    Frq = Frq + Frqz
    Frqz = 10h * 430
    Frq = Frq + Frqz
    Frqz = 100h * 4295
    Frq = Frq + Frqz
    Frqz = 1k * 42950
    Frq = Frq + Frqz
    Frqz = 10k * 429497
    Frq = Frq + Frqz
    Frqz = 100k * 4294969
    Frq = Frq + Frqz
    Frqz = 1m * 42949673
    Frq = Frq + Frqz
    Kat = Faza
    End Sub   

    Kod który jest odpowiedzialny za wysłanie inf. do AD9850:
    
    Sub Wyslij1
       Set Fq_ud
       nop
       nop
       Reset Fq_ud
       A = 0
       For A = 0 To 31
       Dana = Frq.a
       Set W_clk1
       nop
       nop
       Reset W_clk1
       Next A
    
       A = 0
       Reset Dana
       For A = 0 To 7
       Set W_clk1
       nop
       nop
       Reset W_clk1
       Next A
    
       Set Fq_ud
       nop
       nop
       Reset Fq_ud
    
    End Sub
    

    A użyłem kwarcu 100MHz do AD9850, konfiguracja do układu wysyłana jest szeregowo.

    Proszę o pomoc.
  • REKLAMA
  • #2 4632399
    qrdel
    Poziom 28  
    Posty: 1074
    Pomógł: 100
    Ocena: 71
    Tak na szybko, to postaraj się wyprowadzić z procesora, albo symulatora całe słowo sterujące jakie powstaje w wyniku Twoich obliczeń.
    Pierwszy pomysł to po prostu błąd przesunięcia o jeden bit słowa kodowego, poczynając od bitu ok. 1 MHz.
    Bardzo spokojnie przelicz na papierze i na palcach cały algorytm, a potem sprawdź z datasheetem zaczenie każdego bitu który Ci wyszedł.

    No i jeszcze kontrola oscyloskopowa wpisywanego fizycznie słowa kodowego.

    Co do amplitudy to zależy od prawidłowego rezystora Rset i od tego co jest na wyjściu, sprawdź czy nie masz może blokującego kondensatora (albo filtru, który i tak nalezałoby polecić ze względu na harmoniczne).
  • #3 4636748
    k_w
    Poziom 12  
    Posty: 98
    Pomógł: 1
    Ocena: 6
    ok dziękuję za podpowiedź. Sprawdzę to wszystko i napisze czy coś sie zmieniło. Ale takie pytanko: czy od tego rezystora co piszesz to nie zależy ale wartość prądu?? A na wyjściu tak mam filtr LC.
    przeliczam wg wzoru: słowo=(f/fclk)*2^32
    f-częstotliwość jaka ma być wygenerowana
    fclk-częstotliwość kwarcu
    słowo-wartość która ma być wysłana do AD9850
  • REKLAMA
  • #4 4638867
    qrdel
    Poziom 28  
    Posty: 1074
    Pomógł: 100
    Ocena: 71
    Ja po prostu na zdrowy rozum.
    Gdyby algorytm "gubił" jeden bit (adres jednego bitu) i wpisywał wszystkie wyższe bity "za wysoko" to od pewnej progowej częstotliwości wyniki by się (mniej więcej) podwajały.
    Bardzo mi się nie chce analizować Twojego kodu.
    W końcu mam wolne.
    A już i tak grypa żołądkowa spaskudziła mi kawał świąt.
    Spróbuj metodą bisekcji dojść jaka jest graniczna wartość częstotliwości od której występuje błąd.
    I określ jakie jest wtedy słowo kodowe.
    Strzelam że będzie 000000000111111111xxxx
    no oczywiście dłuższe.

    Do pomiaru amplitudy odłącz całą filtrację i mierz na samym gołym oporku.
    Z oporkiem Rset to myślę że jest OK ale musiałem zaznaczyć dla porządku.
    On ustala prąd, ale ten prąd na czystym oporze daje liniowy spadek napięcia.
    Koniecznie daj 50ohm obciążenia i potem zbyt nie obciążać.
    Tak jak na schemacie ze strony 15 datasheeta.
    [ http://www.analog.com/UploadedFiles/Data_Sheets/AD9850.pdf ]

    Dodano po 14 [minuty]:

    Niestety, nie rozumiem.
    Wysyłanie danych (jeśli rozumiem ten assembler czy co to za język) wygląda OK.
    Ale ten programik obliczeniowy to nie na mój rozum.
    Co to są 1h, 10h, 100h, 1k, 10k, 100k, 1m ?
    gdzie tu jest wogóle zmienna?

    Ciekawe że nic nie rozumiem, w końcu mój układzik chodził na 89C2051 i AD9850.
    Ale miałem tam czterobajtowe dzielenie i odbiór danych przez RS. No i czasowo się nie wyrabiało, trzeba było wstawiać (chyba) po 10ms (albo więcej) pomiędzy kolejne bajty przesyłane szeregowo.

    Dodano po 41 [minuty]:

    dobra pojąłem, to są kolejne cyfry.
    Trochę ich mało, mimo że układ pociągnie do 50MHz to program tylko do 9.999999MHz.
    Rachunki są OK. (z grubsza, napisałem programik i jeśli się zmieni ostatnią stałą to są zbliżone efekty) obejrzyj dokładnie kod obrabiający cyfrę jednostek MHz
    i w procedurze transferu zobacz czy przypadkiem nie wysyłasz przy tym bicie podwójnego sygnału W_clk1.

    Dodano po 43 [minuty]:

    Dobra, chcę już iść spać.
    Jeżeli tabelka błędów wygląda następująco (w MHz)

    1 > 1
    2 > 3.5625
    3 > 4.5625
    4 > 7.125
    5 > 9.6875
    6 > 10.6875
    7 > 13.25

    to jest to efekt uzyskiwany gdy po wpisaniu bitu 25 (licząc od 0) zostanie wpisane 0 a następnie bit 26 wpisany w pozycję 27, bit 27 w pozycję 28 etc.
    Nie tłumaczy to efektów przy zmniejszaniu częstotliwości.

    Zaczynam się zastanawiać czy scalak jest dobry.
    Ale myślę że możesz napisać na próbę prosty program wpisujący słowo 2^25 potem 2^26 potem 2^27 i po tych trzech próbach (i zmierzeniu częstotliwości) będziesz wiedział co realizuje scalak.
    Oczywiście wciąż będziesz miał szansę użycia nieprawidłowej procedury przesyłania danych.
  • #5 4643416
    k_w
    Poziom 12  
    Posty: 98
    Pomógł: 1
    Ocena: 6
    do ustawiania częstotliwości używam enkodera obrotowego. (obrót, przycisk 1h, 10h, 100h to zmienne w których zapisywana jest ilość obrotów enkodera i mnożona następnie przez współczynnik aby uzyskać odpowiednią częstotliwość. układ nie może być nie sprawny bo podłączyłem drugi i dzieje sie to samo. Program jest napisany w bascom'ie ale to już pewnie wiesz. Dlaczego uważasz że program pociągnie tylko do 9MHz. Ja tak nie uważam bo jeżeli zmienna 1M będzie miała wartość np 20 to powinien układ wygenerować sygnał f=20MHz. I w sumie generuje f>10MHz ale nie tak jak powinien (wartość na ustawiona na wyświetlaczu i wygenerowana się różnią).
    Dziękuję za podpowiedź co mam sprawdzić zrobię to i napisze o efektach. pozdrawiam
  • REKLAMA
  • #6 4643429
    kamyczek
    Poziom 38  
    Posty: 3994
    Pomógł: 394
    Ocena: 573
    problem może leżeć po stronie bascoma który nie radzi sobie czasem z niektórymi rzeczami zbyt dobrze , pozostaje esencja programowania czyli asembler.
  • REKLAMA
  • #7 4643502
    qrdel
    Poziom 28  
    Posty: 1074
    Pomógł: 100
    Ocena: 71
    Wstaw linię ustalającą Frq na konkretną wartość niezależnie od nakręcania i testuj.
    Co do 9MHZ to wynikało tylko z ilości cyfr, jesli dopuszczasz "cyfrę" 20 to OK.
  • #8 4652061
    k_w
    Poziom 12  
    Posty: 98
    Pomógł: 1
    Ocena: 6
    problem ze zdwojeniem częstotliwości rozwiązany. Kolega kamyczek miał racje. Bascom (nie wiem czemu) nie radził sobie z zerowaniem zmiennej
    Frqz = 0. A co najdziwniejsze nie zerował tego w ten sposób Frqz = 0 a dopiero w ten Frqz =Frqz * 0. Błąd sie pojawiał w momencie gdy w procedurze
    Sub Policz                                                   
    Frq = 0                                                       
    Frqz = 0 (usunałem)
    Frqz = 1h * 43
    Frq = Frq + Frqz
    Frqz = 10h * 430
    Frq = Frq + Frqz
    Frqz = 100h * 4295
    Frq = Frq + Frqz
    Frqz = 1k * 42950
    Frq = Frq + Frqz
    Frqz = 10k * 429497
    Frq = Frq + Frqz
    Frqz = 100k * 4294969
    Frq = Frq + Frqz
    Frqz = 1m * 42949673
    Frq = Frq + Frqz
    Kat = Faza
    (Frqz =Frqz * 0)
    End Sub   

    zmienna 1m przyjmowała jakąś wartość >0. Jeżeli 1m=0 to wtedy zmienna Frqz sie zerowała i było OK. I zawsze wyliczona wartość poprzednio była pamiętana. A ona musi być pamiętana tylko podczas obliczeń po wysłaniu jej do DDS musi być wyzerowana. Jedynie zmienne 1h, 10h itd muszą być pamiętane cały czas. Wyrażenia w nawiasach to poprawki po których program zaczął prawidłowo działać. Temat zdwojenia częstotliwości uważam za zamknięty (tzn. część dotyczącą częstotliwości ).

    Pozostaje jeszcze sprawa zmniejszania się amplitudy sygnału na wyjściu C/A wraz ze wzrostem częstotliwości. Wyczytałem w dokumentacji że układ daję sygnał o wartości 1,5V (jeżeli się mylę to mnie poprawcie). I tak sie dzieje ale jak na wyjściu użyje rezystora 100Ω zamiast 50 Ω i rezystor podłączony do Rset ma wartość 2,3kΩ czyli prąd ok 18mA. Amplituda zmienia się niezależnie czy jest podłączony filtr czy go nie ma. Sygnał zaczyna maleć przy 4MHz, a układ pracuje do 32MHz. Przy maksymalnej częstotliwości to ma już wartość ok 30mV (wszystko cały czas sprawdzane oscyloskopem).
  • Pomocny post
    #9 4653351
    qrdel
    Poziom 28  
    Posty: 1074
    Pomógł: 100
    Ocena: 71
    No niestety kolejne "świetne" narzędzie pokazało do czego się nadaje.
    Miałem kiedyś do czynienia z super HiTec systemem sztucznej inteligencji.
    Był taki świetny, że nawet w Holandii stosowali go w zamkniętej pętli do sterowania podawaniem silnie działających leków.
    A u nas okazało się że po zadeklarowaniu 254 zmiennej system stracił wszelkie pozory sensownego działania.
    Zrobiliśmy testową bazę wiedzy - same deklaracje i na koniec 1 operacja typu wydrukuj wynik dodawania 2+2.
    Dopisanie spacji w bazie zmieniało wynik.
    Oczywiście nie popełnialiśmy żadnego błędu, spacja była nie znaczącym nic białym znakiem.

    A co do amplitudy to raczej już nie mam pomysłów.
    Sam mam przed sobą uruchamianie generatora na AD9833 i amplituda będzie tam istotna.
  • #10 4655331
    k_w
    Poziom 12  
    Posty: 98
    Pomógł: 1
    Ocena: 6
    ok. dziękuje za wszelkie rady. Jeżeli byś miał podobny (albo ktokolwiek miał taki problem i wie jak sie z nim uporać niech pisze) problem i się z nim uporasz to proszę opisz w jaki sposób. pozdrawiam

Podsumowanie tematu

✨ Problem dotyczył nieprawidłowego generowania częstotliwości powyżej 1 MHz na układzie AD9850 sterowanym mikrokontrolerem 89C4051. Do 1 MHz generacja przebiegała poprawnie, natomiast powyżej tej wartości sygnał był zniekształcony i częstotliwość była zdwojona lub przesunięta o wielokrotność 2 MHz. Przy zmianie częstotliwości w dół pojawiały się podobne anomalie. Przyczyną błędu okazało się nieprawidłowe zerowanie zmiennej w programie napisanym w Bascomie, co powodowało, że zmienna przechowująca wartość częstotliwości nie była resetowana i kumulowała błędne wartości. Po poprawieniu zerowania zmiennej problem z generacją częstotliwości został rozwiązany. Wskazano również na konieczność dokładnego sprawdzenia algorytmu obliczającego słowo sterujące dla AD9850, kontrolę bitów i przesunięć oraz pomiar oscyloskopowy wysyłanego słowa. Dodatkowo zwrócono uwagę na prawidłowy dobór rezystora Rset, który ustala prąd wyjściowy, oraz na obecność filtrów LC na wyjściu sygnału. Sugerowano także, że Bascom może mieć ograniczenia w obsłudze niektórych operacji, co może wymagać zastosowania asemblera. Ostatecznie problem z częstotliwością powyżej 1 MHz został rozwiązany poprzez korektę kodu i właściwe zerowanie zmiennych w programie.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA