2017年6月14日水曜日

NucleoF303K8を買ってみた。


(左)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_4

F: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なのかも?