はじめに
Simulink + Nucleoで、MCP3008のSPI通信ができたのでそのメモ
用意するもの
ハードウェア
- Nucleo-F411RE
- MCP3008 10bitADコンバータ
- ブレッドボード
- ジャンパーワイヤー
- PCと通信するためのUSBケーブル(miniB-A)
ソフトウェア
- Simulink R2023a(私の環境)
- Simulink Coder Support Package for STMicroelectronics Nucleo Boards(アドオン)
解説
まずは完成したブロック図から
基本構成は SPI Controller Transfer ブロックの前後で分かれます。
送信部分(Master Out)
今回はSPIブロックを通して、MCP3008に ①Startビット ②チャンネル選択 ③ゼロ
を送信しています。
送信するデータは Constant ブロックにすべて記載しています。行列表記になっているのでそれぞれ要素毎に送信してくれます。便利
①はデータシートにもあるように 1
を送信します。実際には 00000001
を送信する必要がありますが、勝手に必要な分の 0
は補ってくれるようです。
②はシングルエンドか差動か、そして読み取るチャンネルを決定づけます。今回は、シングルエンドのCH1ですので、①の後に、1000
を送信します。
③は実はなんでもよく、受信データが欲しいために送ります。
uint8に変換しているのはSPIの送信が8ビットであるためです。
受信部分(Slave Out)
受信してきたデータは3つの要素に格納されてきます。そのため selectorブロック を使って要素毎に分けます。
ここから受け取ったデータ処理の部分になりますが少し厄介です。表6-1を見ながらですと理解しやすいかと。
表でも送信と受信でそれぞれ3要素あります。左から①、②、③に対応しています。
まず1要素目は、AD変換された結果には関係がないことが分かります。
そのためブロック図でもterminateしています。
2要素目は下位3bitのみ有効。2bit目は必ず0になるとあります。
3要素目は全ての値が必要です。
そのためMCP3008からの受信データは10bitになります(当たり前か)
これが分かったら必要な10bitを抜き出す作業です。
uint16に変換するのは、この後行うビットシフトに対応するためです。
1要素目は無視。
2要素目はビット演算のANDを用いて、下位2bitを抜き出しています。
そして8ビットシフト左にずらすことによって3要素目の居場所をつくります。
2要素目と3要素目をsumブロックで連結することによりデータを1つにすることができました。
最後は1024で割り、電源電圧(今回は5V)を掛けることで電圧に変換できました。
送受信ビットについての詳細
送信の×部分は、"Don't care"ビットと言い、どんなデータを送信してもICが無視をするという仕様です。今回は全部0で埋めました。
受信側の ? はランダムデータが入るので無視。赤丸の部分に結果が入るという仕組み
参考情報