2013年7月12日金曜日

AD9834 DDS VFO PCB

AD9834 DDS VFO(7Mhz IF=10Mhz Upper Heterodyne VFO)。先に紹介したユニバーサル基板をプリントパターン化したのもである。全般的に見直し、バッファアンプ追加、オシレター変更、エンコーダーレスポンス改善を行った。DDSチップは、変換基板を使って容易なものに仕上げた。オシレターは、ハーフサイズも実装可能である。  
LCDを外した実装基板。レギュレータに小型フィンを付けているが、発熱量が多いので大型化したい所である。オシレターは、8pinタイプも実装可能。  
基板サイズ 71×57。  



回路図。オシレターを容易に入手できる50Mhzに変更。バッファアンプを追加。DDSコントロールPINを基板パターン引き回しの都合で変更。 











'********************************************************
'AD9834 DDS VFO program
'
'     7.000Mhz to 7.200Mhz Limitted!
'     (VFO frequency = IF frequency - Frequency)
'                                       2013/07/05
'                                           JA2GQP
' BASCOM AVR 2.0.7.5(DEMO version) Compiled
'--------------------------------------------------------
'  Function
'
'     1.Upper heterodyne
'     2.RIT operation(-10khz to +10khz)
'     3.STEP(10000,1000,100,10)
'     4.Memory operation is push RIT
'       (Frequency and Step)
'     5. Protection operation at the time of transmission
'--------------------------------------------------------
'  Modification
'     1.Oscillator 67.108864Mhz -> 50.000Mhz
'     2.Clock 8Mhz -> 0.8Mhz(Encoder response improvement)
'     3.DDS conrol PIN assign
'********************************************************
'
$regfile = "m88adef.dat"
$crystal = 800000                       '0.8Mhz clock
'--- config port ---
Config Portb = &B00000000               '0=TX,1-6=none
Config Portd = &B00001111               '0=FSYNC,1=SCLK,2=SDATA,3=none
                                         '4=ENC B,5=ENC A,6=STEP,7=RIT
'--- port pullup ---
Portb = &B11111111                      'All
Portd = &B11110000                      'RIT,STEP,ENC A,ENC B
'--- debounce set ---
Config Debounce = 1
'---LCD port assign ---
Config Lcdpin = Pin , Db7 = Portc.0 , Db6 = Portc.1
Config Lcdpin = Pin , Db5 = Portc.2 , Db4 = Portc.3
Config Lcdpin = Pin , E = Portc.4 , Rs = Portc.5
Config Lcd = 16 * 2
'--- constant data ---
Const If_frq = 9999600                  'IF frequency
Const Lw_frq = 7000000                  'Lower limit operation frequency
Const Hi_frq = 7200000                  'Upper limit operation frequency
Const Def_frq = 7050000                 'Operation frequency(initial)
Const Lw_vfo = If_frq - Lw_frq          'VFO lower limit
Const Hi_vfo = If_frq - Hi_frq          'VFO upper limit
Const Def_vfo = If_frq - Def_frq        'VFO operation frequency(initial)
Const Enc_dir = -1                      '1:CW up count,-1:CW down count
Const Lw_rit = -10000                   'RIT lower limit
Const Hi_rit = 10000                    'RIT upper limit
Const Scal = 5.36870912                 '2^28/50000000 (X'tal 50.000Mhz)
'--- define subrutine ---
Declare Sub Enc_sub                     'Encorder
Declare Sub Dds_sub                     'DDS
Declare Sub Lcd_sub                     'LCD
Declare Sub Stp_sub                     'STEP
Declare Sub Rit_sub                     'RIT
Declare Sub Rx_sub                      'RX
Declare Sub Tx_sub                      'TX
'--- define memory ---
Dim Vfo_dat As Long                     'VFO freqency data
Dim Dds_dat As Long                     'DDS frequency data
Dim Str_frq As String * 10              'String frequency
Dim Dsp_frq As String * 10              'Display frequency
Dim Sng_wrk As Single                   'main channel
Dim Lng_wk1 As Long                     'Long work1
Dim Lng_wk2 As Long                     'Long work2
Dim Wrd_wk1 As Word                     'Word work1
Dim Wrd_wk2 As Word                     'Word work2
Dim Wrd_wk3 As Word                     'Word work3
Dim Enc_stp As Integer                  'Encorder step
Dim Rit_dat As Integer                  'RIT data
Dim Int_wrk As Integer                  'Integer work
Dim Flg_rit As Byte                     'RIT flag
Dim Flg_tx As Byte                      'TX flag
Dim Frq_eep As Eram Long                'power off frequency A
Dim Stp_eep As Eram Integer             'EEP STEP data
Dim Flg_enc As Byte                     'Encorder dir flag
'--------------
'Main roution
'--------------
Main:
   Flg_tx = 0
   Flg_rit = 0                          'RIT flag
   If Frq_eep =< 0 Then                 'EEP VFO data check
      Vfo_dat = Def_vfo                 'Initialize VFO data
      Frq_eep = Vfo_dat
      Else
         Vfo_dat = Frq_eep              'Restore VFO data
         End If
   If Stp_eep =< 0 Then                 'EEP STEP data check
      Enc_stp = 1000
      Stp_eep = Enc_stp                 'Initialize STEP data
      Else
         Enc_stp = Stp_eep
         End If                         'Restore STEP data
   Cursor Off
   Cls
   Call Lcd_sub                         'LCD
   Do
      If Flg_tx = 0 Then
         Debounce Pind.5 , 0 , Enc_sub , Sub       'Encorder
         Debounce Pind.6 , 0 , Stp_sub , Sub       'Step
         Debounce Pind.7 , 0 , Rit_sub , Sub       'RIT
         End If
         Debounce Pinb.0 , 1 , Rx_sub , Sub       'RX
         Debounce Pinb.0 , 0 , Tx_sub , Sub       'TX
         If Flg_rit = 1 Then
            Dds_dat = Vfo_dat - Rit_dat
            Else
               Dds_dat = Vfo_dat
               End If
         If Flg_tx = 1 Then
            Dds_dat = Vfo_dat
            End If
         Call Dds_sub
   Loop
End
'-----------------------------
'Encoder check,Create DDS data
'-----------------------------
Sub Enc_sub
   If Pind.4 = 1 Then
      Flg_enc = 0                       'Up
      Else
         Flg_enc = 1                    'down
         End If
   Int_wrk = Enc_stp * Enc_dir
   If Flg_enc = 0 Then
      Lng_wk1 = Vfo_dat + Int_wrk       'Up
      Lng_wk2 = Rit_dat + Enc_stp
      Else
         Lng_wk1 = Vfo_dat - Int_wrk    'down
         Lng_wk2 = Rit_dat - Enc_stp
         End If
   If Flg_rit = 1 Then
      Rit_dat = Lng_wk2
      Else
         Vfo_dat = Lng_wk1
         Rit_dat = 0
         End If
   If Vfo_dat > Lw_vfo Then             'VFO lower limit check
      Vfo_dat = Lw_vfo
      End If
   If Vfo_dat < Hi_vfo Then             'VFO upper limit check
      Vfo_dat = Hi_vfo
      End If
   If Rit_dat < Lw_rit Then             'RIT lower limit check
      Rit_dat = Lw_rit
      End If
   If Rit_dat > Hi_rit Then             'RIT upper limit check
      Rit_dat = Hi_rit
      End If
   Call Lcd_sub
End Sub
'-----------------------------
'AD9834(DDS) Data write
'-----------------------------
Sub Dds_sub
   Sng_wrk = Dds_dat * Scal
   Lng_wk1 = Sng_wrk
   Wrd_wk1 = Lng_wk1 And &H3FFF
   Wrd_wk2 = Wrd_wk1 Or &H4000
   Shift Lng_wk1 , Right , 14
   Wrd_wk3 = Lng_wk1 Or &H4000
   Wrd_wk1 = &H2000
   Reset Portd.2
   Shiftout Portd.0 , Portd.1 , Wrd_wk1 , 0
   Shiftout Portd.0 , Portd.1 , Wrd_wk2 , 0
   Shiftout Portd.0 , Portd.1 , Wrd_wk3 , 0
   Set Portd.2
End Sub
'-----------------------------
'LCD Data write
'-----------------------------
Sub Lcd_sub
   Locate 1 , 1
   Lng_wk1 = If_frq
   Lng_wk1 = If_frq - Vfo_dat
   Str_frq = Str(lng_wk1)
   Str_frq = Format(str_frq , "00.000000")
   Dsp_frq = Left(str_frq , 3) + Mid(str_frq , 4 , 3) + "." + Mid(str_frq , 7 , 3)
   Lcd "F:" ; Dsp_frq ; "Mhz"
   Locate 2 , 1
   Lcd "S:     "
   Locate 2 , 3
   Lcd Enc_stp
   If Flg_rit = 1 Then
      Locate 2 , 8
      Lcd "R:       "
      Str_frq = Str(rit_dat)
      Str_frq = Format(str_frq , "00.000")
      Locate 2 , 10
      Lcd Str_frq
      Else
         Locate 2 , 8
         Lcd "   JA2GQP"
         End If
End Sub
'-----------------------------
'Step
'-----------------------------
Sub Stp_sub
   Select Case Enc_stp
      Case 10000:
         Enc_stp = 1000                 '1000
      Case 1000:
         Enc_stp = 100                  '100
      Case 100:
         Enc_stp = 10                   '10
      Case 10:
         Enc_stp = 10000                '10000
      Case Else:
         Enc_stp = 1000                 '1000(initial)
   End Select
   Call Lcd_sub
End Sub
'-----------------------------
'RIT
'-----------------------------
Sub Rit_sub
   If Flg_rit = 0 Then
      Rit_dat = 0
      Flg_rit = 1
      Frq_eep = Vfo_dat                 'Save VFO data
      Stp_eep = Enc_stp                 'Save STEP data
      Else
         Flg_rit = 0
         End If
   Call Lcd_sub
End Sub
'-----------------------------
'RX
'-----------------------------
Sub Rx_sub
   If Flg_tx = 1 Then
      Flg_tx = 0                        'TX flag rest
      Locate 1 , 1
      Lcd "F"
      End If
End Sub
'-----------------------------
'TX
'-----------------------------
Sub Tx_sub
   If Flg_tx = 0 Then
      Flg_tx = 1                        'TX flag set
      Locate 1 , 1
      Lcd "T"
      End If
End Sub





 

6 件のコメント:

  1. こんにちは
    中華7MHzトランシーバーキットKN-Q7Aで使いたいと思います。(IF8.4672MHz)
    Const Lw_vfo = If_frq + Lw_frq
    Const Hi_vfo = If_frq + Hi_frq
    Const Def_vfo = If_frq + Def_frq
    ----------------------------------------------
    Lng_wk1 = Vfo_dat
    Lng_wk1 = Vfo_dat - If_frq
    適当に試してみましたがNG,
    勝手なお願いですがお教えいただければ助かります。
    JF1PTL

    返信削除
    返信
    1. JF1PTLさん
      VFOを上側にする例は、AD9850 DDS VFOを参考にすれば判ると思います。
      現在、AD9834のプログラム検証中ですので、しばらくお待ちください。

      削除
    2. ありがとうございます。
      Upper heterodyne を参考に挑戦してみます。
      JF1PTL

      削除
    3. AD9834用Upper heterodyneプログラムをUPしました。

      削除
  2. Hi Akio
    Very Interesting Work.
    Please help me with the final hex file
    Thanks in Advance
    73's
    Jc
    Wj6c ex/co6bg

    返信削除
    返信
    1. Hi Juan.
      Please download from here.
      Link in the blog screen right there. Or the https://sites.google.com/site/ja2gqp/
      File is AD9834 if-frq.hex

      削除