====== 簡易信号発生ユニット(PWM)2 ======
===== 概要 =====
近々にAMのワイヤレスマイクを作成しようと思っています。
その発振部に、コイルとバリコンでは、安定性に欠けるので何か方法は無いものかと思案しておりました。
水晶を使う手もあるのですが、必要な周波数分購入しなければなりません。
その応用でVXO(Variable-crystal oscillator(可変周波型水晶発振器))はどうかと思いましたが、可変範囲が狭すぎます。
あれこれ思案した末、PICが内蔵しているCCPモジュール(Compare/Capture/PWM)のPWMモードが使用できるのではと考えました。
===== 動作原理 =====
PICのPWMモードでは、周期とデューティ(duty)が設定できます。
{{:imgpaste:202004:htmikan-20200428-162031.png}}
先ず、周期が最高どこまで設定可能かを計算してみます。
* 周期=(PR2+1)×4Tosc×(TMR2のプリスケール値)
クロックが20Mhzの場合には、
* 1667kHz≒(2+1)×4(0.00000005)×1
この時に、PR2の値を2にしたのは、本ユニットの出力は正弦波としますので、デューティは周期の半分となるためです。
PR2を変化させていくと、次のような周波数を得ることが出来ます。
* 2: 1667Khz
* 3: 1250Khz
* 4: 1000Khz
* 5: 833Khz
* 6: 714Khz
* 7: 625Khz
* 8: 555Khz
* 9: 500Khz
これだけの周波数が設定できれば、AMラジオの範囲内としては、十分かなと思います。
但、PICの出力は、当然のことですが、出力が方形波となってしまいます。
そこで、この後に2段の同調回路を設けて正弦波に変換することにしました。
===== 回路図 =====
SW1,2,3で、上記の8種類の周波数を切り替えます。
{{:imgpaste:202004:htmikan-20200428-162309.png}}
===== ソースコード =====
//**********************************************************************
#define sw0 GPIO.F0
#define sw1 GPIO.F1
#define sw2 GPIO.F4
//**********************************************************************
void Pwm_Change_DutyEx(unsigned int duty_ratio)
{
CCPR1L = duty_ratio >> 2;
CCP1CON.F6 = duty_ratio & 0b00000001;
CCP1CON.F7 = (duty_ratio & 0b00000010) >> 1;
}
//**********************************************************************
void main()
{
static unsigned char temp;
//
OSCCON = 0b01110000; // クロックは1Mhz
CMCON0 = 0b00000111; // コンパレータは使用しない。
ANSEL = 0b00000000; // AN0を使用する。
TRISIO = 0b00011011; // ポート設定
WPU.F0 = 1; // プルアップ
WPU.F1 = 1; // プルアップ
WPU.F4 = 1; // プルアップ
OPTION_REG = 0b00000000;
//
Pwm_Init(1000000); // 1Mhz
PR2 = 2;
/*
1666Khz 2
1250Khz 3
1000Khz 4
833Khz 5
714Khz 6
625Khz 7
555Khz 8
500Khz 9
*/
Pwm_Change_DutyEx((PR2 * 4) / 2);
Pwm_Start();
//
temp = GPIO & 0b00010011;
while (1) {
if (temp != (GPIO & 0b00010011)) {
temp = GPIO & 0b00010011;
switch (temp) {
case 0b00000000:
PR2 = 9; // 500Khz
break;
case 0b00000001:
PR2 = 8; // 555Khz
break;
case 0b00000010:
PR2 = 7; // 625Khz
break;
case 0b00000011:
PR2 = 6; // 714Khz
break;
case 0b00010000:
PR2 = 5; // 833Khz
break;
case 0b00010001:
PR2 = 4; // 10000Khz
break;
case 0b00010010:
PR2 = 3; // 1250Khz
break;
case 0b00010011:
PR2 = 2; // 1666Khz
break;
}
Pwm_Change_DutyEx((PR2 * 4) / 2);
}
}
}
//**********************************************************************
===== 動作確認 =====
水晶は手持ちの、20.0000Mhzのクロックモジュールを使用、周波数の切り替えは、3個のディップSWで、
同調は2個のOSCコイルと2連バリコンで行いました。
{{:imgpaste:202004:htmikan-20200428-162438.png?500}}
{{:imgpaste:202004:htmikan-20200428-162454.png?500}}
{{:imgpaste:202004:htmikan-20200428-162507.png?500}}
上段が(A)PICの出力波形です。
下段が(B)2段の同調回路を通った後の波形です。
若干、方形波の立下りに歪が発生します。
{{:imgpaste:202004:htmikan-20200428-162541.png?500}}
流石にクロックモジュールの精度が高いので周波数は結構安定しています。<1Mhz設定時>
{{:imgpaste:202004:htmikan-20200428-162608.png?500}}
安定した周波数をAMラジオの範囲で8段階に設定できるのでとても便利です。
これをベースにして、AMワイヤレスマイクを作成しようと考えています。
このページは稲崎様の閉鎖したHPのコピーで、著作権は稲崎様にあります。[[elechobby:picdic:picdic|詳細]]
This page is a copy of Mr. Inasaki's closed website, and the copyright is held by him.[[elechobby:picdic:picdic|Details]]