
■ ハードウェアTimerのPWMモードで、Sin波形を発生 ■ |
AVRマイコンのハードウェア・タイマーを、PWMモードで動作させ、ポートからSin波形を発生させるプログラムです。
スピーカーを取り付けると、音を鳴らすことができます。
また、プログラムにより、音量も変化させることができるので、方形波のSOUND命令よりも、用途が広がります。
回路の概要 |
1.電源回路
・電源電圧は、AVRマイコンに合わせて、任意の電圧で動作できます。
2.AVRとクロック
・AVRマイコンは、PWMモードを搭載した各種のチップに変更が可能です。
(フラッシュメモリー 4Kbyte以上、EEPROM 256byte以上)
・AVRのクロックは、8MHzの内蔵RC発振器を使用しています。
(外部Xtalを使用すると、発生周波数の精度が格段に上がります)
・8MHz以外の周波数でも使用できます。 (プログラムの$crystal命令を修正して下さい)
3.PWM (Pulse Width Modulation)
・PWM(パルス幅変調)は、キャリア(搬送波)のパルス幅(デューティー比)を変化させて
出力の平均電圧を変え、任意のアナログ波形を取り出すことができます。
・出力には上記のようにキャリア(今回は31,250Hz)の信号も含まれますが、人間の耳には
聞こえないので、アナログ波形成分だけが音として聞こえます。
・出力をローパスフィルタで、可聴周波数(20,000Hz)以上を遮断すると、音がクリアになります。
4.スピーカー
・スピーカーの選定条件は特にありませんが、スピーカーのインピーダンスによって、直列に
入れてある抵抗値を変更して下さい。
・プログラムの書き込み時は、書込器によって、スピーカーを外しておかないと、書き込みが
できない場合があります。
・Sin波形のため、方形波と同等の音量は得られませんので、音量を確保する場合は、
オーディオアンプを接続して下さい。
・Sin波形の出力ポートは、[OC0A] ピンです。
・このプログラムは、31,250Hzの基本周波数(AVRクロックが8MHzの場合)の、パルス幅を変化
させてSin波形を重畳していますので、出力ポートには、基本周波数のパルスと発生させる
Sin波の、両方の波形が出ています。
・使用したスピーカーは、その特性から31,250Hzの基本波を再生できず、人間の耳にも聞こえ
ないので、発生させたSin波の音だけが聞こえます。
・しかし、オーディオアンプで増幅すると、基本周波数のパルスがノイズとなって増幅されるため、
簡単なRCフィルターを通して基本周波数を減衰させて下さい。
・オシロスコープ等で観測する場合も、RCフィルターを通したあとで、Sin波形が見られます。
|
使用前の準備 |
AVR ATtiny45のシステム クロックは、工場出荷時に1/8前置分周器が有効に設定されているので、これを無効にするため、AVRのヒューズ
ビットを書き換える必要があります。
また、内蔵EEPROMを使用しているので、電源ON/OFF時に起こるAVRの暴走を防止するために、BODリセットを有効にして下さい。
下記ページの書き換え方法 「6.」を、以下の様に変更して、ヒューズ
ビットの書き換えを行います。
ヒューズ ビット書き換え
6.[
Fusebit H ] の右欄 [ 0:Divide clock by 8, ON ]
をクリックすると、右側にプルダウン メニューが現れますから、 [ 1:Divide clock by 8, OFF ] を選択します。
6.[
Fusebit 543 ] の右欄 [ 111:BOD disabled ]
をクリックすると、右側にプルダウン
メニューが現れますから、 [ 100:BODLEVEL 4.3 V ] を選択します。
「AVRWRT」 ライターの場合は、AWRTf_PwmSin.gif
|
注意! 著作権は放棄しておりませんので、販売目的での使用は絶対にしないで下さい。 (記事の無断転載を除き、個人での使用は可能です。 改変、自作品の掲載、リンクもご自由に。)
|
プログラムの使用方法 |
1.動作条件の設定
・$regfile = 使用するAVRの、レジファイル名を設定して下さい。
・$crystal = 使用するAVRの、クロック周波数を設定して下さい
・Const Wav_frq = 1000 発生させるSin波形の周波数を設定して下さい。
|
2.プログラムの動作
・このプログラムでは、Sin波形のデータをSin関数で算出しているので、事前にROMデータを
作成する必要はありません。
・AVRに初めてプログラムを書き込んだ際に、AVR内部のEEPROMをチェックし、Sin波形データが
無ければ、データを作成しEEPROMに書き込みます。
・Sin波形データは、Cos 0°〜180°の半波形だけを作成し、180°以降はデータを反転して
使用します。
・次回のパワーオン時からは、EEPROMのSin波形データを使用します。
・ハードウェアTimerにより、基本周波数の間隔で割り込みが発生し、Sin波形の周波数に合わせた
間隔でEEPROMデータを読み出して、パルス幅を変化させています。
|
3.発生周波数の可変方法
・メインルーチンで、波形ROMポインターの加算値を再計算し、変数 [Poiadd] を可変すると、
随時周波数を変えることができます。
・発生周波数は 1〜約10,000Hzですが、4,000Hz以上は、サイン波形が崩れて行きます。
Templ1 = Wav_frq * 256
Templ1 = Templ1 / Wavdiv
Poiadd = Templ1 |
'Wav_frq = Sin波形の発生周波数。
'ポインターの加算値を算出。
'ポインターの加算値(16bit)を格納。 |
|
4.音量の可変方法
・音量を変化させる場合は、割り込み処理内で、波形ROMデータが入っているレジスタ [R22] に
割り算を加えてから、Timer0の比較器A [OCR0A] に格納して下さい。
(Tm0int2: 部分)
・実際のプログラムでは、8bitの掛け算ルーチンで高速に処理したいので、
「ROMデータ × 音量値 ÷ 256」と言う計算をしています。
・「Volume」というByte型変数を追加してありますので、メインルーチンで0〜255の値を入れると、
音量が変化します。
・音量は対数になっていませんので、必要に応じて自然対数変換をして下さい。
|
|