3
0

Simulinkを用いたNucleoとMCP3008のSPI通信

Posted at

はじめに

Simulink + Nucleoで、MCP3008のSPI通信ができたのでそのメモ

用意するもの

ハードウェア

  • Nucleo-F411RE
  • MCP3008 10bitADコンバータ
  • ブレッドボード
  • ジャンパーワイヤー
  • PCと通信するためのUSBケーブル(miniB-A)

ソフトウェア

  • Simulink R2023a(私の環境)
  • Simulink Coder Support Package for STMicroelectronics Nucleo Boards(アドオン)

解説

まずは完成したブロック図から

スクリーンショット 2024-03-10 200155.png

基本構成は 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)を掛けることで電圧に変換できました。

送受信ビットについての詳細

スクリーンショット 2024-03-10 223906.png
送信の×部分は、"Don't care"ビットと言い、どんなデータを送信してもICが無視をするという仕様です。今回は全部0で埋めました。
受信側の ? はランダムデータが入るので無視。赤丸の部分に結果が入るという仕組み

参考情報

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0