ArduinoでAGCが可能か検討⑨
- 2016/12/18
- 15:18
これまで、PINダイオードを直列に入れて使ってきましたが、並列に入れる方法を知りましたので試してみました。
参考にさせて頂いたサイト
これまでの直列に入れる方法(PINに流す電流を減少させ抵抗値を上げ、直列に挿入したATT値を上げ信号を減衰させる)

今回試した並列に入れる方法(PINに流す電流を増加させ抵抗値を下げ、信号をグランドに落として減衰させる)

これまで試してきた直列に入れる方法は、ATTを最大にしようとすると、DACの電圧を下げなければならず、VF以下になってしまい、具合が悪かったです。
今回の回路の場合、ATTを最大値にする場合、DACの電圧を最大にします、したがって、VFによる影響がないです。
強い信号の際に、PINに多めの電流を流せばよいので、マイコンではなくディスクリートで作る際にもマイナス電圧を作る必要もなく扱いやすそうです。
基板は新たに作り直しました。ソケットで抵抗やPINダイオードを変更できるようにしました。

結果は、とても良好で、直列に入れる方法と違い、動きもスムーズです。
ただ、CWはどうやっても難しいですね。 頭の部分にATTをかけるのは間に合わないので、聞きにくいですね。
それと、もう少しガッツり減衰して欲しいところです。
フィーリングが良くなるように調整してみようと思います。
最新プログラム(SRN-02_SSB_201612120-001)
参考にさせて頂いたサイト
これまでの直列に入れる方法(PINに流す電流を減少させ抵抗値を上げ、直列に挿入したATT値を上げ信号を減衰させる)

今回試した並列に入れる方法(PINに流す電流を増加させ抵抗値を下げ、信号をグランドに落として減衰させる)

これまで試してきた直列に入れる方法は、ATTを最大にしようとすると、DACの電圧を下げなければならず、VF以下になってしまい、具合が悪かったです。
今回の回路の場合、ATTを最大値にする場合、DACの電圧を最大にします、したがって、VFによる影響がないです。
強い信号の際に、PINに多めの電流を流せばよいので、マイコンではなくディスクリートで作る際にもマイナス電圧を作る必要もなく扱いやすそうです。
基板は新たに作り直しました。ソケットで抵抗やPINダイオードを変更できるようにしました。

結果は、とても良好で、直列に入れる方法と違い、動きもスムーズです。
ただ、CWはどうやっても難しいですね。 頭の部分にATTをかけるのは間に合わないので、聞きにくいですね。
それと、もう少しガッツり減衰して欲しいところです。
フィーリングが良くなるように調整してみようと思います。
最新プログラム(SRN-02_SSB_201612120-001)
/*自作機2号機用コントロールプログラムJQ1SRN本プログラムの多くはネットで見つけた情報を参考にしております。コードの最適化などは考えていないため、効率が悪いコーディングになっていると思われます。ロータリーエンコーダー:EC12PLRGBSDVBF-D-25K-24-24C-61 秋月使用IOポート0: CAT TX1: CAT RX2: ロータリーエンコーダーA(基板1)3: ロータリーエンコーダーB(基板2) (基板3:GND)4: LCD , Refer to P186 Arduinoを始めよう5: LCD , Refer to P186 Arduinoを始めよう6: LCD , Refer to P186 Arduinoを始めよう7: LCD , Refer to P186 Arduinoを始めよう8: AD9850 DATA9: AD9850 RESET10: LCD , Refer to P186 Arduinoを始めよう11: LCD , Refer to P186 Arduinoを始めよう12: LCD , Refer to P186 Arduinoを始めよう13:周波数ステップ切替スイッチ(ロータリエンコーダスイッチ利用) ロータリー側コネクター6、5はGへ(基板4)14: F_LOCK周波数ロック、Mega以降追加 ★試にプルアップしてみた。外付け抵抗不要でよさそう。15:Freq Lock16:AD9850 FQ_UD17:AD9850 CLK22: INPUT: PTT from MIC, BUT, KEY24: OUTPUT: RELAY (with delay)26: MUTE54: A0(14) (Mega 54)スキャン開始、停止用押しボタンスイッチ55: A1(15) (Mega 55)VFO A/B切替スイッチ56: A2(16)(Mega 56) RIT ONスイッチ57: A3 (17)(Mega 57)TX検出、受信時にのみRIT-ON58: A4 (18)(Mega 58) HIGHを検出するとCW表示、LOW検出時はSSB表示59: A5(19)(Mega 59)電圧検出60: A8 RSSI read from IF44: 44 Gain Controle to change PIN Di*/
// ヘッダー関連 -----------------------------------
#include <FlexiTimer2.h> /// 1mS割り込み用 Mega用!!
#include <LiquidCrystal.h> /// LCD表示用
#include <EF_AD9850.h> //AD9850を使うためのライブラリ
#define BEAT 300 // 音の長さを指定
#define PINNO 15 // 圧電スピーカを接続したピン番号
#include <Wire.h>
#include <Adafruit_MCP4725.h>
Adafruit_MCP4725 dac;
// 初期設定関連 -----------------------------------
// 初期周波数設定
volatile long X = 35840000; ///液晶に表示する数字、周波数Hz
volatile long Y = 35840000; /// RIT時のテンポラリー
volatile long TEMP_DELTA_FREQ; /// CW時の周波数ズラシ用
volatile long DISP_FREQ = 50150000; /// LCD表示周波数
volatile long DELTA_FREQ = DISP_FREQ - X; ///差分記憶
volatile long RIT_FREQ = 0; ///RIT用周波数
volatile long OLD_RIT_FREQ; ///RIT変化チェック用
volatile long XA; ///VFOテンポラリーメモリー
//volatile long XB = 35840000; ///VFOテンポラリーメモリー
volatile long XB = 36177400; ///VFOテンポラリーメモリー ★電源ON時、VFO-Bにビーコン周波数がデフォルト設定が便利
// LCDのポート設定
LiquidCrystal lcd(12, 11, 10, 7, 6, 5, 4); // デジタルポート番号、本参照
// 周波数ステップの切替ボタン設定
const int BUTTON = 13; /// ボタン、ステップ切替用
int val = 0; /// 状態変数、0か1、1の場合は10ステップ、0時は100ステップ
int old_val = 0; /// 前の状態を記憶
int state = 1; /// 現在のステート
int state_a = 0; /// VFO A 時のステップ
int state_b = 0; /// VFO B 時のステップ
int freq_step = 10; /// 周波数ステップ
// 周波数に小数点を入れる計算をするためのテンポラリメモリ
String TMP; //周波数表示に小数点入れるためのテンポラリ計算用
String TMP1; //周波数表示に小数点入れるためのテンポラリ計算用
String TMP2; //周波数表示に小数点入れるためのテンポラリ計算用
String TMP3; //周波数表示に小数点入れるためのテンポラリ計算用
///スキャン用ボタン設定
const int SCAN_BUTTON = 54; ///スキャンON/OFF用ボタン
int val2 = 0; /// 仮ステータス
int old_val2 = 0; /// 仮ステータス
int state2 = 0; /// 仮ステータス
///RIT用ボタン設定
const int RIT_BUTTON = 55; ///スキャンON/OFF用ボタン 16pin
int val3 = 0; /// 仮ステータス
int old_val3 = 0; /// 仮ステータス
int state3 = 0; /// 仮ステータス
///TX検出用ボタン設定
const int TX_DETECT = 57; ///TX
int val4 = 0; /// 仮ステータス
int old_val4 = 0; /// 仮ステータス
int state4 = 0; /// 仮ステータス
// モード検出用設定、リグのHWスイッチから電圧を検出する
const int MODE_DETECT = 58; ///検出ピン18番、A4
int val5 = 0; /// 仮ステータス
int old_val5 = 0; /// 仮ステータス
int state5 = 0; /// 仮ステータス
///VFO-AB 用ボタン設定
const int VFO_BUTTON = 56; ///VFO A B ボタン 15Pin
int val6 = 0; /// 仮ステータス
int old_val6 = 0; /// 仮ステータス
int state6 = 0; /// 仮ステータス
//周波数ロック機能
const int FREQ_LOCK = 14; ///スキャンON/OFF用ボタン
int val7 = 0; /// 仮ステータス
int old_val7 = 0; /// 仮ステータス
int state7 = 0; /// 仮ステータス
// 電圧測定用変数
const int VOLT = 5; /// ピン定義A5を使う
double volt_val = 0; /// 電圧入れる変数
char volt_1[2]; /// LCD電圧表示用変数 小数点より前
char volt_2[1]; /// LCD電圧表示用変数 小数点後
//AD9850 DDSモジュールとArduinnoの接続
int clock = 17;//W_CLK original 1
int fqup = 16;//FQ_UD , original 0
int data = 8;//DATA
int ddsreset = 9;//RESET
EF_AD9850 AD9850(clock, fqup, ddsreset, data);
/// CAT送信間隔用
volatile long SEND_CAT = 1;
/// RSSI
long RSSI_VAL = 0;
long RSSI_PIN = 8; // A8 pin
/// AGC
long AGC_VAL = 1900;
long AGC_PIN = 44; // 44 pin
long OLD_AGC_VAL = 1000;
long AGC_DELAY = 10000;
long AGC_TARGET = 550;
//PTT RELATED
int PTT_PIN = 22;
int PTT_STAT = 1;
int OLD_PTT_STAT = 1;
int PTT_RELAY = 24;
int PTT_MUTE = 26;
long MUTE_COUNT = 0;
long MUTE_COUNT_RX = 0;
long MAX_MUTE_COUNT = 2;
long MAX_MUTE_COUNT_RX = 7;
int MUTE_STAT = 0;
//カスタム文字 バー表示
byte METER1[8] = {
B10000,
B10000,
B10000,
B10000,
B10000,
B10000,
B10000,
};
byte METER2[8] = {
B10100,
B10100,
B10100,
B10100,
B10100,
B10100,
B10100,
};
byte METER3[8] = {
B10101,
B10101,
B10101,
B10101,
B10101,
B10101,
B10101,
};
// セットアップ、初回のみ実行 ----------------------------
void setup(void) {
Serial.begin(9600); /// CAT用
pinMode(2, INPUT); // ロータリーエンコーダーA デジポート2
digitalWrite(2, HIGH); // プルアップ
pinMode(3, INPUT); // ロータリーエンコーダーB デジポート3、Cはグラウンドへ!
digitalWrite(3, HIGH); // プルアップ
pinMode(BUTTON, INPUT); // ボタン、ステップ切替用
pinMode(SCAN_BUTTON, INPUT); /// スキャン用のボタン、トグル化する
pinMode(RIT_BUTTON, INPUT); /// RIT ON用
pinMode(TX_DETECT, INPUT); /// TX検出用
pinMode(MODE_DETECT, INPUT); /// MODE検出用
pinMode(FREQ_LOCK, INPUT); /// プルアップしてみる。
digitalWrite(FREQ_LOCK, HIGH); ///プルアップ設定はこれ。
pinMode(PTT_PIN, INPUT_PULLUP); /// PTT端子、検出
pinMode(PTT_RELAY, OUTPUT); /// 2SC1815経由でリレー制御
pinMode(PTT_MUTE, OUTPUT); /// LM386ミュート
// LCDのセットアップ
// 16文字×2行のLCDを使用します
lcd.begin(16, 2);
FlexiTimer2::set(1, timerIRQ); // ロータリーエンコーダ読取りのために割込み,1mS毎に割り込み実行
FlexiTimer2::start();
// AD9850セットアップ関連
AD9850.init();//AD9850の初期化
AD9850.reset();//AD9850リセット
AD9850.wr_serial(0x00, X); //周波数データを送る、初期周波数Xを設定
//MUTE 初期設定
digitalWrite(PTT_MUTE, HIGH);
/// スタートアップ画面 電源ONしたときに遊びで表示
/* lcd.home(); lcd.print("JQ1SRN YOKOHAMA"); delay(300); lcd.clear(); delay(100); lcd.home(); lcd.print("JQ1SRN YOKOHAMA"); delay(300); lcd.clear(); delay(100); lcd.home(); lcd.print("JQ1SRN YOKOHAMA"); delay(300); lcd.clear(); delay(100); */
lcd.home();
lcd.print("SRN-02 BY JQ1SRN");
lcd.setCursor(0, 1); // 横に14、下に1、の位置にカーソル移動
lcd.print("Ver:20161203-003");
/////////////////////////// 液晶表示文字数定規
delay(3000);
lcd.clear();
dac.begin(0x60); // MCP4725 DAモジュールのI2Cアドレス
}
// ループ、実行部分 --------------------------------ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー-
void loop(void) {
// LCDに文字を表示するための処理ーーーーーーーーーーーーーーーーーーーーーーーーーーーー
DISP_FREQ = DELTA_FREQ + X; // DDSと表示周波数の差分を計算している
TMP = String(DISP_FREQ, DEC); /// 数値→テキスト変換
lcd.setCursor(6, 0); // 横に4、下に0、の位置にカーソル移動
TMP1 = TMP.substring(0, 2); // MHz部分表示VFOして、ピリオド
lcd.print(TMP1);
lcd.print(".");
TMP2 = TMP.substring(2, 5); // その後のKHZ表示
lcd.print(TMP2);
lcd.print(".");
TMP3 = TMP.substring(5, 9); // その後のHz表示
lcd.print(TMP3);
// lcd.print("Hz"); //VFO表示のためHz表示廃止
lcd.setCursor(0, 1); // 横に0、下に1、の位置にカーソル移動
// 周波数ステップ切替ボタン ---------------------------------
val = digitalRead(BUTTON); /// ステップ切替ボタン用シーケンス
if ((val == HIGH) && (old_val == LOW)) { /// ボタンが押されたの検出
state = 1 - state; /// 前とステート変更
}
old_val = val;
if (state == 1) { /// ステート1ならば、、、 ステップ10 暫定として
freq_step = 10;
} else { /// ステート0ならば、、、 ステップ100 暫定として
X = X / 100; // 100ステップ時に10の桁をゼロにリセットして見た目をよくする
X = X * 100; // 100ステップ時に10の桁をゼロにリセットして見た目をよくする
freq_step = 300;
}
// スキャン開始終了ボタン ---------------------------------
val2 = digitalRead(SCAN_BUTTON); /// ステップ切替ボタン用シーケンス
if ((val2 == HIGH) && (old_val2 == LOW)) { /// ボタンが押されたの検出
state2 = 1 - state2; /// 前とステート変更
}
old_val2 = val2;
if (state2 == 1) { /// ステート1ならばスキャンスタート、、、 処理A
X = X + 500;
AD9850.wr_serial(0x00, X); //周波数データを送る アップ
if (X > 36090000) { /// 35990000=50.300MHzでスキャンを50.150から再スキャン
X = 35840000; /// 35840000=50.150から再スキャン
}
} else { /// ステート0ならば、、、 処理B
/// digitalWrite(LED,LOW);
/// スキャンスイッチをもう一度押すと、なにもしない、スキャン停止する
}
// RITボタン ---------------------------------
val3 = digitalRead(RIT_BUTTON); /// ステップ切替ボタン用シーケンス
if ((val3 == HIGH) && (old_val3 == LOW)) { /// ボタンが押されたの検出
state3 = 1 - state3; /// 前とステート変更、RITがONの時State3は1となる
if (state3 == 1) {
lcd.setCursor(5, 1); // 横に0、下に1、の位置にカーソル移動
lcd.print("R "); // 表示、後でモードや他の情報表示に使う
lcd.setCursor(8, 1); // 横に0、下に1、の位置にカーソル移動
lcd.print(RIT_FREQ); // 表示、後でモードや他の情報表示に使う
lcd.print("Hz "); // 表示、後でモードや他の情報表示に使う
}
}
old_val3 = val3;
if (state3 == 1) { /// RITがONであれば
lcd.setCursor(5, 1); // 横に0、下に1、の位置にカーソル移動
lcd.print("R "); // RIT ON表示
if (RIT_FREQ != OLD_RIT_FREQ) { /// ロータリーエンコーダーが回って周波数が変わったら
lcd.print(" "); // 表示、後でモードや他の情報表示に使う
lcd.setCursor(7, 1); // 横に0、下に1、の位置にカーソル移動
lcd.print(RIT_FREQ); // 表示、後でモードや他の情報表示に使う
lcd.print("Hz"); // 表示、後でモードや他の情報表示に使う
OLD_RIT_FREQ = RIT_FREQ;
}
} else { /// /// RITがOFFであれば
lcd.setCursor(5, 1); // 横に0、下に1、の位置にカーソル移動
lcd.print(" "); // 表示、後でモードや他の情報表示に使う
Y = X;
RIT_FREQ = 0;
// RITがOFFの時だけ電圧表示する
volt_val = analogRead(VOLT); /// 電圧読み出し
volt_val *= 5; ///変換
volt_val /= 1024; ///変換
volt_val /= 30.2; /// 変換 元々30で、微調整で+0.2電圧微調整
volt_val *= 130;
dtostrf(volt_val, 2, 1, volt_1); //変換する値 ,変換後の総文字数,小数点以下の桁数(13.82->13.8),変換後格納する変数
lcd.print(volt_1); // 電圧をLCDに表示
lcd.print("V"); // 電圧をLCDに表示
if (atoi(volt_1) < 10.0 && atoi(volt_1) > 1.0 ) { // 電圧が10v以下になったらアラートを出す!
tone(PINNO, 262, BEAT) ; // ド
delay(BEAT) ;
tone(PINNO, 294, BEAT) ; // レ
delay(BEAT) ;
}
}
// PTT制御 ---------------------------------
PTT_STAT = digitalRead(PTT_PIN); /// 結果0=送信
//Serial.print("PTT---------------");
//Serial.println(PTT_STAT);
if (PTT_STAT == 0 && OLD_PTT_STAT == 1) { // 初回送信時実行 ★
digitalWrite(PTT_MUTE, LOW); // MUTEするーー>MUTE解除まで
MUTE_COUNT = 0;
digitalWrite(PTT_RELAY, HIGH);
OLD_PTT_STAT = PTT_STAT;
MUTE_STAT = 1;
}
if (PTT_STAT == 0 && OLD_PTT_STAT == 0 && MUTE_STAT == 1) { // MUTE解除までの時間
MUTE_COUNT = MUTE_COUNT + 1;
if (MUTE_COUNT == MAX_MUTE_COUNT)
{
digitalWrite(PTT_MUTE, HIGH);
MUTE_STAT = 0;
}
if (MUTE_COUNT > MAX_MUTE_COUNT) {
MAX_MUTE_COUNT = 50;
}
}
if (PTT_STAT == 1 && OLD_PTT_STAT == 0) { // 受信に切り替わり ★
digitalWrite(PTT_MUTE, LOW); // MUTEするーー>MUTE解除まで
MUTE_COUNT_RX = 0;
digitalWrite(PTT_RELAY, LOW);
OLD_PTT_STAT = PTT_STAT;
}
if (PTT_STAT == 1 && OLD_PTT_STAT == 1) { // MUTE解除までの時間
MUTE_COUNT_RX = MUTE_COUNT_RX + 1;
if (MUTE_COUNT_RX == MAX_MUTE_COUNT_RX)
{
digitalWrite(PTT_MUTE, HIGH);
}
if ( MAX_MUTE_COUNT_RX > MAX_MUTE_COUNT_RX) {
MAX_MUTE_COUNT_RX = 50;
}
}
// TX検出 ---------------------------------
val4 = digitalRead(TX_DETECT); ///送信検出
if (val4 == HIGH) { /// ボタンが押されたの検出 val4は送信時「1」となる
if (old_val4 != HIGH) { //LCD表示が点滅するのを防ぐ、RXからTXになった際だけ、このIF分入る
// digitalWrite(PTT_MUTE, LOW); // LOW MUTE
// delay(50);
// digitalWrite(PTT_MUTE, HIGH); // HIGH UNMUTE
lcd.setCursor(14, 1); // 横に14、下に1、の位置にカーソル移動
lcd.print("TX"); // 送信時にLCDにTXと表示
AD9850.wr_serial(0x00, X); //周波数データを送る アップ
old_val4 = val4;
if (state2 == 1) { /// スキャン中なら、PTTでスキャン停止
state2 = 0;
}
}
// delay(10);
} else { /// 受信時 val4がLOWである時
/// digitalWrite(LED, LOW);
lcd.setCursor(14, 1); // 横に14、下に1、の位置にカーソル移動
lcd.print("RX"); // 受信時にLCDにRXと表示
if (state3 == HIGH) { /// RITスイッチをチェックする、RITがONの時はこちら
//AD9850.wr_serial(0x00, Y); /// バックアップ:RIT補正の周波数データを送る アップ
/// CW時でかつ、RXの時だけ、受信周波数を800Hz下げる
if (val5 == HIGH) { /// CWモードと判断
TEMP_DELTA_FREQ = Y - 800;
AD9850.wr_serial(0x00, TEMP_DELTA_FREQ); //送信波を800HzだけUP
} else { // SSBモードの場合通常にY周波数を送る
AD9850.wr_serial(0x00, Y); //周波数データを送る アップ
old_val4 = val4;
}
} else { /// RIT が OFFの時はこちら
//AD9850.wr_serial(0x00, X); //周波数データを送る アップ
/// CW時でかつ、RXの時だけ、受信周波数を800Hz下げる
if (val5 == HIGH) { /// CWモードと判断
TEMP_DELTA_FREQ = X - 800;
AD9850.wr_serial(0x00, TEMP_DELTA_FREQ); //送信波を800HzだけUP
} else { // SSBモードの場合通常にY周波数を送る
AD9850.wr_serial(0x00, X); //周波数データを送る アップ
old_val4 = val4;
}
}
old_val4 = val4;
// delay(10);
}
// MODE検出 ---------------------------------
val5 = digitalRead(MODE_DETECT); /// モード検出ピンをチェック
if (val5 == HIGH) { /// ボタンが押されたの検出 val5は送信時「1」となる
if (old_val5 != HIGH) { //LCD表示が連続上書きされ点滅するのを防ぐ
lcd.setCursor(0, 0); // 左上座標
lcd.print("CW "); // CW表示
}
// delay(10);
} else {
lcd.setCursor(0, 0); // 左上座標
lcd.print("SSB"); // SSB表示
old_val5 = val5;
// delay(10);
}
// VFO ABボタン処理 ---------------------------------
val6 = digitalRead(VFO_BUTTON); /// VFOボタン定義
if ((val6 == HIGH) && (old_val6 == LOW)) { /// ボタンが押されたの検出
state6 = 1 - state6; /// 前とステート変更、ボタンONの時Stateは1となる
if (state6 == 1) { /// VFO B-> A
XA = X;
X = XB;
state_a = state;
state = state_b;
} else { /// VFO A - > B
XB = X;
X = XA;
state_b = state;
state = state_a;
}
}
old_val6 = val6;
if (state6 == 1) { ///
lcd.setCursor(4, 0); // 横に0、下に1、の位置にカーソル移動
lcd.print("B"); // 表示、後でモードや他の情報表示に使う
} else { /// ///
lcd.setCursor(4, 0); // 横に0、下に1、の位置にカーソル移動
lcd.print("A"); // 表示、後でモードや他の情報表示に使う
}
// 周波数ロック ボタン処理 ---------------------------------
val7 = digitalRead(FREQ_LOCK); /// VFOボタン定義
if ((val7 == LOW) && (old_val7 == HIGH)) { /// ボタンが押されたの検出
state7 = 1 - state7; /// 前とステート変更、ボタンONの時Stateは1となる
}
old_val7 = val7;
if (state7 == 1) { ///LOCKボタン押されて、LOCKステートに入っている
lcd.setCursor(3, 0);
lcd.print("*"); // LCDにロック時★マーク表示
} else { /// ///
lcd.setCursor(3, 0);
lcd.print(" "); // LCDの★マーク消す
}
// CAT出力 ---------------------------------
++SEND_CAT;
if (SEND_CAT > 20) {
Serial.print("FA000"); ///周波数
Serial.print(DISP_FREQ); ///周波数
Serial.println(";"); ///周波数
if (val5 == HIGH) { /// ボタンが押されたの検出 val5は送信時「1」となる
Serial.println("MD3;"); ///モード
} else {
Serial.println("MD2;"); ///モード
}
SEND_CAT = 1;
}
// AGC 処理 ---------------------------------
RSSI_VAL = analogRead(RSSI_PIN); /// 電圧読み出し
// RSSIバー表示
lcd.createChar(1, METER1);
lcd.createChar(2, METER2);
lcd.createChar(3, METER3);
if (RSSI_VAL < 200) {
lcd.setCursor(0, 1);
lcd.write(1); lcd.write(" ");
}
if (RSSI_VAL > 199 && RSSI_VAL < 241) {
lcd.setCursor(0, 1);
lcd.write(2); lcd.write(" ");
}
if (RSSI_VAL > 240 && RSSI_VAL < 283) {
lcd.setCursor(0, 1);
lcd.write(3); lcd.write(" ");
}
if (RSSI_VAL > 282 && RSSI_VAL < 325) {
lcd.setCursor(0, 1);
lcd.write(3); lcd.write(1); lcd.write(" ");
}
if (RSSI_VAL > 324 && RSSI_VAL < 366) {
lcd.setCursor(0, 1);
lcd.write(3); lcd.write(2); lcd.write(" ");
}
if (RSSI_VAL > 365 && RSSI_VAL < 408) {
lcd.setCursor(0, 1);
lcd.write(3); lcd.write(3); lcd.write(" ");
}
if (RSSI_VAL > 407 && RSSI_VAL < 450) {
lcd.setCursor(0, 1);
lcd.write(3); lcd.write(3); lcd.write(1); lcd.write(" ");
}
if (RSSI_VAL > 449 && RSSI_VAL < 491) {
lcd.setCursor(0, 1);
lcd.write(3); lcd.write(3); lcd.write(2); lcd.write(" ");
}
if (RSSI_VAL > 490 && RSSI_VAL < 533) {
lcd.setCursor(0, 1);
lcd.write(3); lcd.write(3); lcd.write(3); lcd.write(" ");
}
if (RSSI_VAL > 532 && RSSI_VAL < 575) {
lcd.setCursor(0, 1);
lcd.write(3); lcd.write(3); lcd.write(3); lcd.write(1);
}
if (RSSI_VAL > 574 && RSSI_VAL < 616) {
lcd.setCursor(0, 1);
lcd.write(3); lcd.write(3); lcd.write(3); lcd.write(2);
}
if (RSSI_VAL > 615 && RSSI_VAL < 658) {
lcd.setCursor(0, 1);
lcd.write(3); lcd.write(3); lcd.write(3); lcd.write(3);
}
if (RSSI_VAL > 657) {
lcd.setCursor(0, 1);
lcd.write(3); lcd.write(3); lcd.write(3); lcd.write(3);
}
//デバッグ用RSSIシリアル出力
//Serial.print("RSSI_VAL: "); ///周波数
//Serial.print(RSSI_VAL); ///周波数
//Serial.print(" "); ///周波数
// RSSIが550になるように、調整する
if (RSSI_VAL < AGC_TARGET) { // 550以下の場合(弱電界)、Gへの抵抗上げる、オープン方向
if (AGC_TARGET - RSSI_VAL > 100) {
AGC_VAL = AGC_VAL - 40;
}
if (AGC_TARGET - RSSI_VAL <= 100 && AGC_TARGET - RSSI_VAL > 50 ) {
AGC_VAL = AGC_VAL - 20;
}
if (AGC_TARGET - RSSI_VAL <= 50 && AGC_TARGET - RSSI_VAL > 25 ) {
AGC_VAL = AGC_VAL - 10;
}
if (AGC_TARGET - RSSI_VAL <= 25 && AGC_TARGET - RSSI_VAL > 10 ) {
AGC_VAL = AGC_VAL - 5;
}
if (AGC_TARGET - RSSI_VAL <= 10 ) {
AGC_VAL = AGC_VAL - 1;
}
}
if (RSSI_VAL > AGC_TARGET) { // 550以上の場合(強電界)、Gへの抵抗下げる、ショート方向
if ( RSSI_VAL - AGC_TARGET > 100) {
AGC_VAL = AGC_VAL + 400;//50
}
if (RSSI_VAL - AGC_TARGET <= 100 && RSSI_VAL - AGC_TARGET > 50 ) {
AGC_VAL = AGC_VAL + 100;//25
}
if (RSSI_VAL - AGC_TARGET <= 50 && RSSI_VAL - AGC_TARGET > 25 ) {
AGC_VAL = AGC_VAL + 50;//13
}
if (RSSI_VAL - AGC_TARGET <= 25 && RSSI_VAL - AGC_TARGET > 10 ) {
AGC_VAL = AGC_VAL + 10;//5
}
if (RSSI_VAL - AGC_TARGET <= 10 ) {
AGC_VAL = AGC_VAL + 1;
}
}
if (AGC_VAL > 4095) { //上限
AGC_VAL = 4095;
}
if (AGC_VAL <= 0) { //下限
AGC_VAL = 0;
}
if (state7 == 1) { ///LOCKボタン押されて、LOCKステートに入っている★暫定 後で削除
AGC_VAL = 0; //0でPINダイオード電流最小、Gへはオープン、ATTとなっていない状態、スルー
}
dac.setVoltage(AGC_VAL, false);// DA制御
//AGCデバッグ出力
//Serial.print("AGC_VAL: ");
//Serial.print(AGC_VAL);
//for (int i = 0; i <= AGC_VAL / 50; i++) {
// Serial.print("*");
//}
//Serial.println(" ");
} /// ←Loop閉じるカッコなので注意、if文の終わりではない
// 割り込み時に実行されるプログラム ロータリー処理、周波数変更、AD9850アップデート --ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
void timerIRQ() { // MsTimer2割込み処理
if (state7 == 1) { /// F_LOCKされている
return;
}
static byte bp = 0; // ビットパターン記録バッファ
bp = bp << 1;
if (digitalRead(2) == HIGH) { // A相の状態を
bp |= 0x01; // bpの末尾に記録
}
bp = bp << 1;
if (digitalRead(3) == HIGH) { // B相の状態を
bp |= 0x01; // bpの末尾に記録
}
bp = bp & 0x0F; // 下位4ビット残して上位を消す
if (bp == 0b0111) { // このビットパターンと一致していたら /// ロータリー右回し
if ((state3 == HIGH) && (val4 == LOW)) { /// RITモードがONでRX状態ならば
RIT_FREQ = RIT_FREQ + 10;
Y = X + RIT_FREQ;
// AD9850.wr_serial(0x00, Y); /// 周波数データを送る アップ
delay(10);
} else { /// RITモードでない場合
X = X + freq_step;
// AD9850.wr_serial(0x00, X); //周波数データを送る アップ
}
}
if (bp == 0b0100) { // このビットパターンと一致していたら、 /// ロータリー左回し
if ((state3 == HIGH) && (val4 == LOW)) { /// RITモードがONでRX状態ならば
RIT_FREQ = RIT_FREQ - 10;
Y = X + RIT_FREQ;
// AD9850.wr_serial(0x00, Y); /// 周波数データを送る アップ
delay(10);
} else { /// RITモードでない場合
X = X - freq_step;
// AD9850.wr_serial(0x00, X); //周波数データを送る アップ
}
}
}
//------------------------------------------
- 関連記事
-
-
Arudinoで周波数カウンター① Arudino
-
QRP用 小型ATUの試作①
-
タッチスイッチをパドルに
-
大画面SPI液晶モジュール [M432B] ② U8glib Library
-
大画面SPI液晶モジュール [M432B] ① ST7565 Graphic LCD Library
-
MCP23017でIOを増設する I2Cで制御して16ポート増設可能
-
Arduino loop時間計測
-
ArduinoでAGCが可能か検討⑨
-
ArduinoでAGCが可能か検討⑧
-
ArduinoでAGCが可能か検討⑦
-
ArduinoでAGCが可能か検討⑥
-
ラダーフィルター⑦
-
ラダーフィルター⑥
-
ArduinoでAGCが可能か検討⑤
-
ラダーフィルター⑤
-