(左)Nucleo F401RE、(右上)Arduino Pro Mini、(右下)Nucleo F303K8
画像の通りかなりコンパクトで、USBシリアル変換基板も不要。基板は両面実装でメインMPUのSTM32F303のほかに裏面にSTM32F103が載っている。
STMF303はCorete-M4ベースでDACも2つ(3ch)搭載されている。
内蔵DAC
mbedでプログラムを書いてDACの出力を見てみた。
main.cpp
#include "mbed.h" AnalogOut my_output1(PA_4); //AnalogOut my_output2(PA_5); //AnalogOut my_output3(PA_6); #define PI (3.141592653589793238462) #define AMPLITUDE (1.0) // x * 3.3V #define PHASE (PI * 1) // 2*pi is one period #define RANGE (0x7FFF) #define OFFSET (0x7FFF) // Configuration for sinewave output #define BUFFER_SIZE (360) uint16_t buffer[BUFFER_SIZE]; void calculate_sinewave(void); int main() { printf("Sinewave example\n"); calculate_sinewave(); while(1) { // sinewave output for (int i = 0; i < BUFFER_SIZE; i++) { my_output1.write_u16(buffer[i]); //my_output2.write_u16(buffer[i]); //my_output3.write_u16(buffer[i]); } } } // Create the sinewave buffer void calculate_sinewave(void){ for (int i = 0; i < BUFFER_SIZE; i++) { double rads = (PI * i)/180.0; // Convert degree in radian buffer[i] = (uint16_t)(AMPLITUDE * (RANGE * (cos(rads + PHASE))) + OFFSET); } }
mbed repository:
https://developer.mbed.org/users/ryood/code/Nucleo_sinewave_output/ revision:0
3chあるということで、3つAnalgOutを作ってみたがmbedでは同時に2つ以上使えないようだ。いろいろ組み合わせてみたがうまくいかなかった。それぞれ1chだけなら利用可能。
出力波形
PA_4F:922.5Hz
PA_5
F:932.8Hz
PA_6
F:924.2Hz
各chで出力された周波数が若干異なる。
PA_4では922.5Hzのサイン波が出力された。以前Nucleo F446REでテストした時は、6.4kHzのサイン波が出力されたので、比較するとかなり遅い。
1周期のサンプル数(BUFF_SIZE)が360なので、サンプリング周波数は約332kHz(3u秒)となる。
F446REの時に見られた波形のつぶれはなく、フルレンジできれいなサイン波が出力されている。
単精度浮動小数点数点演算
駆動クロックははっきりしないが、回路図と基板を見比べてみるとF303用の外付けのクリスタル(X1)が実装されていない。内蔵RCで動作しているとすると、PLLで逓倍して最大64MHzとなっているので、64MHzとして比較してみた。
No | Device | No2 | Op | time(us) | clock(MHz) | period(us) | clock:op |
---|---|---|---|---|---|---|---|
3 | Nucleo F303K8 | 1 | div | 0.357 | 64 | 0.015625 | 22.848 |
3 | Nucleo F303K8 | 2 | sinf | 2.011 | 64 | 0.015625 | 128.704 |
3 | Nucleo F303K8 | 3 | cosf | 1.922 | 64 | 0.015625 | 123.008 |
3 | Nucleo F303K8 | 4 | expf | 3.202 | 64 | 0.015625 | 204.928 |
3 | Nucleo F303K8 | 5 | logf | 2.506 | 64 | 0.015625 | 160.384 |
3 | Nucleo F303K8 | 6 | sqrtf | 0.739 | 64 | 0.015625 | 47.296 |
単精度浮動小数点数の割り算
1処理あたりの実行時間
1処理あたりのクロック数
単精度浮動小数点数のsinf()
1処理あたりの実行時間
1処理あたりのクロック数
FPUが載っているので単精度浮動小数点演算は十分速いと思う。
メモ:
NucleoF303K8の駆動クロックはわからないが、STM F4もSTM F3もFPUの割り算の性能が変わらないとすると64MHzなのかも?
0 件のコメント:
コメントを投稿