モダンOSのお砂場(51) Mbed OS6, AD5626 12bit DAC SPI接続

Joseph Halfmoon

別シリーズ「お手軽ツールで今更学ぶアナログ」にてSPI接続のDACを使ってみました。「マイコンで制御する方がお楽」と思ったので、さっそくやってみます。第48回でSPI接続のADCでアナログデータの読み込みをやりましたが、そのちょうど逆となります。前回使用のプログラムを流用いたしましたが、微妙に違うところは違うと。

※「モダンOSのお砂場」投稿順Indexはこちら

12ビット nanoDAC(R) AD5626

AD5626は、5V単電源動作可能なSPI接続のDACです。内部にリファレンス電源を持っているので、5V電源接続すれば、4.095VフルスケールのDA出力が得られます。

AD5626

別件記事では「お手軽ツール」のデジタル出力(3.3V)で制御してみました。5V電源ですが、VIHのMIN 2.4Vなので、3.3VのIO端子でも制御はOKみたいです。

今回は、ST社のNucleo F446REボード(STM32F401RE、Arm Cortex-M4F搭載)を使って三角波を出力させてみたいと思います。開発環境は、Arm社のWeb開発環境、Keil Studio Clouldです。

Nucleo F446REボードへのAD5626の接続

第48回でADCをSPI接続したときには、データは入力の一方だったのでMISO信号(スレーブからマイコン方向のデータ線)のみつかって、MOSI(マイコンからスレーブ方向のデータ線)は使いませんでした。今回は逆です。MOSIのみ接続、MISOはノンコネです。

※2022年10月15日追記、以下の回路図の結線間違っていました。大変申し訳ありません。図の赤の部分です。

AD5626_F401RE_upd0R
以下は誤りのある旧版

F401RE_AD5626_SCH

また、SPIによるデータ転送とは別に、DAデータのロード信号(LDAC#)があるのでこれをD8端子(Arduino式の呼び方)で制御しています。DAデータのクリア信号CLR#もあるので、一応端子を接続しましたが、今回は使用していないです。

ブレッドボード上で接続したところが以下に。アナログ出力とデジタル入力の観察のために Digilent Analog Discovery2を接続してあるので、配線が込み入ってます。

F401RE_AD5626

実験に使用したソースコード

第48回のコードを流用しましたが、逆方向なので違う部分もあります。Mbed OS6の SPI のAPIのページは以下に。

SPI

// AD5626 12bit DA, connection test.
// SPI1
//   CS:   PB_6(D10)
//   MISO: PA_6(D12)
//   MOSI: PA_7(D11)
//   SCLK: PA_5(D13)
//   LDAC: PA_8(D7)
//   CLR:  PA_9(D8)
//   SPI MODE2: CPOL=1(active low), CPHA=0(Rising Edge shift, Falling Edge sample)
#include "mbed.h"
#include <cstdint>

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

int main()
{
    char txBuf[2];
    char rxBuf[2];
    int dat = 0;
    int step = 1;
    clr = 1;
    ldac = 1;
    cs = 1;
    spi.format(12, 2); // 12bit, SPI MODE2
    spi.frequency(1000000); // 1MHz
    while (true) {
        dat += step;
        if (dat == 0) {
            step = 1;
        } else if (dat == 4095) {
            step = -1;
        }
        txBuf[0] = (char)((dat>>8) & 0xFF);
        txBuf[1] = (char)((dat) & 0xFF);
        ldac = 1;
        wait_us(1);
        cs = 0;
        spi.write(txBuf, 2, rxBuf, 2);
        cs = 1;
        wait_us(20);
        ldac = 0;
        wait_us(4);
      }
}
実験結果

まずデジタル制御入力(SPI関係)の様子が以下に。

SPIbuss

spi_format() APIで、ビット幅は12ビットと指定しているのですが、write() APIでの転送指定はバイト単位なので、2バイトを指定しています。SCLK自体は上記のように16発でているので、どうみても2バイトで制御されております。AD5626自体は、シフトインされてきたデータの末尾の12ビットをLDADで変換するみたいなので、成り行きで送っておけばOKみたいっす。釈然としないデス。

だいたい60マイクロ秒毎に1データがおくられ、DAされていきます。三角波の上りに4096回、下りに4096回のデータを送っているので、約491.5ミリ秒で1周期となるはず。

実際のアナログ出力の様子が以下に。

DAresults

周波数の測定結果みると、だいたい60マイクロ秒という部分が少し短かったみたいっす。また、電圧はだいたい20mVくらい低い方にシフトしている感じです。DAのせいなのか、お手軽ツールのせいなのか、不明といって踏みつぶしてしまいます。いいのかそんなことで。

まあ、「モダンOS」の記事だし、プログラムは動いた、OKっと。

モダンOSのお砂場(50) Mbed OS2->OS6お引越し、I2CでAQM1602編 へ戻る

モダンOSのお砂場(52) Mbed OS6、AHT21B 温湿度センサ、I2C接続 へ進む