モダンOSのお砂場(48) Mbed OS6、SPI接続ADC、AVR から STM32付替

Joseph Halfmoon

別シリーズでSPI接続のADCをArduino Unoに取り付け、SPI接続の確認を実施。今回は同じことをNucleo-F401REでやってみます。OSはMBed OS v6.15を使用、開発環境には最近使い始めた Keil Studio Cloudを利用。慣熟訓練?Arduinoよりコード短いんじゃないかい。

元々は、SAR型のADCの実例としてアナログねたの方でやってみたデバイスなんであります。アナデバ製の12ビットADC、SPI接続品です。SPI接続ということでマイコンに取り付けてみなくちゃ、ということで下記の記事で取り付けて動作確認(変換精度とか、つべこべ言わず、接続のみ。)

IoT何をいまさら(107) SPI接続のADC、AD7920をArduinoで制御してみる

柳の下のドジョウということで、今回は同じデバイスをNucleo-F401REに接続し、Arm Mbed OSで制御してみることにいたしました。

比較表が以下に。

Arduino Uno Nucleo F401RE
CPU ATmega328P (8bit) STM32F401RE (32bit)
フレームワーク/OS Arduino Mbed OS 6.15E
電源電圧 5V 3.3V

昔だったらね、ボードの載せ替え、ましてやマイコンを変えて動かすなんぞ、恐れ入るような工数がかかったもんですが、本当に簡単です。チョロイ?

AD7920の接続

AD7920を載せたブレッドボード、今回も何もいじってません。それどころかマイコンボードとの接続もクリソツ。まずは Arduino Uno に接続したときの回路図が以下に。AD7920_ArduinoUno_DUT

そして、下がNucleo-F401REに接続したときの回路図です。よ~く見ないとその差はわかりませぬ(違いは電源とボードの御名前。)ADCtestDUT

当然、カラクリはありです。STM32F401REはATmega328Pに比べたら遥かに端子数も多く、機能も豊富なのですが、Arduino互換のコネクタも併設しております。そして、そのコネクタはArduinoになるべく近くなるように設定がされています。今回実験のSPIについでも、まったく同じコネクタから信号線を取り出せます。

唯一の違いは、STM32F401REが3.3V IOのデバイスなので、5VのArduinoとは電源を変更した点です。AD7920自体は、5Vでも3.3Vでも動作可能(ただしフルスケールは電源電圧までなので、検出可能電圧は変わります。)

実機写真は以下に。

AD7920DUT

Mbed用の実験ソース

別件記事のArduino用のソースを見ながら、Mbed用のソースを作成いたしました。参照するのは、SPIについてのAPIのマニュアルページであります。

MBed OS v6.15 API SPI

ArduinoのAPIでは16bit幅の読み取りができなかったので、2回に分けて読み取ってましたが、MbedOSではビット幅の指定が可能なので16ビット幅で一気に読みます。コマケー違いはあれど似たようなもん。でもこっちゃの方が簡単?

// AD7920 12bit AD connection test.
// SPI1
//   CS:   PB_6(D10)
//   MISO: PA_6(D12)
//   MOSI: PA_7(D11)
//   SCLK: PA_5(D13)
//   SPI MODE2: CPOL=1(active low), CPHA=0(Falling Edge)
#include "mbed.h"

SPI spi(PA_7, PA_6, PA_5); // mosi miso sclk
DigitalOut cs(PB_6);

int main()
{
    cs = 1;
    spi.format(16, 2); // 16bit, SPI MODE2
    spi.frequency(1000000); // 1MHz
    while (true) {
        cs = 0;
        int dat = spi.write(0);
        cs = 1;
        printf("DAT: %d\n", dat);
        ThisThread::sleep_for(1s);
    }
}
動作確認

ビルドしたバイナリをボードに書き込み(Keil Studio CloudはWebベースですがこれができます)、伝統のTeratermで出力を観察しているところが以下に。ResultAD

ボリュームを捻ると電圧が変わりそれに追従して出力値も変わります。タマに「飛んだ」値が出るのはノイズでしょうか。ADに与える電源などシッカリしたものにしたいものですが、まあ、接続の試験、Keil Studio Cloudの練習だし。

モダンOSのお砂場(47) Zephyr、キー割り込み受け。STM32F401RE へ戻る

モダンOSのお砂場(49) Mbed OS6、「Serial」そういえばなくなってたのね へ進む