2014年12月7日日曜日

mbedで正弦波を出力

ちょっとやってみたいことがあり、STM32F1でADCを動かしています
データシートを見る限りでは無理そうですが、ものは試しということで
で、ADCの動作確認にてきとーなサンプルがほしいのですが、うちにはファンクションジェネレータは無いし、それらしいものもありません
ということでmbedから波形を出力してみました

mbedのp18は10bitのDACが接続されており、任意の電圧を出力することができます
波形はSIN関数を使うことでテーブルを持つ必要はありません
今回はテストに使うだけなので波形を出力する機能しかありません

Timerで現在の時間を獲得し、時間にほしい周波数を掛けて、1とのmodを取ることによりほしい周期で0-1になります
あとはこの0-1にPI*2を掛けてやれば0-2piの間を直線で移動します
この直線をsinに渡してやれば-1から1の間を取る波形になるので、これを2で割ってから0.5を足しています

多分ソースコードを見たほうがわかりやすいと思うので、貼り付けておきます

#include "mbed.h"
#include <math.h>

DigitalOut myled(LED1);
Timer tim;
AnalogOut aout(p18);

int main() {
    const float freq = 250;
    tim.start();
    
    while(1) {
        float s = tim.read();
        myled = ((int)s) % 2 == 0; /* LED output(0.5Hz) */
        aout = 0.5 + (sin(fmodf(s * freq, 1) * 3.14159265359 * 2) / 2);
    }
}

このサンプルでは250Hzの正弦波を出しています
三角波とか矩形波が欲しい場合は、もう一工夫が必要ですが、気が向いたら実装します

で、この波をSTMのADCで読んでFFTを通してみました
250Hzのあたりに結構鋭い尖りがあります
結構綺麗な波が出ているようです

0 件のコメント:

コメントを投稿