PWM SIMPLE DAC ON KURUMI

Jpeg
RL78/G13のPWM出力で、圧電スピーカから音を出してみましたが単音で寂しいので和音が出せないか考えました。DACを使えばできそうですが、DACがないので音信号をオーバーサンプリングして、PWMで簡易DACでPIEZO SPEAKERを鳴らす方法をやってみました。
DACの分解能は、大きくするとPWMの周期が伸びてしまうし、8bitより多くほしかったので9bit(512)としました。PWM周期TDR00に511を設定しました。
音は、正弦波とするため、EXCELでサインのテーブルを作成します。テーブルの配列長を決める必要があります。多い方が良いのですが、メモリを使うので今回は、3度間隔の120個としました。
PWMの周期(512)が終わるごとに割り込みを入れてTDR01の値を変えていきます。120個のテーブルを1周する時間がその時の音の高さになります。 32MHzの時は、PWM周期が32MHz/512になるので62500Hzになります。440HzのAの音の場合、62500/440=142となります。
142回で120個のテーブルを1周回すことになります。
テーブルのインデックスは、i=(PWM周期カウンタ%142)*120/142で算出しました。
音階を固定した音は、32MHzクロックで動かすことができましたが、割り込みに音階処理を入れると処理がPWM周期内に終わらず、不具合を起こすので、16MHzクロックに変更しました。C-D-E-F-G-A-Bと1秒ごとに音階を刻むことができました。しかし、音が小さいです。耳を近づけないと聞こえません。
次は、和音に挑戦です。3度上の音を足し合わせます。CとEのDAC値を足し合わせてPWMのTDR01に設定てします。ただ、そのまま足すとDACの上限512を超えてしまう時があるので、元のSIN信号のテーブルを半分の256振幅に変えました。
ここでまた、処理時間の問題が発生しました。信号が2つになったのでテーブルの検索が2倍になったので仕方ないのですが・・・。PWMのクロックを8MHzクロックにしました。
単音の振幅を半分にしたので更に音が小さくなり、正直、音階が上がっていくのはわかりますが、和音かどうか微妙です。PIEZO SKEAKERの前にCRでLPFを入れてみましたが、影響はわかりませんでした。音が小さすぎるのでこの試みは終了とします。

PIEZO SPEAKER ON KURUMI

RL78/G13のPWM出力で、圧電スピーカから音を出してみました。
Jpeg
圧電スピーカは、以下の物を使用しました。
圧電スピーカー(圧電サウンダ)(22mm)PKM22EPPH2001-B0
http://akizukidenshi.com/catalog/g/gP-04120/

TAU_PWM_Outputサンプルから改造しました。
タイマーの設定は、TDR00を音階の周波数に、TDR01にその半分の値を入れてデゥーティー比50%のPWM出力を設定しています。 システムクロックは、32MHzで64分周して500kHzをPWMのクロックに使用しました。

A = 440Hzから平均律の計算で各音階の周波数を計算して、カウンタ値を決定しました。
#define _0_A    2273
#define _0_As   2145
#define _0_B    2025
#define _0_C    1911
#define _1_Cs   1804
#define _1_D    1703
#define _1_Ds   1607
#define _1_E    1517
#define _1_F    1432
#define _1_Fs   1351
#define _1_G    1276
#define _1_Gs   1204
#define _1_A    1136   //440Hz
#define _1_As   1073
#define _1_B    1012
#define _2_C    956
#define _2_Cs   902
#define _2_D    851
#define _2_Ds   804
#define _2_E    758
#define _2_F    716
#define _2_Fs   676
#define _2_G    638
#define _2_Gs   602
#define _2_A   568

接続は、TO01のD3を圧電スピーカの+端子に接続し、圧電スピーカの-端子をGNDに接続しただけです。
インターバルタイマで1秒ごとに音階を切り替えるプログラムを作ってみました。
チープな音が出て、それはそれで満足なのですが、単音しか出せないのがちょっと寂しいです。

PWM 6CH ON KURUMI

Jpeg
4CHのPWM出力を行う目的のためにRL78/G13の兼用ピンの使用を行ってみました。 周辺I/Oリダイレクション・レジスタ(PIOR)を使用して設定します。 GR-KURUMIは、48ピンですです。PIOR0に1を設定するとTI07/TO07~TI02/TO02がP10~P15に割り当てられます。6本のタイマ・カウンタ入出力が使用できるようになります。今回はこの内、5本のPWMの出力を使用してみます。TO07~TO03がP10~P14を使用します。

ポート      タイマ       KURUMI PIN
P10       TO07   –   D6
P11       TO06   –   RXI
P12       TO05   –   TTXO
P13       TO04   –   D9
P14       TO03   –   D10
P15       TO02   –   D5

※UART0、UART2は、使用できなくなります。
PWMの出力状況は、LEDで確認しました。

PWM on Kurumi

Jpeg
DC Moter制御の準備としてPWMを動かしてみようと思います。e2 studio用のサンプルTAU_PWM_Outputを利用しました。タイマアレイユニット(TAU)でPWM出力を行います。
TAU0のCH0をタイマとして使用します。
TAU0のCH1をPWM出力1として使用します。
TAU0のCH3をPWM出力2として使用します。
P16/TO01出力      D3-KURUMI
P31/TO03出力      D4-KURUMI
P10/LED出力        D6-KURUMI
D6は、250msecで点滅。D3は、10%~90%の範囲のデューティー比を20%ステップで変化。 D4は、10%~90%の範囲のデューティー比を10%ステップで上下変化させました。
狙いの動作ができました。次は、モータに繋いでみようと思います。