CQ出版社インターフェース誌の2017年8月号で解説している,固定小数点演算で sin 関数の値を求める二つの関数を比較するためのプログラムの全体.

Dependencies:   mbed

CMSISmain.cpp

Committer:
MikamiUitOpen
Date:
2017-08-02
Revision:
0:9b1d4712f862

File content as of revision 0:9b1d4712f862:

//----------------------------------------------------------------------
//  自作 Sin16() と ARM の arm_sin_q15() の実行時間の比較
//      arm_sin_q15.c は自分でインポートする必要がある
//  2017/03/01, Copyright (c) 2017 MIKAMI, Naoki
//----------------------------------------------------------------------
#include "mbed.h"
#include "SinCosFixed.hpp"  // Sin16() 用
#pragma diag_suppress 3108  // arm_sin_q15() で,コンパイル時に出る warning 抑制のため
#include "arm_math.h"       // arm_sin_q15() 用

const int TS_ = 10; // 標本化間隔:10 μs

Ticker timer_;
AnalogOut da1_(A2);
AnalogOut da2_(D13);
DigitalOut dOut_(D2);

const int DX_ = 997;
int16_t phi1_ = 0;
int16_t phi2_ = 0;

void TimerIsr()
{
    dOut_ = 1;
    int16_t sn1 = Sin16(phi1_);         // 300 ns(実測値)
    dOut_ = 0;
    wait_us(2);
    dOut_ = 1;
    int16_t sn2 = arm_sin_q15(phi2_);   // 570 ns(実測値)
    dOut_ = 0;
    
    phi1_ += 2*DX_;
    phi2_ = (phi2_ + DX_) & 0x7FFF;
    
    da1_.write_u16(sn1+32768);
    da2_.write_u16(sn2/2+32768);
}

int main()
{
    timer_.attach_us(&TimerIsr, TS_);
    
    while (true) {}
}