RXマイコンをファンクションジェネレータにするライブラリ
RXマイコン(RX621/RX62N/RX63Nなど)には10bitのDAコンバータと、DMAコントローラが内蔵されています。
これらの内蔵ペリフェラルを使ってファンクションジェネレータを作るためのライブラリを作成しました。
typedef enum {
CONTINUOUSDAC_MODE_CH0 = 0, // ch0のみ出力
CONTINUOUSDAC_MODE_CH1 = 1, // ch1のみ出力
CONTINUOUSDAC_MODE_BOTH = 2, // 両チャネルから出力
} ContinuousDacMode;
bool dac_continuous_wave(ContinuousDacMode mode,unsigned short *waveform,unsigned long datacount)
この関数は、内蔵タイマのCMT2を使って1MHzのトリガを発生させ、そのトリガを使ってDMAコントローラを起動し、メモリ上の内容を繰り返しDAコンバータに出力するというものです。
なお、QFP100ピンまでのRXマイコンはDAが1chしかありません。QFP100以下ではDA0がなくDA1のみ使用可となっています。144ピン以上であればDAは2ch使うことができます。
まず、究極のRX62Nボードで実験してみます。このボードはBGA176ピンなので2ch取れます。
X=12sin(2πt)と、Y=13sin(2πt)で2つの正弦波を発生させて
オシロでXYモードにしてみたところ、
このようなリサージュ図形が描けました。
この波形はメモリ上に格納されている配列の中身をDMAで自動的にDACから出しているので、CPUは止まっていても大丈夫です。JTAGデバッガで停止させても、ペリフェラルが勝手に出し続けてくれます。
簡単なリサージュ図形ではつまらないので、このページ(http://d.hatena.ne.jp/Hyperion64/20110916/1316167090 )で紹介されていた「Madness」というリサージュ図形を描かせてみました。
このようにしてあらかじめ波形を作りこんでおきます。
for (int i=0;i<datasize;i++) {
dacwave[i*2+0] = 512 + 0.7 * 256 * (sin(0.99*(float)i/datasize*100*3.141592) - 0.7*cos(3.01*(float)i/datasize*100*3.141592)); // ch1
dacwave[i*2+1] = 512 + 0.7 * 256 * (cos(1.01*(float)i/datasize*100*3.141592) + 0.1*sin(15.03*(float)i/datasize*100*3.141592)); // ch0
}
静止画像にしてしまうとあまり綺麗に見えませんが、オシロ上では動いて見えて面白く、綺麗です。
実は、このDAコンバータの使い方やDMACの使い方は、RX62とRX63で全く同じだったので、この関数をそのままRX63Nマイコンで動かしてみました。
まずはGR-SAKURAを使って、配列に16段階の階段状の波形を入れておいて、自動出力させてみました。この関数は2~128Mポイントまでの、2^N周期の任意の波形を作り出せます。
GR-SAKURAは100ピンなので、DAが1chしかないのでリサージュ図形は描けません。
そこで、北斗電子さんのHSBRX63NCを使って同じリサージュ図形を描いてみました。このボードは176ピンのRX63NなのでDAが2ch取れます。また、SDRAMも搭載されているので周期の長い波形も出せると思います。
今回の実験で用いたDAC&DMACサンプルプログラムのソースコードをhttps://www.tokudenkairo.co.jp/login2/download.php?searchtext=fg にアップロードしました。
「特電お客様サイト」にログインできる方(つまり、特電のお客様)であれば誰でもダウンロードできるようにしました。
つまらないものですが、DMACの使い方の例としてご活用いただければ幸いです。
なお、次回のFreeRXduinoライブラリ Version1.2にこの関数が取り込まれる予定です。
| 固定リンク








コメント