無線ブログ集
メイン | 簡易ヘッドライン |
TS820-DDS-VFOその5 (2022/2/28 3:58:12)
ESP32DevKitCに設定した入力11ポートにワイヤー11本で繋ぎ、ブレッドボードに回路を組んで、早速BCD回路で組んでいたプログラムのif文ルーチンを直接コーディング開始しました。前のBCD回路の4ポートの状態確認をD0からD10の全11ポートの状態確認にするだけです。少しコーディングが長くはなりますが、TS820のPLL回路からの選択したバンドの+B電圧を確認する条件文です。この条件文で分岐動作させる内容はBCD入力の時のコードと全く同じです。IF文の条件で現在のTS820のバンドSWの位置の判断を行います。上記の書き換えの為には新たな入力の11ポートの入力ポート宣言と設定をする必要があります。
以下追加宣言部です。
//for TS-820 SELECT BAND +B VOLTAGE PORT D0 TO D10 ADD JAN23
#define TO_ESPD0 13 //1.8MHz 180m
#define TO_ESPD1 14 //3.5MHz 80m
#define TO_ESPD2 27 //7.0MHz 40m
#define TO_ESPD3 26 //14.0MHz 20m
#define TO_ESPD4 25 //15.0MHz 20m JJY
#define TO_ESPD5 33 //18.0MHz 17m
#define TO_ESPD6 32 //21.0MHz 15m
#define TO_ESPD7 35 //28.0MHz 10m
#define TO_ESPD8 34 //28.5MHz 10m
#define TO_ESPD9 39 //29.0MHz 10m
#define TO_ESPD10 36 //29.5MHz 10m
#define TO_ESPD0 13 //1.8MHz 180m
#define TO_ESPD1 14 //3.5MHz 80m
#define TO_ESPD2 27 //7.0MHz 40m
#define TO_ESPD3 26 //14.0MHz 20m
#define TO_ESPD4 25 //15.0MHz 20m JJY
#define TO_ESPD5 33 //18.0MHz 17m
#define TO_ESPD6 32 //21.0MHz 15m
#define TO_ESPD7 35 //28.0MHz 10m
#define TO_ESPD8 34 //28.5MHz 10m
#define TO_ESPD9 39 //29.0MHz 10m
#define TO_ESPD10 36 //29.5MHz 10m
下記のo_frqも追加宣言します。
p_frqは設定値の確認で使用したものです。
int32_t o_frq;
//encorder move frequency value +-
int32_t p_frq;
int32_t p_frq;
下記のパルス入ロポート及び初期時のトリガー出力用ポートも使用するので宣言します。
#define CHANG_BAND
16 //change BAND then low pulse CHANGE ON 2022/JAN/11
#define START_ON 0 //Output PORT 0 start timer torrigger for IC 555 2pin
#define START_ON 0 //Output PORT 0 start timer torrigger for IC 555 2pin
セットアップルーチンでは下記の入力ポート設定をします。
pinMode(TO_ESPD0,INPUT);
//DIGITAL INPUT 13 D0
pinMode(TO_ESPD1,INPUT); //DIGITAL INPUT 14 D1
pinMode(TO_ESPD2,INPUT); //DIGITAL INPUT 27 D2
pinMode(TO_ESPD3,INPUT); //DIGITAL INPUT 26 D3
pinMode(TO_ESPD4,INPUT); //DIGITAL INPUT 25 D4
pinMode(TO_ESPD5,INPUT); //DIGITAL INPUT 33 D5
pinMode(TO_ESPD6,INPUT); //DIGITAL INPUT 32 D6
pinMode(TO_ESPD7,INPUT); //DIGITAL INPUT 35 D7
pinMode(TO_ESPD8,INPUT); //DIGITAL INPUT 34 D8
pinMode(TO_ESPD9,INPUT); //DIGITAL INPUT 39 D9
pinMode(TO_ESPD10,INPUT); //DIGITAL INPUT 36 D10
pinMode(TO_ESPD1,INPUT); //DIGITAL INPUT 14 D1
pinMode(TO_ESPD2,INPUT); //DIGITAL INPUT 27 D2
pinMode(TO_ESPD3,INPUT); //DIGITAL INPUT 26 D3
pinMode(TO_ESPD4,INPUT); //DIGITAL INPUT 25 D4
pinMode(TO_ESPD5,INPUT); //DIGITAL INPUT 33 D5
pinMode(TO_ESPD6,INPUT); //DIGITAL INPUT 32 D6
pinMode(TO_ESPD7,INPUT); //DIGITAL INPUT 35 D7
pinMode(TO_ESPD8,INPUT); //DIGITAL INPUT 34 D8
pinMode(TO_ESPD9,INPUT); //DIGITAL INPUT 39 D9
pinMode(TO_ESPD10,INPUT); //DIGITAL INPUT 36 D10
おおまかな動作は、ESP32DevKitCのCHANG_BANDポート(GPIO16)には、パルス発生ゲートIC(74121)のLパルスが入力されるとバンドSWの確認が行われるフローで動作します。バンドSWを回して一瞬オープンになった時にトランジスターエミッタの出力が”L”レベルに下がり次のバンドにSWが繋がると”L”から”H”レベルになりこの立ち上がりでタイマーIC(555)がスタートします。実際に使うタイマー時間は極力短く設定するようにしていますが、動作を理解するためにコンデンサの容量を少し大きめにして目でみて分かる程度までタイマー時間を延ばしてあります。(0.47μFを10μFに変えてます。)タイマー出力は”L”から設定時間だけの間”H”となりタイマー時間終了後に”L”に下がります。このタイマー出力はパルス発生の74121の入力にダイオードで繋いでいます。カソードをタイマーIC(555)の出力側に、アノードを74121の入力側に繋いでいます。最初は直接つないでいたのですが、最終的にはこのダイオードの追加が必要でした。他のESP32DevKitCの電源が入った初期にバンドSWの確認を行う為パルスを出していますが、立ち上がり時間が多少かかるので、長めのタイマー時間設定でのタイマーIC(555)を使い同じ様に立ち下がりでパルス発生させて設定バンドを設定しています。74121の入力は2つの回路出力が繋がるのですが、両方ともパスル発生をさせる為にはダイオードの追加が必要でした。回路図は修正し、パターンもダイオード追加変更しています。やはり確認してゆくと、何らかの変更はあるものです。
下記は1.9MHzと3.5MHzの実際のコードです。PLL回路からのバンド選択時出力の+B電圧が何処のバンドポートに印加されてるかを見ているコードです。この様な11ポート分のIF文ルーチンが延々と続きます。
プログラムの動作説明ですが、電源がESP32DivKitCにかかり起動すると、最初はプリセットのヘテロダイン周波数に設定されますが、この初回時の状態は初期値p=0でのみ通す様にし、通過後は強制的にp=1に設定しています。このため起動後はp=1のルーチン側のみで動作する様になります。
ロータリーエンコーダーまわし動いた周波数分をo_frq; //encorder move frequency value +- としてfrq = HET_FREQ -
5500000 + o_frq;で周波数を設定します。このo_frqは、下記のコードの次に説明します。
if(digitalRead(CHANG_BAND)==LOW){ // IF pin16 L PULS IN (ordinary H level)
if(((((((((((digitalRead(TO_ESPD0)==HIGH) // PLL OUT portD0-D10 condition check
and(digitalRead(TO_ESPD1)==LOW)
and(digitalRead(TO_ESPD2)==LOW)
and(digitalRead(TO_ESPD3)==LOW)
and(digitalRead(TO_ESPD4)==LOW)
and(digitalRead(TO_ESPD5)==LOW)
and(digitalRead(TO_ESPD6)==LOW)
and(digitalRead(TO_ESPD7)==LOW)
and(digitalRead(TO_ESPD8)==LOW)
and(digitalRead(TO_ESPD9)==LOW)
and(digitalRead(TO_ESPD10)==LOW))))))))))){ //1.9MHz
HET_FREQ = HET_FREQ01;
if(p==0){
frq = freq01;
p=1;
}
else{
if(p==1){
frq = HET_FREQ - 5500000 + o_frq;
p=1;
}
}
f_dchange = 1;
f_fchange=1;//add 2020Dec12
//digitalWrite(LED_BUILTIN,HIGH); //D0 THERE'S NO OUTPUTPORT FOR USE
//digitalWrite(LED_BUILTIN1,LOW); //D1 THERE'S NO OUTPUTPORT FOR USE
//digitalWrite(LED_BUILTIN2,LOW); //D2 THERE'S NO OUTPUTPORT FOR USE
//digitalWrite(LED_BUILTIN3,LOW); //D3 THERE'S NO OUTPUTPORT FOR USE
}
if(((((((((((digitalRead(TO_ESPD0)==HIGH) // PLL OUT portD0-D10 condition check
and(digitalRead(TO_ESPD1)==LOW)
and(digitalRead(TO_ESPD2)==LOW)
and(digitalRead(TO_ESPD3)==LOW)
and(digitalRead(TO_ESPD4)==LOW)
and(digitalRead(TO_ESPD5)==LOW)
and(digitalRead(TO_ESPD6)==LOW)
and(digitalRead(TO_ESPD7)==LOW)
and(digitalRead(TO_ESPD8)==LOW)
and(digitalRead(TO_ESPD9)==LOW)
and(digitalRead(TO_ESPD10)==LOW))))))))))){ //1.9MHz
HET_FREQ = HET_FREQ01;
if(p==0){
frq = freq01;
p=1;
}
else{
if(p==1){
frq = HET_FREQ - 5500000 + o_frq;
p=1;
}
}
f_dchange = 1;
f_fchange=1;//add 2020Dec12
//digitalWrite(LED_BUILTIN,HIGH); //D0 THERE'S NO OUTPUTPORT FOR USE
//digitalWrite(LED_BUILTIN1,LOW); //D1 THERE'S NO OUTPUTPORT FOR USE
//digitalWrite(LED_BUILTIN2,LOW); //D2 THERE'S NO OUTPUTPORT FOR USE
//digitalWrite(LED_BUILTIN3,LOW); //D3 THERE'S NO OUTPUTPORT FOR USE
}
else{
if(((((((((((digitalRead(TO_ESPD0)==LOW) // PLL OUT portD0-D10 condition check
and(digitalRead(TO_ESPD1)==HIGH)
and(digitalRead(TO_ESPD2)==LOW)
and(digitalRead(TO_ESPD3)==LOW)
and(digitalRead(TO_ESPD4)==LOW)
and(digitalRead(TO_ESPD5)==LOW)
and(digitalRead(TO_ESPD6)==LOW)
and(digitalRead(TO_ESPD7)==LOW)
and(digitalRead(TO_ESPD8)==LOW)
and(digitalRead(TO_ESPD9)==LOW)
and(digitalRead(TO_ESPD10)==LOW))))))))))){ //3.5MHz
HET_FREQ = HET_FREQ02;
if(p==0){
frq = freq02;
p=1;
}
else{
if(p==1){
frq = HET_FREQ - 5500000 + o_frq;
p=1;
}
}
if(((((((((((digitalRead(TO_ESPD0)==LOW) // PLL OUT portD0-D10 condition check
and(digitalRead(TO_ESPD1)==HIGH)
and(digitalRead(TO_ESPD2)==LOW)
and(digitalRead(TO_ESPD3)==LOW)
and(digitalRead(TO_ESPD4)==LOW)
and(digitalRead(TO_ESPD5)==LOW)
and(digitalRead(TO_ESPD6)==LOW)
and(digitalRead(TO_ESPD7)==LOW)
and(digitalRead(TO_ESPD8)==LOW)
and(digitalRead(TO_ESPD9)==LOW)
and(digitalRead(TO_ESPD10)==LOW))))))))))){ //3.5MHz
HET_FREQ = HET_FREQ02;
if(p==0){
frq = freq02;
p=1;
}
else{
if(p==1){
frq = HET_FREQ - 5500000 + o_frq;
p=1;
}
}
f_dchange = 1;
f_fchange=1;//add 2020Dec12
//digitalWrite(LED_BUILTIN, LOW); //D0 THERE'S NO OUTPUTPORT FOR USE
//digitalWrite(LED_BUILTIN1,HIGH); //D1 THERE'S NO OUTPUTPORT FOR USE
//digitalWrite(LED_BUILTIN2, LOW); //D2 THERE'S NO OUTPUTPORT FOR USE
//digitalWrite(LED_BUILTIN3, LOW); //D3 THERE'S NO OUTPUTPORT FOR USE
}
}
f_fchange=1;//add 2020Dec12
//digitalWrite(LED_BUILTIN, LOW); //D0 THERE'S NO OUTPUTPORT FOR USE
//digitalWrite(LED_BUILTIN1,HIGH); //D1 THERE'S NO OUTPUTPORT FOR USE
//digitalWrite(LED_BUILTIN2, LOW); //D2 THERE'S NO OUTPUTPORT FOR USE
//digitalWrite(LED_BUILTIN3, LOW); //D3 THERE'S NO OUTPUTPORT FOR USE
}
}
〜省略
29.5MHzの入力ポートTO_ESPD10ポート が"HIGH"となる条件文のルーチンコードが続きます。
以前のバンド毎にBCDコードの出力を出していたルーチンは設定周波数検出時に出力を出そうかと思っていましたが、出力用ポートが4ポート必要ですが、2ポート不足しましたので使用しないことにしました。(周波数検出時のD0,D1,D2,D3のBCD出力)
o_frqの周波数動分は 下記のtask0
のループルーチンで周波数設定時に値を計算取得するようにしています。このルーチンで取得した周波数変化分のo_frqでTS820のバンドSWを切り替えても
frq = HET_FREQ - 5500000 +
o_frq;の計算式で設定した変動分を使用することで、VFO発振周波数は何処のバンドも同じ周波数で発振させることが出来るようにしています。
バンドSWを回してもp=1のルーチンしか通らないのでプリセット周波数へ設定されることありません。
エンコーダーをまわして1.815,00MHzに設定後TS820の本体のバンドSWを回した時の周波数表示です。
VFO発振周波数は5.485,00MHzでどのバンドも同じ発振周波数のままです。ヘテロダインの周波数を使った周波数表示も問題ありません。
実際の周波数表示は、こんな風になります。
1.815,00MHz⇔3.515,00MHz⇔7.015,00MHz⇔14.015,00MHz⇔15.015,00MHz⇔18.015,00MHz⇔21,015,00MHz
⇔28.015,00MHz⇔28.515,00MHz⇔29.015,00MHz⇔29.515,00MHz
下記のルーチンでo_frqを計算で取得しました。
/*-----------------------------------------------------------------------------------------------
Alternative Loop (core0)
------------------------------------------------------------------------------------------------*/
void task0(void* arg)
{
while (1)
{
pcnt_get_counter_value(PCNT_UNIT_0, &RE_Count);
int count=RE_Count;
pcnt_counter_clear(PCNT_UNIT_0);
if(f_rev==1) count=-count;
if(count!=0){
f_dchange=1;
f_fchange=1;
frq+= count * freq_step;
if(frq>fmax) frq=fmax;
if(frq<fmin) frq=fmin;
}
//-------------------------------------
if(f_fchange==1){
f_fchange=0;
// Output Lo freq
//set_freq( frq + offset_frq );
p_frq = HET_FREQ-frq + offset_frq + awase ;
set_freq( HET_FREQ - frq + offset_frq + awase); //change to ts820vfo
o_frq = frq - HET_FREQ + 5500000; //エンコーダー変化分
set_car_freq((car_frq + awase ), f_carON, 0);
}
//-------------------------------------
if(f_cchange==1){
f_cchange=0;
// Output Car freq
//set_car_freq(car_frq, f_carON, 0);
set_car_freq((car_frq + awase ), f_carON, 0);
}
if(f_redraw==1){
Transfer_Image();
f_redraw=0;
}
delay(1);
}
}
Alternative Loop (core0)
------------------------------------------------------------------------------------------------*/
void task0(void* arg)
{
while (1)
{
pcnt_get_counter_value(PCNT_UNIT_0, &RE_Count);
int count=RE_Count;
pcnt_counter_clear(PCNT_UNIT_0);
if(f_rev==1) count=-count;
if(count!=0){
f_dchange=1;
f_fchange=1;
frq+= count * freq_step;
if(frq>fmax) frq=fmax;
if(frq<fmin) frq=fmin;
}
//-------------------------------------
if(f_fchange==1){
f_fchange=0;
// Output Lo freq
//set_freq( frq + offset_frq );
p_frq = HET_FREQ-frq + offset_frq + awase ;
set_freq( HET_FREQ - frq + offset_frq + awase); //change to ts820vfo
o_frq = frq - HET_FREQ + 5500000; //エンコーダー変化分
set_car_freq((car_frq + awase ), f_carON, 0);
}
//-------------------------------------
if(f_cchange==1){
f_cchange=0;
// Output Car freq
//set_car_freq(car_frq, f_carON, 0);
set_car_freq((car_frq + awase ), f_carON, 0);
}
if(f_redraw==1){
Transfer_Image();
f_redraw=0;
}
delay(1);
}
}
今日秋月通販へ注文したブレッドボード用のワイヤーや、他パーツが届きました。この為配線待ち部分も配線できてコーディングへ移れました。
仕様変更となった11ポートの設定バンド検出のコーディングは終わりました。もう少し色々と動かして確認をしてみたいと思います。パルスとタイマーのタイミングも確認したいと思います。
つづく?
続きを読む
execution time : 0.049 sec