QN8027使用 FM Transmitterの製作

0.お約束

念のため。確認ください。

 

shiro46tan.hatenablog.com

 

1.回路


以下で動作したので、これでよしとする。

f:id:shiro46tan:20210221121311j:plain

回路図

2.製作

・QN8027のピッチは0.5mmピッチなので、変換基盤を使う。
 変換基盤への半田付けは、フラックス塗でべた付け後、フラックスを吸わせた半田吸い取り線で余分な半田を除去した(トラ技式)。
・0.12uHのコイルは、エイヤでφ8のドリルに10回巻。
・LEDは動作チェック用。省略可。
・回路上にはICPSのコネクタを書いたが、現物では省略した。

写真:製作した基盤。一部1uFのチップコンを使ったため、すべての部品は見えない。

f:id:shiro46tan:20210221121404j:plain

電源は、本機の移動が不要なことから、スマホ用の5V電源を利用した。

 

3.ソフト


・周波数は88.6MHzとした。
 88.6=76+0.05*252 なので、レジスタ値は0xFCとする。
・無音後約58秒で電源を切れるようにした。
・I2C通信の前の100msウェイトは必須。無いと不安定になったり、データの書き込みができなかったりする。
・WatchDock TimerをOffにしないと、途中で突然リセットがかかることがある。

 

4.動作確認


・PIC16F1503にプログラムが正常に書き込まれていれば、LEDが0.5秒程度光った後消える
・5V電源を使った場合の電流は13mA、無音1分後(電波発射なし)の時で5mA程度。

 

5.注意


電波法に違反せぬよう利用のこと。

 

6.プログラム


XC8 V1.34用。

 

/*
* transmit.C
* By Shiro_46
* 2021.2
*/
// --PIC16F1503--
// SDA : PORTC(1) pin 9  I2Cで使う場合は入力にすること
// SCL : PORTC(0) pin10  I2Cで使う場合は入力にすること
// 他IOは、RA0~5、RC2~5
// 4MHz

#include <xc.h>

#define _XTAL_FREQ 4000000
#define PL PORTCbits.RC4 //チェック用LED


//************* Config ***********************************
#pragma config FOSC = INTOSC, WDTE = OFF, PWRTE = OFF, MCLRE = OFF, CP = ON
// Watch Dog timer をOffにしないと、途中でリセットがかかる可能性あり
#pragma config BOREN = ON, CLKOUTEN = OFF
#pragma config WRT = OFF
#pragma config STVREN = ON, BORV = LO, LPBOR = OFF, LVP = OFF

//********************************************************
void i2cStart(void); // Start Condition
void i2cStop(void); //Stop Condition
void i2cTxData(char); // i2c 8Bitデータ送信

void QN8027Send(unsigned char,unsigned char);
void Init(void);

 

//////////// Main //////////////////////////////////
void main(void){

OSCCON = 0b01101000; // CLOCK 4Mhz
ANSELA = 0x0; // PortAをすべてデジタルにする
ANSELC = 0x0; // PortCをすべてデジタルにする
TRISC = 0b11000011; // RC0,1が入力(2~5は出力)
TRISA = 0b00000000; // RAはすべて出力
SSPCON1 = 0x28; // I2Cマスターとする
SSPSTAT = 0x00; // I2Cバスをオープンにする
SSPADD = 0x09; // I2C Clock 100KHz for 4MHz

__delay_ms(100); //送信の前にWaitを入れること。入れないと不安定になる。

PL=0; //LED消灯

Init();


SLEEP();
}

 


void Init(void){

PL=1;
QN8027Send(0x00,0x80); //reset to default
QN8027Send(0x01,0xfc); //Freq=88.6MHz F=76+0.05*0xFC
QN8027Send(0x02,0x09); //PreEmphasis50 etc 0x09にすると、58秒無音でOffになる 0x39ならOnのまま
QN8027Send(0x04,0xd9); //RegVga Xtal=24MHz Input Gain 12dB Z=10k
QN8027Send(0x10,45); //TXPow Setting

 

QN8027Send(0x00,0x20); //Transmit On

__delay_ms(500);
PL=0;

}

// QN8027 のアドレスにデータを送る
// アドレス、データを渡す
//QN8027 のデバイスIDは0x2C
void QN8027Send(unsigned char reg,unsigned char data){

i2cStart(); //i2c Start
//QN8027のデバイスID 0X2C+PICからの送信(0)=0x58
i2cTxData(0x58); //
i2cTxData(reg); // レジスタ番号の送信
i2cTxData(data); // データの送信

i2cStop(); //i2c Stop
}

void i2cStart(void){
SEN = 1; // Start condition 送信
while(SEN); // Start condition 終了待ち
}

void i2cStop(void){ //i2c STOP
SSP1IF = 0; // 終わり
PEN = 1; // Stop condition 送信
while(PEN); // Stop condition 終了待ち
}

//-------- SSPBUFに1文字保存し送信終了を待つ -----------------
void i2cTxData(char data){
SSP1IF = 0; // 終了フラグクリア
SSPBUF = data; // データセット
while(!SSP1IF); // 送信終了待ち
}