ADF4350 ボードをPICでコントーロールして局発に
中華通販サイトを見ていたら面白い高周波基板を発見
おーお値段もお手頃。コントロール信号を与えるだけで任意の周波数を出力できそうで
数枚注文して、ほったらかしにしていました。
最近になって、クラブで運用している2.4GHzレピータの局発(1134MHz)
ノイズ不良の改修が来ましたので早速この基板を使おうとなったわけです。
まず、どんなデータを入れたらいいのかなとDATAシート見てたら4バイト区切りの
レジスターが6個もあり、内容と目的周波数の設定にどう対応したらいいのか
わからず!!
と思ってたら、アナデバのサイトにそれらを支援してくれるソフトがあった!ので
早速インストール
瞬時に、目的周波数に対しての6個のレジスタ入力値を表示してくれた。
出力の強さやなんかも設定できるようです。
ただ、
PLL回路の設計でいつも苦労する位相比較から出る信号のLPFの定数をどうするかで
基板の回路図がない事やアナデバのソフトにそれらの値をセットする所が不明で
どうするか悩んでいたのですが、まーとりあえずPICでデータを入れてみようになり
PIC12F683で制御するプログラムを書いてみました。
あっさり
発振しました
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
}
}