TC9256Pでエアバンド受信機の製作

[公開:any]

[電子工作/PIC]
[電子工作/ラジオの製作]
[PIC18F,PIC18F14K50,TC9256P,PLL,航空無線,エアバンド,LMF501T,TA7358P,TA7368P]

origin 2010-03-02


ACARSの受信と、このエアバンド受信機の問題点を末尾に追記しました。(2010-03-08)


 「PIC18FでPLL-IC(TC9256P)の制御」でPIC18F14K50を使用してTC9256Pの制御ができるようになったので実際になにか作りたい・・・・・。AVRとTC9256PでFMラジオはすでに製作しているので、今回は航空無線受信機(エアバンドラジオ)を製作します。

 PLLを使用したエアバンド受信機も「PLL-VFOを使ったエアバンド受信機の製作」で作りましたが、VCO部分に難があってノイズの多い受信機となりました。今回は、ノイズの少ないものを目指します。・・・とはいっても具体的な対策は思い浮かびませんが・・・。
 前回の受信機は、局部発振回路を別回路で作成したのですが、これがあまり良くなかったかもしれません。局発の「質」が悪かったのではないかと・・・。今回はTA7358Pの局部発振回路をそのまま使用します。これが良いかどうか解りませんが多くの方がこれで問題なく製作されています。ただ、FMラジオのフロントエンド用のICをAMでしかもかなり高い周波数で使用するので規格外であることは間違いありません。

 TA7358Pの局部発振回路は、144MHz帯のFCZコイルを使用すると発振範囲があまり広くとれません。(ベタアース基板の実験では、最大でも12MHz程度) そこで、トロイダルコアを使ったコイルを使用して広い範囲の発振を確保しました。今回の回路では、118MHz〜143MHzとしてエアバンドの全てをカバーできました。

 回路図です。IF以降にLA1600を使用したダブルスーパーにするか迷ったのですが、書籍の付属基板で作成した「エアバンド受信機の製作」と同じようにIF周波数を低い周波数として、中波のストレートラジオICのLMF501Tを使用したIF増幅と検波回路としました。

TC9256エアバンド受信機回路図

 部品の実装図をPCBEで作成しました。基板は、PIC18FやTC9256PのPLL制御部分と高周波部以降との2枚とします。RF以降の高周波部分は、サンハヤトの高周波対応メッシュ基板を使用します。PLL制御部分は普通のユニバーサル基板として電源回路も同じ基板に実装します。


 高周波基板を最初に作成しました。TA7358Pの入力には同調回路を設けませんでしたが、混信等の影響を受けるようであれば、後から設けられるようにスペースは確保しました。
 LMF501Tに必要な電源1.5Vは、赤色LEDの順方向降下電圧(VF)を利用して作ります。このLEDは赤色じゃないと電圧が高くなる可能性があります。また、赤色でも高輝度タイプのものは電圧が高くなるので不可です。


 以前の実験のままになっていた、ブレッドボード上のPLL制御部分と接続して動作テストしてみました。PLLの動作自体は安定してますが、アンテナを接続しない状態では、受信音にノイズが多く混じります。おそらくブレッドボードの回路からのノイズと思われます。SGからAM変調した信号を入力して受信周波数の範囲や受信感度に問題ないことを確認しました。


 PLL制御回路も作成しました。FMラジオのものとほぼ同じです。AVRがPICに代わっただけです。


 基板同士を接続してバラックで受信確認します。動作は安定してます。・・が受信音のノイズは多少は少なくなりましたが、まだ聞こえます。高周波基板のボディエフェクトでノイズが変化するので、ケースに入れれば解決すると判断しました。


 ケースに組み込みました。ケースはタカチのYM-200を使用しました。必要に応じてプリアンプを内蔵できるように基板のスペースも確保しておきます。高周波基板は、金属製の基板スペーサを使用してケースアースします。

TC9256Pエアバンド受信機ケース内部

 ケースに入れるとアンテナ未接続時のノイズは、まったくなくなりました。SGからの信号を受信すると非常にクリアーな受信音です。次に室内アンテナを接続してみると、弱い変なノイズが聞こえます。パソコンのマウスを動かしたりするとノイズが変化するのでパソコンのノイズを拾っているようです。屋外アンテナではノイズの影響はありません。

TC9256Pエアバンド受信機ケース外観

 通常は、屋内アンテナで使用する予定なので、TA7358Pの入力に同調回路を追加するか、同調回路をもったプリアンプを増設するか時間を作って対処したいと思います。
 IFを2MHz程度と低くしたのでイメージ混信も気になります。SGからの信号を受信するとIF周波数の2倍離れた所でも受信できます。TA7358Pの高周波同調回路のQが低いことも原因かと思います。空芯コイルなどを使用して回路のQを稼げば良いのかもしれません。ただ、実際のエアバンド受信で問題になることはないと思います。

空芯コイル、FCZコイルを使った高周波同調回路を試しましたが、トロイダルコアを使用したものと大きな違いはありませんでした。(2010-03-13)


 ソースプログラムです。IF周波数は、1.9MHz用のFCZコイルと推奨コンデンサを使用して1.9MHz付近を狙ったのですが、実際は、2.17MHzとなりました。ソースプログラムの中でOFFSETとして定義してあります。周波数の可変ステップは、1KHzと100KHzの切り替えとしました。EEPROMを使用した周波数のメモリも20チャンネル確保しました。
 メモリの機能としては、

  • メモリスイッチでメモリモードとVFOモードのトグル切り替え
  • メモリモードでは、ロータリーエンコーダでメモリチャンネルを変更
  • メモリノード時に、メモリスイッチ長押しでメモリ周波数をVFOへ読み出し
  • VFOモード時に、メモリスイッチ長押しでCh**で表示中のメモリに書き込み

となっています。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
/**************************************************************
    PIC18F & TC9256P PLL air-band Radio

        PLL device : TC9256P (Toshiba Co.)
            7.200MHz(Xtal) / 720(preset prescaler) = 10KHz(minimam step) 
        PIC: PIC18F14K50
            16MHz Internal Clock Oscillator

    2010/02/28  www.henteko.org
***************************************************************/
#include <p18f14k50.h>
#include <delays.h>
#include <stdio.h>
#include <EEP.h>
#include "lcd.h"

#pragma config FOSC = IRC
#pragma config WDTEN = OFF
#pragma config FCMEN = OFF
#pragma config PWRTEN = ON
#pragma config BOREN = ON
#pragma config BORV = 30
#pragma config LVP = OFF
#pragma config MCLRE = OFF
#pragma config HFOFST = ON

#define PLL_LE        LATCbits.LATC3    // TC9256P clock
#define PLL_CLOCK    LATAbits.LATA4    // TC9256P data
#define PLL_DATA        LATAbits.LATA5    // TC9256P le
#define STEP_LED        LATCbits.LATC2    // frequency step
#define EEPROM        0x0000            // EEPROM address
#define OFFSET        217                // IF frequency 2.17MHz
#define MAX_FREQ    14300 - OFFSET    // VCO max frequency
#define MIN_FREQ        11800 - OFFSET    // VCO min frequency
#define DEF_FREQ        12500 - OFFSET
unsigned char tmp[10];                // lcd output srting
unsigned int pcd;                    // frequency
unsigned int diff;                    // frequency step
unsigned char renc_now, renc_old;    // value of rotary encoder
unsigned int mem;                    // memory channel
unsigned char mode;                    // 1:memory mode 0:VFO mode

/***************************************************************
    ms step delay (This is doubtful. ^^;)
***************************************************************/
void delay_ms(unsigned int t)
{
    for(; t > 0; t--)        // 16MHz clock
        Delay1KTCYx(4);        // 1ms: 0.001 / ((1 / (16000000 / 4)) * 1000) = 4 
}

/***************************************************************
    TC9256P serial control (LSB first)
***************************************************************/
void pll_dataset(unsigned long data, unsigned int bt)
{
    unsigned int i;
    unsigned int p;

    PLL_LE = 0;

    for(i = 0; i < bt ; i++) {
        p = (data >> i) & 0x00000001;
        if(p % 2)
            PLL_DATA = 1;
        else
            PLL_DATA = 0;
        Delay10TCYx(1);
        PLL_CLOCK = 0;
        Delay10TCYx(1);
        PLL_CLOCK = 1;    
        Delay10TCYx(1);
        if(i == 2)
            PLL_LE = 1;
    }
    Delay10TCYx(1);
    PLL_LE = 0;
    Delay10TCYx(1);
    PLL_LE = 1;
}

/***************************************************************
    EEPROM write
***************************************************************/
void eeprom_write(unsigned int adr, unsigned int data)
{
    unsigned char i;

     for(i = 0; i < 2; i++) {
        Write_b_eep(EEPROM + adr * 2 + i, (unsigned char)((data >> i * 8) & 0x00ff));
        Busy_eep();
    }
}

/***************************************************************
    EEPROM read
***************************************************************/
unsigned int eeprom_read(unsigned int adr)
{
    unsigned int d;

    d = Read_b_eep(EEPROM + adr * 2 + 1);
    return (d << 8)+ Read_b_eep(EEPROM + adr * 2);
}

/***************************************************************
    interrupt
***************************************************************/
#pragma interrupt isr
#pragma code isrcode = 0x8
void isr_direct(void)
{
    _asm
    goto isr
    _endasm
}
#pragma code
void isr(void)
{
    if(INTCONbits.RABIF) {
        if(PORTBbits.RB6 == 1){
            if(PORTBbits.RB5 == 0)
                renc_now = 0;
            else 
                renc_now = 1;
        } else {
            if(PORTBbits.RB5 == 1)
                renc_now = 2;
            else
                renc_now = 3;
        }

        if((renc_now + 3 + 1) % 3 == renc_old) {
            if(mode == 0) {
                if(pcd > MIN_FREQ) {
                    pcd -= diff;
                }
            } else {
                if(mem > 0)
                    mem -= 1;
            }
        }
        if((renc_now + 3 - 1) % 3 == renc_old) {
            if(mode == 0) {
                if(pcd < MAX_FREQ) {
                    pcd += diff;
                }
            } else {
                if(mem < 20)
                    mem += 1;
            }
        }
        renc_old = renc_now; 
        if(mode == 1) {
            pcd = eeprom_read(mem);
            if(pcd > MAX_FREQ || pcd < MIN_FREQ)
                pcd = DEF_FREQ;
        }
        INTCONbits.RABIF = 0;
        pll_dataset(0xd0 + ((unsigned long)pcd<<8) + ((unsigned long)0x9a<<24), 32);
    }    
}

/***************************************************************
    main
***************************************************************/
void main(void)
{
    unsigned char sw0_state, sw1_state;
    unsigned int freq, ftmp;
    unsigned int tim;

    OSCCON = 0b01111111;

    TRISA = 0b00000000;        // RA4,5 TC9256P serial control
    TRISB = 0b11110000;        // RB4,7 sw input RB5,6 rotary encoder input
    TRISC = 0b00000000;        // LCD and RC2 frequency step status led
    ADCON0bits.ADON = 0;    // ad converter off
    ANSELHbits.ANS10 = 0;    // RB4 digital input
    ANSELHbits.ANS11 = 0;    // RB5 digital input
    INTCONbits.RABIE = 1;    // PortA,B pin change interrupt enable
    INTCON2bits.RABPU = 0;    // PortA,B pull-up enable
    INTCON2bits.RABIP = 0;    // PortA,B interruput priority low
    WPUB = 0b11110000;        // RB4-7 pull-up
    IOCBbits.IOCB5 = 1;        // RB5 pin change interrupt enable
    IOCBbits.IOCB6 = 1;        // RB6 pin change interrupt enable
    INTCONbits.GIE = 1;        // general interrupt enable
    
    lcd_init();
    lcd_cls();

    sw0_state = sw1_state = 0;
    mode = 0;
    mem = 0;
    pcd = DEF_FREQ;
    diff = 1;
    STEP_LED = 0;
    pll_dataset(0xd0 + ((unsigned long)pcd<<8) + ((unsigned long)0x9a<<24), 32);

    while(1){
        if(PORTBbits.RB4 == 0) {
            sw0_state = 1;
            delay_ms(10);
            tim++;
        }
        if(sw0_state && PORTBbits.RB4 == 1) {
            sw0_state = 0;
            tim = 0;
            if(mode == 0) {
                mode = 1;
                ftmp = pcd;
                pcd = eeprom_read(mem);
                if(pcd > MAX_FREQ || pcd < MIN_FREQ)
                    pcd = DEF_FREQ;
            } else {
                mode = 0;
                pcd = ftmp;
            }
            pll_dataset(0xd0 + ((unsigned long)pcd<<8) + ((unsigned long)0x9a<<24), 32);
        }
        if(tim > 10) {
            sw0_state = 0;
            tim = 0;
            if(mode == 0) {
                eeprom_write(mem, pcd);
                sprintf(tmp, "VFO->MEM");
            } else {
                pcd = eeprom_read(mem);
                if(pcd > MAX_FREQ || pcd < MIN_FREQ)
                    pcd = DEF_FREQ;
                sprintf(tmp, "MEM->VFO");
                mode = 0;
            }
            lcd_gotopos(0, 1);
            lcd_putstr(tmp);
            pll_dataset(0xd0 + ((unsigned long)pcd<<8) + ((unsigned long)0x9a<<24), 32);
            while(PORTBbits.RB4 == 0);
        }
        if(PORTBbits.RB7== 0) {
            sw1_state = 1;
            delay_ms(10);
        }
        if(sw1_state && PORTBbits.RB7 == 1) {
            sw1_state = 0;
            if(diff == 1) {
                diff = 10;
                STEP_LED = 1;
            } else {
                diff = 1;
                STEP_LED = 0;
            }
        }
        
        lcd_gotopos(0, 1);
        if(mode == 0)
            sprintf(tmp, "VFO Ch%02d", mem);
        else
            sprintf(tmp, "MEM Ch%02d", mem);
        lcd_putstr(tmp);

        freq = (pcd + OFFSET)* 0.01;
        if(diff == 1)
            sprintf(tmp, " %d.%02d0", freq, (int)((pcd + OFFSET) - (freq * 100)));
        else
            sprintf(tmp, "*%d.%02d0", freq, (int)((pcd + OFFSET) - (freq * 100)));
        lcd_gotopos(0, 0);
        lcd_putstr(tmp);
    }
}

ACARSの受信


 新しいエアバンド受信機とKG-ACARSを使用してACARSを受信してみました。KG-ACARSの受信テキスト表示で見ている限り、ほぼ100%のデコード率です。以前の受信テストでは、受信音の歪みなどでデコードできない通信が結構あったのですが、大きく改善されました。


画像には一部ボカシ加工してあります。


 ただ、問題点も見つかりました。中間周波数が2.17MHzと低いためイメージ混信が受信周波数によってはまれに発生します。ACARSの131.25MHzを受信しているとイメージ周波数の126.91MHz付近のカンパニー無線か空港無線と思われる音声通信が混入します。ほかにもイメージ混信を受ける周波数があると思われます。
 また、選択度も良くありません。ACARSの受信音など、上下100KHzに渡って聞こえます。管制系の通信などは周波数間隔が広いので影響は無いですが、場所(空港の近く)によっては、空港無線等の混信が発生する可能性もあります。
 さらに、AGCの効きが今ひとつです。LMF501T内蔵のAGCはスペックで30dBとなっています。これではエアバンドには不足です。ディスクリートではないので、トータル100dBとはいきませんが、もう少しなんとかしたいものです。

 通常の受信は非常に良好です。また、空ノイズが非常に少ないためつけっぱなしでも耳障りなノイズが気になりません。感度もそこそこ良いようで、プリアンプ内蔵のものと比べて大きく劣ることはありません。


▲ページ Top へ...