ADF4350 ボードをPICでコントーロールして局発に

中華通販サイトを見ていたら面白い高周波基板を発見

f:id:JP3MFK:20170429211949j:plain

おーお値段もお手頃。コントロール信号を与えるだけで任意の周波数を出力できそうで

数枚注文して、ほったらかしにしていました。

最近になって、クラブで運用している2.4GHzレピータの局発(1134MHz)

ノイズ不良の改修が来ましたので早速この基板を使おうとなったわけです。

 

 

f:id:JP3MFK:20170429213249g:plain

まず、どんなデータを入れたらいいのかなとDATAシート見てたら4バイト区切りの

レジスターが6個もあり、内容と目的周波数の設定にどう対応したらいいのか

わからず!!

と思ってたら、アナデバのサイトにそれらを支援してくれるソフトがあった!ので

早速インストール

f:id:JP3MFK:20170429213905g:plain

瞬時に、目的周波数に対しての6個のレジスタ入力値を表示してくれた。

出力の強さやなんかも設定できるようです。

ただ、

 

f:id:JP3MFK:20170429214623g:plain

PLL回路の設計でいつも苦労する位相比較から出る信号のLPFの定数をどうするかで

基板の回路図がない事やアナデバのソフトにそれらの値をセットする所が不明で

どうするか悩んでいたのですが、まーとりあえずPICでデータを入れてみようになり

 

 

f:id:JP3MFK:20170429215201g:plain

PIC12F683で制御するプログラムを書いてみました。

 

f:id:JP3MFK:20170430095137j:plain

あっさり

f:id:JP3MFK:20170429215520g:plain

発振しました

AR5000でFMモニターでは1133.99MHz ノイズも目立ったものがないので

CNもよく、この基板の位相比較のLPFとセットしたデータ値は問題なさそうです。

周波数のずれは基板にマウントされている基準25MHzの水晶の精度だと

思います。手持ちのTCXO12.8MHzでも交換してみようかと思います。

基準の周波数が変わってもアナデバのソフトで対応できますので問題ありません。

 

最後にCのソース貼っときます。下手なものかもしれませんが参考になればと思います 

(メインルーチンで同じことを2回やってますが1回ではダメだったです。 誰か理由を教えてください)

 



#include <stdio.h>
#include <stdlib.h>
#include <xc.h>
#include <pic.h>
#include <pic12f683.h>
/*
 *
 */
// CONFIG
#pragma config FOSC = INTOSCIO  // Oscillator Selection bits (INTOSCIO oscillator: I/O function on RA4/OSC2/CLKOUT pin, I/O function on RA5/OSC1/CLKIN)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = ON       // Power-up Timer Enable bit (PWRT enabled)
#pragma config MCLRE = OFF      // MCLR Pin Function Select bit (MCLR pin function is digital input, MCLR internally tied to VDD)
#pragma config CP = OFF         // Code Protection bit (Program memory code protection is disabled)
#pragma config CPD = OFF        // Data Code Protection bit (Data memory code protection is disabled)
#pragma config BOREN = ON       // Brown Out Detect (BOR enabled)
#pragma config IESO = ON        // Internal External Switchover bit (Internal External Switchover mode is enabled)
#pragma config FCMEN = ON       // Fail-Safe Clock Monitor Enabled bit (Fail-Safe Clock Monitor is enabled)
// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.


#define _XTAL_FREQ  8000000                                //  __delay用  8MHz
#define __delay_us(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000000.0)))      //  __delay用
#define __delay_ms(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000.0)))      //  __delay用
#define  LEpin          GP0  //out
#define  DATApin        GP1 //out
#define  CLKpin         GP2 //out
#define                 GP3 //out
#define                 GP5 //out


void init(){
 OPTION_REG = 0b00001111;
 OSCCON = 0b1110000; // 内蔵OSC 8MHz
 ANSEL = 0b00000000; // デジタル
 TRISIO = 0b000000;   //IO方向設定
 GPIO = 0b00000000;  // 0b00000000 = 0
 WPU = 0b00000000;  // プルアップなし
 TMR0 = 0x00;
 T0IE = 0;     // TMR0割り込み許可は=1 割り込み無し

}

void Delay_mS(unsigned int num){
     int i ;
     // で指定した回数だけ繰り返す
     for (i=0 ; i < num ; i++) {
          __delay_ms(1) ;     // 1msプログラムの一時停止
     }
}
void Delay_uS(unsigned int num){
     int i ;
     // で指定した回数だけ繰り返す
     for (i=0 ; i < num ; i++) {
          __delay_us(1) ;     // 1msプログラムの一時停止
     }
}





void data1(){
    GPIO = GPIO | 0b00000010;
    Delay_uS(1);
    GPIO = GPIO | 0b00000110;
    Delay_uS(1);
    GPIO = GPIO & 0b11111001;
    Delay_uS(1);     
}
void data0(){
    GPIO = GPIO | 0b00000000;
    Delay_uS(1);
    GPIO = GPIO | 0b00000100;
    Delay_uS(1);
    GPIO = GPIO & 0b11111001;
    Delay_uS(1);  
}
void LE(){
    Delay_uS(10);  
    GPIO = GPIO | 0b00000001;
    Delay_uS(1);   
    GPIO = GPIO & 0b11111110;
    Delay_uS(10);
    
}




int set32(unsigned long PLLdata){
    unsigned long j=0;


    for( char a = 0; a<32; ){
       
     j = PLLdata & 0x80000000;        
         
         if(j == 0x80000000) {
            data1();
            }
        else{
            data0();
            }
     PLLdata = PLLdata <<1;
     a++;      
    }

   LE();
    
 }

void main() {
    init();
    
    set32(0x02D0090);    //R0
    set32(0x80080C9);    //R1           
    set32(0x0004E42);    //R2
    set32(0x00004B3);    //R3
    set32(0x09C803C);    //R4
    set32(0x0580005);    //R5
 
    set32(0x02D0090);    //R0
    set32(0x80080C9);    //R1           
    set32(0x0004E42);    //R2
    set32(0x00004B3);    //R3
    set32(0x09C803C);    //R4
    set32(0x0580005);    //R5
                       
    while(1){
                                                         //halt
    }

}