大阪教育大学の光永さんの Arduino でオシロスコープ は古い128x64のLCDディスプレイ用に作られたものですが、それを元にSTM32F103C8T6で幾つかのオシロスコープを作ったので、それらを元にUSB接続のPCで表示できるようにしてみました。 GitHubにRaspberry Pi Picoを使ってPCとのUSBシリアル通信でHTMLとjavaスクリプトで表示できる pico-RP2040-oscilloscope というものがあったので、その通信方法を流用させていただきました。HTMLはほぼ元のままで、ほんの少し修正しただけです。九工大のArduino簡易オシロスコープのProcessingの代りにWEBブラウザを使うようなものです。
開発環境は
Arduino IDE 1.8.19 + STM32F1xx/GD32F1xx boards by stm32duino version 2022.9.26です。
Arduino IDEの環境設定で追加のボードマネージャのURLに
http://dan.drown.org/stm32duino/package_STM32duino_index.json
を追加すると、ボードマネージャで"stm"を検索すれば出てきます。
低速のサンプリングではAnalogRead()を使って単純にループしてサンプリングしています。 DMAを使って、2チャンネルでも2.57Mspsまで出来、Fast Interleaved modeを使って1チャンネルで5.14Mspsまで出来ます。
最新版はGitHubに置いてあります
https://github.com/siliconvalley4066/STM32F103C8T6USBOscilloscope
STM32のADCの入力インピーダンスが低いので高入力インピーダンスをあきらめて100kohmの抵抗を使うことで入力インピーダンスは約50kohmになります。ブレッドボードで動作確認をするだけなら入力回路は省略しても構わないでしょう。DDS出力が不要ならR8,R9,C4,C5は無くても動きます。
Arduino IDEでUpload Method: "STM32duino bootloader"にして書き込めばUSB接続そのままにして使えます。ファイル"STM32F103scope.html"をEdgeやGoogle Chrome等のブラウザで開くとシリアルポートの選択ができるので、Arduino IDEで使ったポートを選択すれば波形が表示されるはずです。あとはブラウザの画面で直感的に操作できると思います。
PWMで発生できるパルスをほぼ全て出せるようにしました。72MHzを1/2から1/65536まで設定できます。分周比は1/1から1/65536まで使います。発生できる周波数は0.01676Hzから36MHzまでになります。周波数自体を設定するのではなく、発生できる上または下の周波数へ設定を変更して、その設定で発生される周波数を計算して表示します。周波数の高い方は36MHz, 24MHz, 18MHz, 14.4MHz, 12MHzのように飛び飛びの値になる。Duty cycleも実現可能な値が限られていて50%も不可能な場合がある。周波数の低い側の分解能は1/65536になり細かく設定できます。インタラプトは発生しません。しかしながら、元にした通信方法の制約で16bit整数でしか指定できないので、今のところ1Hzから65535Hzまでしか設定できません。
Lab3 - Laboratory for Experimental Computer Science
を流用させていただきました。波形データはその他色々な所から集めました。周波数の設定と波形の選択だけがオリジナルです。周波数の分解能は取り敢えず0.01Hzにしました。インタラプト処理が入るので速いサンプリング時にオシロスコープの波形が間延びするようなら明示的にOFFにした方が良い。サンプリング周波数は35.15625kHzにしました。メモリに余裕があるので用意した23波形すべてを使えます。
リンク先が消えているようなので同じ内容を探してみました。
Arduino Sinewave Generator
現状ではユーザーインターフェースが無いので238.41Hzの正弦波に固定です。
機能 | 内容 |
---|---|
入力チャンネル数 | 2 |
入力結合 | DC and AC |
入力電圧範囲 | 0 to 3.3V |
入力インピーダンス | 50kohm |
電圧レンジ(volts/div) | 1V |
時間レンジ(sample/sec) | 1, 2, 5, 10, 20, 50, 100, 200, 500, 1k, 2k, 5k, 10k, 20k, 50k, 100k, 176.5k, 439k, 900k, 2.57M, (1 channel) 5.14M |
トリガモード | Auto |
トリガ極性 | rise/fall edge |
トリガソース | CH1 or CH2 |
トリガレベル調整 | 画面内位置を上下に調整 |
外部トリガ | No |
波形位置調整 | No |
波形反転表示 | No |
電圧測定表示 | Max, Min (AC入力でもDCレベルを表示) |
周波数&Duty測定 | Yes |
電圧・周波数・Duty表示 | Yes |
文字表示 | 文字サイズ固定 |
FFT | Not yet |
A/D変換分解能 | 12bits |
サンプル数 | 512samples/channel (8bits/channel) 12bit/sampleを電圧レンジに応じて8bitにスケーリングして表示 |
表示解像度 | 800x400 dots |
等価時間サンプリング | No |
設定状態EEPROM保存 | No |
操作方法 | HTML |
プリトリガー | No |
ホールドオフ機能 | No |
時間軸拡大表示 | x2, ... , x10 直線補間 |
X-Y表示 | No |
Pulse Generator | 1Hz to 65,535Hz 約3.3Vpp方形波 Duty ratio可変 |
Function Generator | 8bit PWM DDS 238.41Hz 約3.3Vpp
波形 sine |
周波数カウンタ | No |
PCへのデータ転送 | No |
SDカードへの波形保存 | No |