TMR2とPWMによるトーンジェネレータ

トーンの音質


パドル(横振り電鍵)でモールス符号を発生させるキーヤをいろいろつくりました。パドルはモニタ音を聞きながら操作します。このモニタ音、通称サイドトーンは発振器内蔵のブザーを使うと簡単ですが、ブザー音は周波数1,000から2,000ヘルツ位あるので聞きづらいことがあります。 デバイス内で 800ヘルツ程度の低周波を発生させてスピーカを鳴らすと聞きやすくなります。

ある出力ポートが 625μ秒の間 ON 次に 625μ秒 OFF となるルーチンをつくり、モールス符号が出ている間、繰り返せば 800ヘルツの低周波がとりだせます。これでアンプを経由してスピーカを鳴らせばよいわけです。
でもキーヤが高度化?して点(線)を出しているとき線(点)のパドル入力があるか、あったら記憶するなどのサブルーチンを入れると 800ヘルツの低周波は位相がづれたようになり濁った音質になることがあります。

デバイスに内蔵されているタイマ TMR2 と PWM を使って低周波音を発生させるとプログラムの変化に関係なく一定の音質にすることができました。


次は PIC18F452 を使いクロック 10MHzのときの 800Hz トーン発生テストプログラムです。
   
;コンフィグに次を入れておく
__CONFIG      _CONFIG3H,  _CCP2MX_ON_3H
;T2CON(TIMER2)設定
MOVLW B'00000111' ;TMR2 ON   プリスケーラ 1:16
MOVWF T2CON
MAIN CALL SD_TONE_800 ;トーン ON
CALL DLY1S ;1秒のサブルーチン
CALL SD_TONE_STOP ;トーン OFF
CALL DLY1S ;1秒のサブルーチン
BRA MAIN ;繰り返す
SD_TONE_800 MOVLW 194 ;周期設定値 194を
MOVWF PR2 タイマ2 周期レジスタに入れる
MOVLW B'01100001' ;デューテイサイクルを 50%としその
MOVWF CCPR1L ;上位8ビットを CCPR1Lに入れる
MOVLW B'00111111' ;下位2ビットとPWMモード設定値を
MOVWF CCP1CON ;CCP1CONに入れる
RETURN
SD_TONE_STOP CLRF CCPR1L ;デューテイサイクル上位8ビットの値と
MOVLW B'00001111' ;同下位2ビットの値を消す**
MOVWF CCP1CON :PWMモードはそのまま
RETURN
;デューテイサイクルの値は 10ビット幅 で上位 8ビットを CCPR1L レジスタに入れ
;下位 2ビット は CCP1CON レジスタの bit5-4 に入れます。
;CCP1CON のbit3-0 は PMW モードにするため 11xx を入れます。

;PIC16F8XX等のデバイスでは PR2 レジスタのためにバンク切り替えが必要です。
;なおMAIN ルーチンへ戻るコマンド BRA は GOTO に変えます。

**
;T2CON レジスタの bit2で TMR2 を ON-OFF できますがこれを頻繁に操作すると
;音質が悪くなるので デューテイサイクル をゼロにして音を止めています。

;800Hzの周期=1/800=1,250μSec

;PWM 周期=(PR2+1)・4・Tosc・TMR2プリスケーラ値
; =(194+1)x4x0.1x16≒1,250μSec 実際にはこの時間から逆算して
;PR2を求めた。

;PWM デューテイサイクル
; ={CCPR1L(8ビット),CCP1CON(2ビット)}・Tosc・TMR2プリスケーラ値
; ={0110 0001 11}x0.1x16=391x0.1x16≒625μSec
;このデューテイサイクルは 50%です デューテイサイクルを周期以上に大きくすると発音しません

;注:
;PWM はデバイスのパルス幅変調モード
;周期はパルスが1回 ON-OFFになる時間で 1/周期=周波数
;デューテイサイクルはONとなったパルスの時間(長さ)

2005.2.20

PWMによって発生させた低周波の波形は矩形波です。
800Hzの低周波のとき出力側に 0.47μF + 100mH + 0.47μFを
組合わせたパイ型フイルタを入れると波形はほぼ正弦波になりました。
PIC の出力ポートから出る矩形はは若干直流分を含んでいるため
出力ポートとフイルタ間に0.47μFを直列にいれて直流分を遮断しないと
トーンの出た瞬間、波形がやや乱れます。

2005.5.15


上記のプログラムを PIC16F819 用に移植しました。クロックは同じく 10MHz です。
次の点を変更する必要がありました。

1)出力はRB2かRB3になるので __CONFIG の中で指定します。
  RB2 を使いたいのであれば _CCP1_RB2
  RB3 なら _CCP1_RB3 とします。

2)その出力ピンに対応した設定を TRISB でおこないます。

3)レジスタの BANK に注意しなければなりません。
  T2CON レジスタ は BANK 0、 PR2 レジスタは BANK 1 にして設定します。

2006.3.1 追記

 
PIC目次へ         トップページへ