Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Synteza PLL na TSA6057 [atmega8]

mdm150 05 May 2010 19:54 10001 19
IGE-XAO
  • #1
    mdm150
    Level 27  
    Ello.
    Przymierzam się zrobić tuner radiowy na ukf i zrobiłem jak narazie syntezę z tej stronki http://www.easy-soft.net.pl/zasoby/pll-tsa6057.pdf . Zamiast AT90S4433 podstawiłem atmegę8. Tylko że jest mały problem -synteza jest dostosowana do nadajnika. Więc do tunera nie bardzo ona podchodzi pod względem sposobu strojenia. Jest ktoś w stanie przerobić program by bardziej pasowało do tunera. Dwa pierwsze przyciski by były do strojenia a pozostałe choćby do zaprogramowania stacji. Soft napisany w bascomie-jest w załączniku.

    PS.
    Przeprowadziłem też próbe tego układziku z użyciem głowicy z blaupunkta kingston dj i nie stroi głowicy tak jak powinien: napięcia strojenia od 1V z hakiem do ok 3V. Zapewne mam problem z układem syntezy(TSA6057).
  • IGE-XAO
  • #2
    asembler
    Level 32  
    Tak podpowiem ze tam jest pośrednia chyba 10.7mhz
  • IGE-XAO
  • #3
    artursz
    Level 12  
    Witam.

    Popełniłem kiedyś syntezę do Tunera Diora AS642 (z odczytem częstotliwości).
    Dorobiłem syntezę na TSA6057 oraz głowicy Gloria (zasilanie 8V).
    Sterowanie up/down (gałka) za pomocą enkodera oraz wykorzystałem 7 przycisków programatora do wybierania stacji z pamięci.
    W załączniku okrojony (do obsługi tylko up/down) program w bascomie.
    Myślę, że zmiana pinów na Mega8 nie przysporzy trudności.
    Code:
        $regfile = "m16def.dat"                                 
    
        $crystal = 4000000

    Config Sda = Portb.1
    Config Scl = Portb.0
    Config Porta = Input

       Dim B As Byte                                            ' Zmienna
       Dim Czest As Byte                                        ' Częstotliwość - zgrubna
       Dim Czestf As Byte                                       ' Częstotliwość - dokładna

    I2cinit

              Czestf = &B10000000
              Czest = &B00101111

         Do
             B = Encoder(pina.7 , Pina.6 , Fup , Fdown , 0)
         Loop


    Tsa6057:                                                    ' Zapis danych do TSA 6057
             I2cstart
             I2cwbyte &B11000100
             I2cwbyte &B00000000
             I2cwbyte Czestf
             I2cwbyte Czest
             I2cwbyte &B00100011
             I2cwbyte &B00000000
             I2cstop
             Return


    Fup:                                                        ' Częstotliwość w górę
             If Czestf < 250 Then
                Czestf = Czestf + 10
             Else
                Czest = Czest + 1
                Czestf = 0
             End If
             Gosub Tsa6057
             Return

    Fdown:                                                      ' Częstotliwość w dół
             If Czestf < 255 And Czestf > 15 Or Czestf = 0 Then
                Czestf = Czestf - 10
             Else
                Czest = Czest - 1
                Czestf = 0
             End If
             Gosub Tsa6057
             Return

    End
  • #4
    mdm150
    Level 27  
    >artursz
    Dzięki za soft może z niego skorzystam. Zamiast enkodera można podstawić mikroswitche bez przeróbki softu? W tym przypadku zmuszony byłbym postawić zewnętrzny częstościomierz skoro niema obsługi lcd, a chciałbym tego uniknąć.

    Ktoś wie jak zmusić ten syntezer aby prawidłowo przestrajał? Przydało by się ograniczyć zakres przestrajania do 87.5-108MHz z 30-150MHz.Testowałem go na zakresie 87.5-108MHz i wyżej. Z oryginalnej aplikacji (pin5-TSA6057)usunąłem rezystor 150Ω oraz kondensator 1nFi w jego miejsce wlutowałem rezystor 100Ω(zamiast kondensatora). Rzeczywista częstotliwość była niższa o 10.7MHz (76.8-97.3). Z kolei napięcie strojenia wyniosło dla wyzej wymienionego zakresu 0.27-3.0V.Wiem bo podpięty był częstościomierz wymontowany z radia samochodowego.
    Fale odbieranych stacji radiowych pokrywały sie z częstotliwością wyświetlaną przez owy częstościomierz.
  • #5
    artursz
    Level 12  
    Bez zmiany w programie zastąpienie enkodera przyciskami nic nie da.
    Dopisane obsługi wyświetlacza jest bardzo proste.
    Co do przestrajania to jeśli podasz zasilanie odpowiednie dla danej głowicy to TSA6057 poda na strojenie odpowiednie napięcie aby pokryć cały zakres 88-108
    MHz. Nie może to być jednak napięcie wyższe niż podane w karcie katalogowej układu TSA (nie zadziała przy głowicach przestrajanych napięciem 33V).
    Jak zmontujesz układ syntezy zgodnie z kartą katalogową (wartości elementów RC) to będzie działać na tym programie co wcześniej podałem bez problemu.
    Częstotliwość była niższa o 10.7 dlatego, że do uzyskania właściwej częstotliwości trzeba wysłać do TSA6057 właśnie częstotliwość jaką się chce odebrać + 10.7MHz (gdzieś w karcie katalogowej o tym jest napisane).
  • #6
    mdm150
    Level 27  
    M. S. wrote:
    Trzeba w programie odszukać następujące fragmenty:
    Code:
    Pokazanaf = Frequency * Mnoznik
    
    Pokazanaff = Str(pokazanaf)
    Pokazanafstr = Format(pokazanaff , "00.0000")
    Pokazanaff = Format(pokazanafstr , "000.0")
    Lcd Pokazanaff : Lcd " MHz"


    i zmienić tak:

    Code:
    Pokazanaf = Frequency * Mnoznik
    
    Pokazanaf = Pokazanaf + 10700' Dodajemy pośrednią lub odejmujemy - najprawdopodobniej w kHz
    Pokazanaff = Str(pokazanaf)
    Pokazanafstr = Format(pokazanaff , "00.0000")
    Pokazanaff = Format(pokazanafstr , "000.0")
    Lcd Pokazanaff : Lcd " MHz"


    Nie analizowałem dokładnie programu ale myślę, że to powinno wystarczyć. Można byłoby ustawiać wartość p.cz. lecz skomplikowałoby to program i chyba nie warto bo wiadomo zawsze jaka jest I p. cz.
    Uwaga! Fragment ten powtarza się w kilku miejscach.

    Wypowiedź pochodzi z tematu: https://www.elektroda.pl/rtvforum/topic884729.html
    Ma szanse działać ta podmiana w sofcie zapodanym przeze mnie wcześniej? W której pozycji powinienem zarzucić tą zmiane bo jak podstawiłem w kilku powtarzających sie fragmentach to nie szło stroić.
  • #7
    sp3ots
    Level 38  
    Witam !
    Jaki ma być krok tej syntezy ? Ile KHz ?
    Pozdrawiam. Stefan GG6293398
  • #8
    mdm150
    Level 27  
    W sumie zakres strojenia mógłby się mieścic w zakresie 87.5-108MHz . Krok strojenia najlepiej jak by wynosił 50KHz, a nie10 lub 25KHz jak ma to miejsce w sofcie który zarzuciłem w pierwszym poście.
  • #9
    sp3ots
    Level 38  
    Witam !
    Poniżej kod sterownika do PLL na TSA6057.
    Skaner działa, nie jestem w stanie sprawdzić działania I2C bo nie posiadam
    odpowiedniego VFO.
    Sterownik na TSA6057 już robiłem do TRXa DT3000. Radio pracuje na dwóch metrach, z krokiem 12,5KHz
    Proszę o sprawdzenie działania I2C i odpowiedź czy działa.
    Uwaga ! w kodzie są dwie ważne linie zaremowane :
    'Gosub I2c
    Należy je odremować po próbie skanera bez obecności TSA6057.
    Z doświadczenia z I2C wiem że program bez obecności TSA6057 zatrzyma się.
    Myślę że każdy domyśli się gdzie podłączyć dwa przyciski skanera, LCD i I2C.
    Code:

    'PLL do FM 88-108MHz
    'Fusy fabryczne
    $regfile = "attiny2313.dat"
    $crystal = 1000000

    Config Pinb.0 = Input
    Portb.0 = 1
    X_gora Alias Pinb.0

    Config Pinb.1 = Input
    Portb.1 = 1
    X_dol Alias Pinb.1

    Config Sda = Portd.4
    Config Scl = Portd.5

    Dim Temp As Long
    Dim Freq As Long
    Dim Freq_temp As Long
    Dim Db0 As Byte
    Dim Db1 As Byte

    Dim Pokazanafstr As String * 10
    Dim Pokazanaff As String * 10
    Dim Pokazanaf As Long

    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db7 = Pb.2 , Db6 = Pb.3 , Db5 = Pb.4 , Db4 = Pb.5 , E = Pb.6 , Rs = Pb.7

    Const Freq_pcz = 1070       'x10 czestotliwosc posrednia
    Const Krok = 5       'x10 KHz krok przestrajania PLL
    Const Scan_up = 10800       'x10 gorna czestotliwosc skanera
    Const Scan_dn = 8800       'x10 dolna czestotliwosc skanera
             Freq = 8800       'x10 po wlaczeniu
    Cls
    Lcd "  FM 88-108MHz  "
    Cursor Off
    Wait 1

    Do
    Gosub Licz
    Loop
    End
    '--------podprogramy---------
    Licz:

    If Freq > Scan_up Then Freq = Scan_dn       'Dol Przestrajania
    If Freq < Scan_dn Then Freq = Scan_up       'gora Przestrajania
    '--------------------------------
     If X_dol = 0 Then Gosub W_dol
    If X_gora = 0 Then Gosub W_gore

    Freq_temp = Freq + Freq_pcz

    Pokazanaf = Freq
    Pokazanaff = Str(pokazanaf)
    Pokazanafstr = Format(pokazanaff , "00.00")
    Pokazanaff = Pokazanafstr


    If Pokazanaf < 10000 Then
    Locate 2 , 2
    Lcd " "
    Locate 2 , 3
    Else
    Locate 2 , 2
    End If
    Lcd Pokazanaff : Lcd " MHz"

    Return

    W_gore:
    Freq = Freq + Krok
    'Gosub I2c       'po próbach skanera odremuj tą linię
    Waitms 200
    Return

    W_dol:
    Freq = Freq - Krok
    'Gosub I2c       'po próbach skanera odremuj tą linię
    Waitms 200
    Return

    I2c:
    Temp = Freq_temp / Krok
    Shift Temp , Left , 1
    Db0 = Inp(&H60)
    Db1 = Inp(&H61)
    I2cstart
    I2cwbyte 196       'dla adresu C4H
    I2cwbyte 3
    I2cwbyte 0
    I2cwbyte Db0
    I2cwbyte Db1
    I2cwbyte 96
    I2cstop
    Return

    Osobę która sprawdzi działanie I2C proszę o opinie tutaj lub na GG6293398
    albo sp3ots(malpa)o2.pl
    Pozdrawiam. Stefan
  • #10
    mdm150
    Level 27  
    Ello.
    Skorzystałem z twojego programu i dostosowałem do mojej syntezy na atmega8. Progs wystartował (proc reaguje na przypisane klawisze)ale nie przestraja głowicy.
    [code]
    'PLL do FM 87.5-108MHz
    'Fusy fabryczne
    $regfile = "m8def.dat"
    $crystal = 4000000

    Config Pind.0 = Input
    Portd.0 = 1
    X_gora Alias Pind.0

    Config Pind.1 = Input
    Portd.1 = 1
    X_dol Alias Pind.1

    Config Sda = Portc.5
    Config Scl = Portc.4

    Dim Temp As Long
    Dim Freq As Long
    Dim Freq_temp As Long
    Dim Db0 As Byte
    Dim Db1 As Byte

    Dim Pokazanafstr As String * 10
    Dim Pokazanaff As String * 10
    Dim Pokazanaf As Long

    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Portb.1 , Db5 = Portb.2 , Db6 = Portb.3 , Db7 = Portb.4 , E = Portb.0 , Rs = Portd.7

    Const Freq_pcz = 1070 'x10 czestotliwosc posrednia
    Const Krok = 5 'x10 KHz krok przestrajania PLL
    Const Scan_up = 10800 'x10 gorna czestotliwosc skanera
    Const Scan_dn = 8750 'x10 dolna czestotliwosc skanera
    Freq = 8750 'x10 po wlaczeniu
    Cls
    Lcd " FM 87.5-108MHz "
    Cursor Off
    Wait 1

    Do
    Gosub Licz
    Loop
    End
    '--------podprogramy---------
    Licz:

    If Freq > Scan_up Then Freq = Scan_dn 'Dol Przestrajania
    If Freq < Scan_dn Then Freq = Scan_up 'gora Przestrajania
    '--------------------------------
    If X_dol = 0 Then Gosub W_dol
    If X_gora = 0 Then Gosub W_gore

    Freq_temp = Freq + Freq_pcz

    Pokazanaf = Freq
    Pokazanaff = Str(pokazanaf)
    Pokazanafstr = Format(pokazanaff , "00.00")
    Pokazanaff = Pokazanafstr


    If Pokazanaf < 10000 Then
    Locate 2 , 2
    Lcd " "
    Locate 2 , 3
    Else
    Locate 2 , 2
    End If
    Lcd Pokazanaff : Lcd " MHz"

    Return

    W_gore:
    Freq = Freq + Krok
    'Gosub I2c 'po próbach skanera odremuj tą linię
    Waitms 200
    Return

    W_dol:
    Freq = Freq - Krok
    'Gosub I2c 'po próbach skanera odremuj tą linię
    Waitms 200
    Return

    I2c:
    Temp = Freq_temp / Krok
    Shift Temp , Left , 1
    Db0 = Inp(&H60)
    Db1 = Inp(&H61)
    I2cstart
    I2cwbyte 196 'dla adresu C4H
    I2cwbyte 3
    I2cwbyte 0
    I2cwbyte Db0
    I2cwbyte Db1
    I2cwbyte 96
    I2cstop
    Return

    Schemat syntezy po dostosowaniu programu.
    Synteza PLL na TSA6057 [atmega8]
  • #11
    sp3ots
    Level 38  
    Witam !
    Nie na pisałeś nic na temat I2C, z kodu wynika że nie odremowałeś dwóch linii:
    tą linię:
    Code:

    'Gosub I2c 'po próbach skanera odremuj tą linię

    zmień na:
    Code:

    Gosub I2c 'po próbach skanera odremuj tą linię

    Czy odremowałeś te dwie linie ?
    Pozdrawiam. Stefan
    Witam ponownie !
    Po ponowny przemyśleniu sprawy doszedłem do wniosku ( matematyka się kłania )
    że:
    TSA6057 z rezonatorem 4MHz pracuje na FMie z krokiem 10KHz
    Napisanie programu na krok 50KHz spowodowało złe przeliczenia, np.
    obliczenie dla 88,00MHz
    88MHz / 10KHz = 880
    a
    88MHz / 50KHz = 176
    880 / 176 = 5
    dla tego Freq_temp trzeba pomnożyć 5 razy
    dla tego dodatkowa linia w podprogramie I2C
    Code:

    I2c:
    Freq_temp = Freq_temp * 5
    Temp = Freq_temp / Krok
    Shift Temp , Left , 1
    Db0 = Inp(&H60)
    Db1 = Inp(&H61)
    I2cstart
    I2cwbyte 196       'dla adresu C4H
    I2cwbyte 3
    I2cwbyte 0
    I2cwbyte Db0
    I2cwbyte Db1
    I2cwbyte 96
    I2cstop
    Return

    Mam nadzieję że teraz TSA6057 zacznie działać.
    Jeszcze jedno, pod program I2C: wyśle sterowanie do TSA6057 dopiero po pierwszej zmianie częstotliwości.
    Proszę o wiadomość o działaniu programu.
    Pozdrawiam. Stefan GG6293398
  • #12
    mdm150
    Level 27  
    Ello.
    Po dłuższym czasie powróciłem do tematu związanego z tą syntezą. Dotychczas syntezer wykazywał rozbieżność w nastawach o 20kHz- w jedną jak i w drugą stronę. Wlutowałem w miejsce kondka 27pF-trymer 30pF. Częściowo problem się rozwiązał ale nie do końca. Gdy stroję częstotliwość w górę to błąd na całej długości zakresu(87,50-1008MHz) wynosi 0-3kHz(o tyle zawyżona wartośc rzeczywista). niestety w dół jest już dużo gorzej-bo aż 40kHz- o tyle rzeczywista częstotliwość jest wyższa od ustawionej wartości w syntezie. Jak to zgrać aby nie było takich odchyleń? Bym zapomniał w mojej syntezie krok strojenia wynosi 0,02MHz.
    Code:
    'PLL do FM 87.5-108MHz
    
    'Fusy fabryczne
    $regfile = "m8def.dat"
    $crystal = 4000000

    Config Pind.0 = Input
    Portd.0 = 1
    X_gora Alias Pind.0

    Config Pind.1 = Input
    Portd.1 = 1
    X_dol Alias Pind.1

    Config Sda = Portc.5
    Config Scl = Portc.4

    Dim Temp As Long
    Dim Freq As Long
    Dim Freq_temp As Long
    Dim Db0 As Byte
    Dim Db1 As Byte

    Dim Pokazanafstr As String * 10
    Dim Pokazanaff As String * 10
    Dim Pokazanaf As Long

    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Portb.1 , Db5 = Portb.2 , Db6 = Portb.3 , Db7 = Portb.4 , E = Portb.0 , Rs = Portd.7

    Const Freq_pcz = 1070                                       'x10 czestotliwosc posrednia
    Const Krok = 2.5                                            'x10 KHz krok przestrajania PLL
    Const Scan_up = 10800                                       'x10 gorna czestotliwosc skanera
    Const Scan_dn = 8750                                        'x10 dolna czestotliwosc skanera
             Freq = 8750                                        'x10 po wlaczeniu


    Do
    Gosub Licz
    Loop
    End
    '--------podprogramy---------
    Licz:

    If Freq > Scan_up Then Freq = Scan_dn                       'Dol Przestrajania
    If Freq < Scan_dn Then Freq = Scan_up                       'gora Przestrajania
    '--------------------------------
     If X_dol = 0 Then Gosub W_dol
    If X_gora = 0 Then Gosub W_gore

    Freq_temp = Freq + Freq_pcz

    Pokazanaf = Freq
    Pokazanaff = Str(pokazanaf)
    Pokazanafstr = Format(pokazanaff , "00.00")
    Pokazanaff = Pokazanafstr


    If Pokazanaf < 10000 Then
    Locate 2 , 2
    Lcd " "
    Locate 2 , 3
    Else
    Locate 2 , 2
    End If
    Lcd Pokazanaff : Lcd " MHz"

    Return

    W_gore:
    Freq = Freq + Krok
    Gosub I2c                                                   'po próbach skanera odremuj tą linię
    Waitms 200
    Return

    W_dol:
    Freq = Freq - Krok
    Gosub I2c
    Waitms 200
    Return

    I2c:
    Freq_temp = Freq_temp * 2.5
    Temp = Freq_temp / Krok
    Shift Temp , Left , 1
    Db0 = Inp(&H60)
    Db1 = Inp(&H61)
    I2cstart
    I2cwbyte 196                                                'dla adresu C4H
    I2cwbyte 3
    I2cwbyte 0
    I2cwbyte Db0
    I2cwbyte Db1
    I2cwbyte 96
    I2cstop
    Return
  • #13
    SQ9MYX
    Level 23  
    A ma może ktoś prosty program w Bascomie na ATmega8 i tsa6057 który zaraz po załaczeniu zasilania wyśle do syntezy rozkaz ustawienia np 88,4MHz bez zabawy z przyciskami i LCD... ewentualnie jeszcze kontrola diodą Led o prawidłowym przesłaniu danych
  • #14
    DJ_DOGGY
    Level 10  
    i don`t know Polish language ..
    Please post a working Source coupled with HEX for this PLL with AT90S2313 and ATmega8 ... Please

    I test the Codes for the post with schematic and source for 2313 in Proteus but don`t see I2C to work ?!!? Help me if i`m wrong ?!
  • #15
    sp7wqv
    Level 12  
    Bawiłem się tym programem z pierwszego postu na lcd ładnie wygląda lecz
    nie programuje Tsa6057 wstawiam program który działa lecz ma wady po włączeniu
    pętla nie synchronizuje ale po pierwszej zmianie częstotliwości wszystko jest ok
    mam nadzieje że ktoś to ulepszy.
    'PLL do FM 110-174MHz
    'Fusy fabryczne
    Code: basic4gl
    Log in, to see the code
  • #16
    sp3ots
    Level 38  
    Witam !
    Masz problem że po włączeniu I2C nie steruje TSA6057 na własne życzenie, ponieważ Gosub I2C umieściłeś w podprogramach:
    W_gOrę, w_dół gdzie program po starcie nie wchodzi !
    Przykładowe rozwiązanie:
    Przed pętlą Do loop dodaj parametry początkowe PLL np.145000 a potem
    dodaj Gosub I2C,
    Pozdrawiam. Stefan
  • #18
    sp3ots
    Level 38  
    Witam !
    Wiem o co Tobie chodzi, ja to nazywam "traktorkiem" wiem że I2C robi zakłócenia w czasie pracy PLL gdy I2C nie jest w spoczynku, dlatego
    PLL na początku programu ma dostać sygnał tylko 1 raz i wejść do pętli Do...Loop