スピーカーを付けて音を出してみよう

アンプを作る

チェックのための簡単なアンプを作ります。DAコンバーター(AnalogOutクラスを用いる)はp18でのみ使えます。
このDAコンバーターはスピーカーを鳴らすほど電流出力はありませんので、アンプをつなぐ必要があります。
通常、スピーカーを繋げるのならばアンプとしてLM386あたりを用います。しかし、LM386の電源は最低でも4.0Vで、mbedの電源は通常3.3Vです。USB使用時の時は5V、あるいは外部電源を利用すればそれ以外の電源電圧を用いることはできます。ここでは、2N7000を用いて簡単なソースフォロワ回路で電流増幅をしてみます。
回路図は以下のようになります。動作点を綺麗に決められなかったので、半固定抵抗を用いています。



1kHzの正弦波を出力するプログラム
#include "mbed.h"
#include 

AnalogOut daval(p18);    // 10bit

int main()
{
  const int n = 20;
  float delta=2*M_PI/n;
  short table[n];
  float x=0;
  for(int i=0; i<n; i++){
    table[i] = (short)(32767*(cosf(x)+1.0));
    x += delta;
  }
  while(true)
  {
    for(int i=0; i<n; i++ ){
      daval.write_u16(table[i]);
      wait_us(50);
    }
  }
}
 1 
 2 
 3 
 4 アナログ出力
 5 
 6 
 7 
 8 2πをn分割する。n=20
 9 2πをn分割した値
10 一周期n個のcos表
11 
12 
13 floatは時間がかかりそうなので、shortにし、
14 かつ、配列を用いる。shortは65535が最大だから、
15 最大32767*2を用いる
16 
17 
18 
19 shortの配列の内容をDAで出力。
20 50μs×20個=1000μs=1ms→1kHz
21 
22 
23 


PWMを用いたDA

mbedではDAコンバータは1チャンネルしかありません。周波数は低くても良いが、とに角電圧の出力を作りたいときにはどうしたら良いでしょうか?
チョッパ制御というものを用います。簡単に言えばパルス幅変調の応用になります。
回路は簡単で、パルス幅変調の出力を積分回路に通すだけです。積分回路の一番簡単な回路はCR積分回路で、ここではこれを用いました。
コンデンサの値は0.01μF、抵抗は4.7kΩです。従って、時定数CR=0.01e-6×4.7e3=0.047e-3=47e-6=47μ秒となります。これを周期100μ秒のPWMを入れてあげれば、それらしくなります。
下図では、VIが入力信号でPWMです。VOが積分結果でアナログ信号になります。実際にはアンプに入れないと意味がありません。



次のプログラムは250Hzの正弦波を作るプログラムです。
PWMを用いたDA
#include "mbed.h"
#include 

PwmOut da(p21);

int main()
{
  da.period_us(100);
  const int n = 20;
  float delta=2*M_PI/n;
  short table[n];
  float x=0;
  for(int i=0; i<n; i++){
    table[i] = (short)(49*(cosf(x)+1.0));
    x += delta;
  }
  while(true)
  {
    for(int i=0; i<n; i++ ){
      da.pulsewidth_us(table[i]);
      wait_us(200);
    }
  }
}