
別シリーズ「お手軽ツールで今更学ぶアナログ」にてSPI接続のDACを使ってみました。「マイコンで制御する方がお楽」と思ったので、さっそくやってみます。第48回でSPI接続のADCでアナログデータの読み込みをやりましたが、そのちょうど逆となります。前回使用のプログラムを流用いたしましたが、微妙に違うところは違うと。
※「モダンOSのお砂場」投稿順Indexはこちら
12ビット nanoDAC(R) AD5626
AD5626は、5V単電源動作可能なSPI接続のDACです。内部にリファレンス電源を持っているので、5V電源接続すれば、4.095VフルスケールのDA出力が得られます。
別件記事では「お手軽ツール」のデジタル出力(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日追記、以下の回路図の結線間違っていました。大変申し訳ありません。図の赤の部分です。
また、SPIによるデータ転送とは別に、DAデータのロード信号(LDAC#)があるのでこれをD8端子(Arduino式の呼び方)で制御しています。DAデータのクリア信号CLR#もあるので、一応端子を接続しましたが、今回は使用していないです。
ブレッドボード上で接続したところが以下に。アナログ出力とデジタル入力の観察のために Digilent Analog Discovery2を接続してあるので、配線が込み入ってます。
実験に使用したソースコード
第48回のコードを流用しましたが、逆方向なので違う部分もあります。Mbed OS6の SPI のAPIのページは以下に。
// 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関係)の様子が以下に。
spi_format() APIで、ビット幅は12ビットと指定しているのですが、write() APIでの転送指定はバイト単位なので、2バイトを指定しています。SCLK自体は上記のように16発でているので、どうみても2バイトで制御されております。AD5626自体は、シフトインされてきたデータの末尾の12ビットをLDADで変換するみたいなので、成り行きで送っておけばOKみたいっす。釈然としないデス。
だいたい60マイクロ秒毎に1データがおくられ、DAされていきます。三角波の上りに4096回、下りに4096回のデータを送っているので、約491.5ミリ秒で1周期となるはず。
実際のアナログ出力の様子が以下に。
周波数の測定結果みると、だいたい60マイクロ秒という部分が少し短かったみたいっす。また、電圧はだいたい20mVくらい低い方にシフトしている感じです。DAのせいなのか、お手軽ツールのせいなのか、不明といって踏みつぶしてしまいます。いいのかそんなことで。
まあ、「モダンOS」の記事だし、プログラムは動いた、OKっと。




