motoh's blog

主に趣味の電子工作やプログラミングについて書いていきます

STM32マイコンで簡易オシロスコープを自作

1. 概要

電子工作をしていると、デバッグの際にモータ制御信号や通信線の信号をオシロスコープで確認したくなることがあります。簡易的なオシロスコープであれば数千円で買うこともできますが、簡易的なものであれば自分でも作れるのではないかと思い、自作に挑戦してみました。

簡易オシロスコープということで、仕様は次の通りです。

  • チャンネル数 : 1ch (立ち上がりエッジでトリガ可)
  • 周波数帯域 : 40kHz
  • A/D分解能 : 12bit
  • サンプリング周波数 : 200kS/s (※1)
  • レコード長 : 300サンプル
  • 最高入力電圧 : 3.3V (※2)

STM32マイコンの評価ボード Nucleo Board STM32F401の機能だけで上記仕様を実現しています。まだまだ荒削りですがマイコンのソフトウェアをGithubで公開したいと思います(筆者はオシロスコープの専門知識があるわけではないため、クオリティはあまり期待しないでくださいm(__)m )。
次の写真のように、ブレッドボードでソフトウェアの動作を確認できます。液晶モジュールは、ILI9341搭載タッチパネル付TFT液晶 (MSP2807) を使用しています。

youtu.be

※1 自分の用途では200kS/sで十分なのでそのように実装しましたが、ADCの性能的には1MS/s以上にすることも可能かもしれません。

※2 マイコンのADCポートに直接信号を入力しているため、マイコンの電源電圧3.3Vを超える信号は入力できません。本来は入力回路も適切に設計する必要がありますが、そこは追々勉強していきたいと思います...

2. 開発環境

  • 開発用PC ・・・ OS: Windows10 64bit
  • 統合開発環境 ・・・ STM32CubeIDE Version:1.8.0

3. Githubリポジトリ

ronron-gh/NUCLEO_F401RE_SIMPLE_OSCILLOSCOPE

4. マイコンのピンアサイ

4.1. TFT液晶モジュールとの接続

■ Nucleo CN5 (digital)

Pin MCU pin Function TFT液晶 (MSP2807)
GND - Ground GND
D13 PA5 SPI1_SCK SCK
D12 PA6 SPI1_MISO SDO(MISO)
D11 PA7 SPI1_MOSI SDI(MOSI)
D10 PB6 - CS
D9 PC7 - DC/RS
D8 PA9 - RESET

■ Nucleo CN6 (power)

Pin MCU pin Function TFT液晶 (MSP2807)
+3V3 - 3.3V output LED (バックライト)
+5V - 5V output VCC

※バックライトはとりあえず3.3Vに接続していますが、GPIOに接続すればソフトウェアでバックライトをON/OFFできます。

4.2. 入力チャンネル

■ Nucleo CN8 (analog)

Pin MCU pin Function 用途
A0 PA0 ADC1_0 入力チャンネル

4.3. テスト用信号

■ Nucleo CN9

Pin MCU pin Function 用途
D6 PB10 TIM2_CH3 テスト用信号(10kHz矩形波)

5. ソフトウェア設計概要

以下、ソフトウェア設計のポイントになる部分(苦労した部分^^;)について記載します。

5.1. サンプリング機能

5μs (200kHz)の正確な周期でAD変換し、ADデータをメモリ(RAM)に時系列に格納するにはどうすればよいかという問題です。5μs周期の処理はタイマ割り込みを使えば容易に実現できますが、割り込みルーチンの中でAD変換、メモリ格納を行っていては、5μsの内に処理が終わらないかもしれません。

そこで、次の図のように、タイマ、ADC、DMAを連携させて、サンプリングの動作をすべてハードウェアにやらせることにします。すなわち、タイマー割り込みをトリガにしてAD変換を起動し、AD変換終了をトリガにしてDMAでADデータをRAMに転送します。また、DMAをサーキュラモードにすることで、図のように、指定した転送数のメモリ転送を無限に繰り返すことができます(繰り返しにより、先頭データから上書きされていく)。

5.2. トリガ機能

トリガ機能とは、入力信号が閾値を超えたらサンプリング(もしくは画面更新)を停止する機能です。次の図のように、ADCのアナログウォッチドッグ機能(AD変換結果が閾値を超えたら割り込みを発生)とタイマを利用して実現しました。

5.3. グラフ表示機能

サンプリングデータをリアルタイムにTFT液晶モジュール (MSP2807)にグラフ表示します。 ドライバIC (ILI9341) のインタフェースはSPIですが、MSP2807のサンプルプログラムをそのまま使うと、ソフトウェアで1ドットずつRGBデータをSPI送信データレジスタに書き込むため、ディスプレイの更新が非常に遅くなります(ディスプレイが上側から下側に更新されていくのが目で見える程遅いです)。そのため、全体(320x240)のRGBデータを一旦RAM上で作成し、DMAでSPI送信データレジスタに転送するようにして高速化しています。

6. 今後の展望

(1) TFT液晶MSP2807はタッチパネル搭載なので、タッチ操作でいろいろな設定を変更できるようにしたい。
⇒ 2022.06.19 追記
タッチパネルに対応しました。次の記事で解説しています。

mzmlab.hatenablog.com

(2) 入力回路をきちんと設計して、ケースに入れて、本当に使えるものにしたい。
⇒ 2022.08.21 追記
基板上に実装し、入力回路も作成することで実用的になりました。次の記事で解説しています。

mzmlab.hatenablog.com

⇒ 2022.09.18 追記
ケースも作成しました。次の記事で解説しています。 mzmlab.hatenablog.com