前回に引き続き、ラジオ調整用テストオッシレータを作ってみる。
大まかな仕様は以下
・出力周波数は以下の周波数をSWを押すごとに切り替える。LCDにその時の周波数を表示
455KHz、522KHz、600KHz、1000KHz、1400KHz、1620KHz
・変調率は30~50%になるように実機で調整してみる
暫定回路はこちら
![](https://stat.ameba.jp/user_images/20240510/17/2110pu/3d/47/j/o1068080115436943788.jpg?caw=800)
下準備で、NJM2594は面実装部品なので、変換基板に実装する。
はんだ付けが上手くいかず、熱を加えすぎてしまった。大丈夫だろうか・・・
![](https://stat.ameba.jp/user_images/20240521/15/2110pu/8d/a0/j/o0400031515441582248.jpg?caw=800)
次にSeeeduino XIAOのDACから約600Hzのサイン波を出力させてみる。
テストスケッチはこちら↓
int sindata[24];
int sincnt;
#include <TimerTC3.h>
void setup() {
pinMode(0, OUTPUT);
//sin波形作成
for (int n=0; n < 24; n++) {
sindata[n] = (sin(n*0.26)+1)*127;
}
sincnt = 0;
TimerTc3.initialize(69); //69usタイマー
TimerTc3.attachInterrupt(SINOUT) ; //割り込み関数を指定
}
// callback function
void SINOUT(){
analogWrite(0,sindata[sincnt]);
sincnt++;
if (sincnt == 24){
sincnt=0;
}
}
void loop() {
}
以前にも試したことが有るので、狙い通りの波形が出た。
波形はギザギザだがRCで鈍らせれば、ましな波形になるぢゃろう。
![](https://stat.ameba.jp/user_images/20240521/10/2110pu/11/1b/j/o0800048015441491349.jpg?caw=800)
こちらのページ↓に有るように、信号波形はP-Pで200mVくらいが適当なようだ
抵抗分圧して200mVあたりになるように変更
あと、AD9833の出力が、最大0.65V、最小は0.038Vであることに気が付いた。
(p-pで約0.61V)
搬送波でp-pで100mVくらいとすると1/6くらいに分圧しておく必要がありそうだ
これと併せて、回路を変更する。
<暫定回路図その2>
次にAD9833を使って狙った周波数を出力するスケッチを書く。
めんどくさいので、ChatGPTにお願いしてみる
-----------------------------------------------------------------
<お願い>
AD9833を使って455KHzを出力するarduinoのスケッチを書いて
<回答>
AD9833を使用して455kHzの信号を出力するArduinoのスケッチを以下に示します。このスケッチでは、SPI通信を使用してAD9833を制御します。AD9833はシリアルインターフェースを介して設定され、特定の周波数を出力するようにプログラムできます。
まず、必要なライブラリをインストールします。AD9833
ライブラリを使用します。Arduino IDEでライブラリをインストールするには、ライブラリマネージャーを使用して「AD9833」で検索し、インストールしてください。
以下は、AD9833を使用して455kHzの信号を出力するArduinoのスケッチです。
#include SPI.h;
#include AD9833.h;
// AD9833のピン接続
#define FSYNC_PIN 10 // FSYNCピンをArduinoのデジタル10ピンに接続
#define SCK_PIN 13 // SCKピンをArduinoのデジタル13ピンに接続
#define MOSI_PIN 11 // MOSIピンをArduinoのデジタル11ピンに接続
AD9833 ad9833(FSYNC_PIN);
void setup() {
// SPI通信の初期化
SPI.begin();
// AD9833の初期化
ad9833.begin();
// 455kHzの出力設定
ad9833.setFrequency(AD9833::CHAN_0, 455000);
ad9833.setWaveType(AD9833::CHAN_0, AD9833::SINE_WAVE);
}
void loop() {
// メインループでは特に処理なし
}
void loop() {
}
このスケッチでは、AD9833
ライブラリを使用してAD9833を初期化し、455kHzの正弦波信号を出力するように設定しています。
-----------------------------------------------------------------------
にゃるほど。
まずはAD9833ライブラリをインストールする。ライブラリマネージャーから簡単に出来る。
インストールが完了したので、試しにChatGPTの書いたコードをコンパイルしてみる。
すると、「こんなの知らない」的なエラーが出る。
また、ChatGPTに嘘のコードをつかまされたようだ。
仕方がないので、ライブラリのサンプルコード等をざっくり確認して書き直すとエラーが出なくなった↓
#include <SPI.h>
#include <AD9833.h>
// AD9833のピン接続
#define FSYNC_PIN 10 // FSYNCピンをArduinoのデジタル10ピンに接続
#define SCK_PIN 13 // SCKピンをArduinoのデジタル13ピンに接続
#define MOSI_PIN 11 // MOSIピンをArduinoのデジタル11ピンに接続
AD9833 ad9833(FSYNC_PIN);
void setup() {
// SPI通信の初期化
SPI.begin();
// AD9833の初期化
ad9833.begin();
// 455kHzの出力設定
ad9833.setFrequency(455000, 0);
ad9833.setWave(AD9833_SINE);
}
void loop() {
// メインループでは特に処理なし
}
まだAD9833が届いてないから試せないけど、一旦全体のコードを書いて動かしてみる。
#include <SPI.h>
#include <AD9833.h>
#include <TimerTC3.h>
#include <Wire.h>
#include <I2CLiquidCrystal.h>
// AD9833のピン接続
#define FSYNC_PIN 7 // FSYNCピンをデジタル7ピンに接続
#define SCK_PIN 8 // SCKピンをデジタル8ピンに接続
#define MOSI_PIN 10 // MOSIピンをデジタル10ピンに接続
#define SW_PUSH 6 // Push sw
int sindata[24];
int sincnt;
int freq_no = 0;
bool PSW = false;
// LCD
I2CLiquidCrystal lcd(30, false); //3.3V
//AD9833
AD9833 ad9833(FSYNC_PIN);
//-----------------------------------
void setup() {
pinMode(0, OUTPUT); //DAC
pinMode(SW_PUSH, INPUT_PULLUP); //SW
pinMode(FSYNC_PIN, OUTPUT);
digitalWrite(FSYNC_PIN, HIGH);
Wire.begin();
lcd.begin(8, 2); //LCD
SPI.begin(); // SPI通信の初期化
ad9833.begin(); // AD9833の初期化
// 初期値 455kHzの出力設定
ad9833.setFrequency(test_freq[freq_no], 0);
ad9833.setWave(AD9833_SINE);
lcd.setCursor(0, 0);
lcd.print(test_freq[freq_no]/1000);
lcd.print("KHz");
//sin波形データ作成
for (int n=0; n < 24; n++) {
sindata[n] = (sin(n*0.26)+1)*127;
}
sincnt = 0;
//Timer set
TimerTc3.initialize(69); //69usタイマー
TimerTc3.attachInterrupt(SINOUT) ; //割り込み関数を指定
}
//-------------------------------
// callback function
// sin波形出力
void SINOUT(){
analogWrite(0,sindata[sincnt]);
sincnt++;
if (sincnt == 24){
sincnt=0;
}
}
//
//-------------------------------
void loop() {
push_sw_check();
if (PSW == true){
freq_no +=1;
if (freq_no > 4){
freq_no = 0;
}
ad9833.setFrequency(test_freq[freq_no], 0);
ad9833.setWave(AD9833_SINE);
lcd.setCursor(0, 0);
lcd.print(" ");
lcd.setCursor(0, 0);
lcd.print(test_freq[freq_no]/1000);
lcd.print("KHz");
}
delay(200);
// wait for Push SW off
while (PSW == true){
push_sw_check();
delay (50);
}
}
//-------------------------------
void push_sw_check(){
PSW = false;
if (digitalRead(SW_PUSH) == LOW){
delay(50);
if (digitalRead(SW_PUSH) == LOW){ // double check
PSW = true;
}
}
}
むむむ、LCDが表示しない。
よく見たらI2Cにプルアップが無かった・・・・orz 自分のうっかり加減に嫌になる。
I2Cラインに10Kのプルアップを付けると、ちゃんと表示できるようになった。
回路図も修正しておく
<暫定回路図>
![](https://stat.ameba.jp/user_images/20240521/15/2110pu/dc/5f/j/o1117080415441585529.jpg?caw=800)
後はAD9833モジュール↓が届くのを待つだけ
![](https://stat.ameba.jp/user_images/20240510/10/2110pu/91/c7/j/o0648029215436810034.jpg?caw=800)
中国から輸送するので時間がかかっているようだ。
(トラッキングIDで追跡すると成田には着いたらしい)
「焦らず寝て待つのニャ」
![](https://stat.ameba.jp/user_images/20240521/15/2110pu/51/a3/j/o0410028215441586255.jpg?caw=800)