不韋 呂
/
CQ_FixedPointSin_CMSIS
CQ出版社インターフェース誌の2017年8月号で解説している,固定小数点演算で sin 関数の値を求める二つの関数を比較するためのプログラムの全体.
Diff: CMSISmain.cpp
- Revision:
- 0:9b1d4712f862
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/CMSISmain.cpp Wed Aug 02 12:01:51 2017 +0000 @@ -0,0 +1,44 @@ +//---------------------------------------------------------------------- +// 自作 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) {} +}