■ ハードウェア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



プログラム  テキスト形式 ソースファイル  SinEEP301.TXT (7KB)
 BASCOM-AVR用 ソースファイル  SinEEP301.bas (7KB)
 インテルHEX形式 オブジェクトファイル  SINEEP301.HEX (6KB)
 
 注意! 著作権は放棄しておりませんので、販売目的での使用は絶対にしないで下さい。

       (記事の無断転載を除き、個人での使用は可能です。 改変、自作品の掲載、リンクもご自由に。)


プログラムの使用方法
 
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: 部分)

音量可変
バージョン
プログラム
 テキスト形式 ソースファイル  SinEEP351.TXT (9KB)
 BASCOM-AVR用 ソースファイル  SinEEP351.bas (9KB)
 インテルHEX形式 オブジェクトファイル  SINEEP351.HEX (7KB)

 ・実際のプログラムでは、8bitの掛け算ルーチンで高速に処理したいので、
  「ROMデータ × 音量値 ÷ 256」と言う計算をしています。
 ・「Volume」というByte型変数を追加してありますので、メインルーチンで0〜255の値を入れると、
  音量が変化します。
 ・音量は対数になっていませんので、必要に応じて自然対数変換をして下さい。




   電子工作の部屋 Top へ 前のページへ戻る