HOME

 4)D/Aから何か波形を出してみる

  miniDDS試作はこちら

 DAからなにか出力してみようと思います。トラ技ではSIN波形なので、トラ技オリジナルのプログラムを改造して分割数を上げる実験をしました。

DA出力の分割数について

 分割数が多ければそれだけ高い周波数がだせなくなります。最低500Hzにはしたかったので分割数を256としました。つまり出力周波数の分割数倍のサンプリング周波数が必要になります。

  サンプリング周波数 = 500Hz × 256 = 128KHz

 このサンプリング周波数をタイマー割り込みで発生させ、DAに割り込み1回に1個のサンプリングデータを出力し続ければ、256回で1周期の波形になります。

データの作成方法について

ソフトウエア的にはRAMではなくFlashROMの領域にデータを作りました。といっても

const unsigned int dat[256] = { x,x,x,x,・・・・・};

としてVC++等で作成したデータを貼り付けて使用しました。

 VC6で作ったDOSベースのプログラム 

 実行ファイルをsin.exeとした場合、 c:\sin 256 > sin.txt でC言語のデータがファイルに出来ます。ファイルをMSP430のプログラムにコピーペーストします。下のプログラムはVC6のものです。これをMSP430のプログラムに書き加えてもデータはできません。これを使えば1024データも作ることができますが、先述したように高い周波数が出せなくなります。

int main(int argc, char* argv[])

{

        if(argc!=2){

                printf("usage : sin 256\n");

                return 0;

        }

 

        int n = atoi(argv[1]);

        double pi = 3.141592653;

        unsigned short d;

 

        printf("/* Sin Wave Data for MSP430-CQ [%d分割] */\n", n);

        printf("const unsigned int dat[%d] = {\n", n);

 

        for(int i=0; i<n; i++){

                d = (unsigned short) (sin(2.0 * pi * (double)i / (double)n) * 2000.0 + 2047);

                printf("%d,",d);

                if(i%20==19) printf("\n");

        }

 

        if(n%20!=19) printf("\n");

        printf("};\n");

 

        return 0;

}

実際の波形

 オシロで波形を見ると256分割なのでトラ技2007.1紙面P.160の64分割よりはきれいに見えます。高級なデジタルオシロは別として、アナログオシロはデジタルオシロよりきれいに見えるせいかもしれません。 しかし64分割の方が出せる周波数は高くなります。

 なお分割数によるひずみはまったく考慮していません。それと実験なのでDAC出力のあとのローパスフィルターやアンプ等をつけていません。

設定周波数500Hz  0.5V/div   0.5msec/div

設定周波数500Hz 0.5V/div   0.2msec/div

 

プログラムを動かしてみての考察

 割り込みを使わないでループでDA出力するとお任せ周波数ですが、もっと高い周波数がでます。またCPUクロック、割り込み周期、割り込み内の処理クロック数(EW430で確認)が単純計算上は間に合っていても、処理クロック数が割り込み周期に近づくと、その周期で割り込みが発生しなくなる?こともわかりました。これは割り込みのオーバーヘッドタイムでもあるのでしょうか。あと、MSP430F4XXXの3.3Vでの動作保証周波数範囲は7.36MHzらしいのですが、8MHzのオーバークロックでも動くようです。壊れるとまずいので、一瞬試してすぐに6MHzに落としました。電源電圧によって動作保証周波数が決まっているようです。トラ技2007.1月号P.117の表のCPUのところにMCLK=8MHz Vcc=3.6Vとあるのはこのことだと気づきました。

 

 プログラム

  Sin波形DA出力プログラム

 1周期の分割数256のSin波形の出力ができます。設定周波数は1Hz〜600Hz可変(1Hz単位)でプログラム上にて指定しますが、だいたいの値になります。正確ではありません。これはCQ基板上のC1,C2の水晶用コンデンサが未実装のため、水晶から作っているメインクロックに誤差があるためと、タイマー割り込みの誤差によるものです。

Sin Wave は設定周波数

TimerFreqはタイマー割り込みの周波数(設定可能な一番近い周波数)

 

 

周波数カウンターの値

 

 再コンパイルにて周波数を可変できるプログラム(スイッチ未使用)。最大設定周波数は600Hzです。タイマー割り込みの誤差により出力される周波数は若干ずれます。

 EW430, mspgcc共通   ダウンロード(zipファイル) Ver1.1a 2007.1.27

 

 2つのPushSwitchの単発押し、長押しにより、周波数を+1、−1、+100、−100できるようにしました。最大設定周波数は600Hzです。タイマー割り込みの誤差により出力される周波数は若干ずれます。

 EW430, mspgcc共通   ダウンロード(zipファイル) Ver1.2 2007.1.27

 

 miniDDS試作  <New>

 miniDDSのMSP430版試作です。AVRのminiDDSソフトを参考にしました。たいへんすばらしいソフトです。知らない方は以下のサイトをご覧ください。

http://www.myplace.nu/avr/minidds/index.htm

 違いはCPUのほかに、AVR版ではラダー抵抗を使っていますが、MSP430はもちろん内蔵12ビットDAC使用です。電源さえ用意すればMSP430-CQ基板単体で実験ができます。(DAC出力CN2-18)

 考えかたを真似してアセンブラソースを作りました。256分割波形テーブル、24ビットカウンター、カウンターのうち上位8ビットはテーブル参照する等です。MSP430のアセンブラがはじめてだったので、まだまだ改良の余地があります。

 PCとのシリアル通信はまだできません。それもSIN波形1KHz固定です。基板によってメインクロックが異なりDAC出力波形が1KHzにならないかもしれません。その場合はソースのテーブル加算値を変更してみてください。

 MSP430のメインクロック6.160MHzはもともと水晶32.768KHzの低周波から作られているせいか、DACで作った波形も揺らいでいます。

追記 揺らぎの原因がわかりました。MSP430固有の問題だと思っていましたが、テーブル加算値が8000hex等の端数が無いようにしないと、DAC出力波形の形状が変化することがわかりました。SIINテーブルを順に出力しているなら、このような現象はおきないのですが、24ビットカウンターによってSINテーブルを間引いて出力しているため、同じ位置ではないテーブル参照し波形が微妙に変化するのです。(オシロでみると左右に揺れてみえます。)

 DAC出力波形の周波数の小数2桁目はいまいち変動が大きいようです。最小ステップを求めると

         MCLK = 6160677.5Hzのとき  ( MSP430-CQ基板のMCLK実測値 )

         最小ステップ = 6160677.5 / (224 x 12) = 0.03060041616 (Hz)

         fDAC(Hz) = テーブル加算値 x 最小ステップ

         999.9909997(Hz) = 7fa7h x 0.03060041616

 のはずですが、MSP430のメインクロックが安定しないとこの最小テップの実現は厳しいのかもしれません。 12倍しているのはLOOPが12クロックのためです。MSP430だとオリジナルのAVR版のようにDAC出力LOOPが9クロックにならず12クロックになってしまいました。sinテーブルが16ビットのワードアクセスなのでこの変換が余計なクロック増加になってしまいました。作業途中まで9クロック以下をめざしていたのですが。。。 どなたかアセンブラを駆使して、もっと少ないクロックに挑戦してみてください。

 EW430専用   ダウンロード(zipファイル) Ver1.1 2007.2.11

Release¥ExeにMSP430_miniDDS.a43があるので

a43ファイルの書き込みだけでも可 

プログラムを動かしてみての考察

 実は10KHzのSIN波形が階段上になっているので、波形1周期のデータ数を8192まで上げて実験しました。なんと29ビットカウンターです。ところがLOOPのクロック数が逆に2クロック増えて14クロックになってしまい、波形が滑らかになりませんでした。このことからDACへのデータ出力間隔が重要だとわかりました。解決方法の1つに電源電圧を3.6Vに上げてメインクロックを最大の8MHzまで上げる方法もありますが、低消費電力CPUなのでメリットがあるかですね。

 

inserted by FC2 system