大阪教育大学の光永さんの Arduino でオシロスコープ は古い128x64のLCDディスプレイ用に作られたものですが、それを基に128x64の1.3インチOLEDで使えるように変更して ArduinoとOLEDで2CHオシロスコープ・Pulse generator・Function Generator・周波数カウンタ を作ったので、それを基にSTM32F103C8T6に移植しました。サンプル数は128ポイントです。
開発環境は
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"を検索すれば出てきます。
bootloaderが使えるように出来なかったので、シリアルポートでアップロードしています。 Microsoft StoreからインストールしたArduino IDEではだめでしたが、Arduino IDEのホームページのダウンロード版をインストールし直したらbootloaderが使えるようになりました。(2024.01.04 update)
この環境ではAnalogRead()が使えるので単純にループしてサンプリングしていますが、単一チャンネルで500kspsまで出来ています。そのうちにDMAを使って単一チャンネルで1Msps以上が出来るようにしたいと思います。
DMAの使い方が分かったので、2チャンネルでも2.57Mspsまで出来るようになりました。(2023.11.27 update)
Version 1.03からはFast Interleaved modeを使って1チャンネルで5.14Mspsまで出来るようになりました。(2024.02.22 update)
最新版はGitHubに置いてあります
https://github.com/siliconvalley4066/STM32F103C8T6OLEDOscilloscope
STM32OLEDOscillo106.zip 2024.04.16 update
OLEDのドライバはSH1106用です。Adafruit_SSD1306.hやAdafruit_SH110X.hがインストールされていない場合はライブラリマネージャーから検索してインストールしてください。SSD1306用にするには#define DISPLAY_IS_SSD1306のコメントを外せばOKです。
10:1プローブを使うために入力インピーダンスを1Mohmに近付けたいので、2Mohmの抵抗を使ってみると、STM32のADCの入力インピーダンスが低いようで、信号源インピーダンスが高いと波形が乱れます。高入力インピーダンスをあきらめて100kohmの抵抗を使うことで入力インピーダンスは約50kohmになります。
Raspberry Pi Pico WとOLEDで2CH WEBオシロスコープ・Pulse generator・Function Generator・周波数カウンタと同じです。
時間軸の拡大は、Page 1の4番目つまり時間軸レンジの下でreal/DMAと表示されている所でRightボタンとLeftボタンで x1,x2,x5,x10 が選択出来ます。拡大にはsin(x)/xによる補間をしています。(2024.03.20 update)
PWMで発生できるパルスをほぼ全て出せるようにしました。72MHzを1/2から1/65536まで設定できます。分周比は1/1から1/256まで使います。発生できる周波数は4.29Hzから36MHzまでになります。周波数自体を設定するのではなく、発生できる上または下の周波数へ設定を変更して、その設定で発生される周波数を計算して表示します。周波数の高い方は36MHz, 24MHz, 18MHz, 14.4MHz, 12MHzのように飛び飛びの値になる。Duty cycleも実現可能な値が限られていて50%も不可能な場合がある。周波数の低い側の分解能は1/65536になり細かく設定できます。インタラプトは発生しません。
Lab3 - Laboratory for Experimental Computer Science
を流用させていただきました。波形データはその他色々な所から集めました。周波数の設定と波形の選択だけがオリジナルです。周波数の分解能は取り敢えず0.01Hzにしました。インタラプト処理が入るので速いサンプリング時にオシロスコープの波形が間延びするようなら明示的にOFFにした方が良い。サンプリング周波数は35.15625kHzにしました。メモリに余裕があるので用意した23波形すべてを使えます。
リンク先が消えているようなので同じ内容を探してみました。
Arduino Sinewave Generator
機能 | 内容 |
---|---|
入力チャンネル数 | 2 |
入力結合 | DC and AC |
入力電圧範囲 | 0 to 3.3V |
入力インピーダンス | 不明。50kohm程度 |
電圧レンジ(volts/div) | 1V, 0.5V, 0.2V, 0.1V, 50mV |
時間レンジ(time/div) | 10s, 5s, 2s, 1s, 0.5s, 0.2s, 0.1s, 50ms, 20ms, 10ms, 5ms, 2ms, 1ms, 500us, 200us, 100us, 57us, 23us, 11us, 3.9us (2.57Msps), (1 channel) 1.9us (5.14Msps) |
トリガモード | Auto, Normal, Scan |
トリガ極性 | rise/fall edge |
トリガソース | CH1 or CH2 |
トリガレベル調整 | 画面内位置を上下に調整 |
外部トリガ | No |
波形位置調整 | 上下に調整可能 |
波形反転表示 | Yes |
電圧測定表示 | Max, Average, Min (AC入力でもDCレベルを表示) |
周波数&Duty測定 | Yes |
電圧・周波数・Duty表示 | 表示・非表示切り替え |
文字表示 | 文字サイズ固定 |
FFT | Yes |
A/D変換分解能 | 12bits |
サンプル数 | 128samples/channel (8bits/channel) 12bit/sampleを電圧レンジに応じて6bitにスケーリングして表示 |
表示解像度 | 128x64 dots, 10dots/div |
等価時間サンプリング | No |
設定状態EEPROM保存 | Yes |
操作方法 | 5方向スイッチ (Left, Right, Down, Up) |
プリトリガー | No |
ホールドオフ機能 | No |
時間軸拡大表示 | x2, x5, x10 sin(x)/x補間 |
X-Y表示 | No |
Pulse Generator | 0.01676Hz to 36MHz 約3.3Vpp方形波 Duty ratio可変 |
Function Generator | 8bit PWM DDS 0.01Hz to 9999.99Hz(実用は400Hzまで) 約3.3Vpp
23波形 sine, saw, revsaw, triangle, rectangle, 20% pulse, 10% pulse, 5% pulse, 1dot pulse, noise, gaussian noise, ECG, sinc5, sinc10, sinc20, sine 2 harmonic, sine 3 harmonic, chopped sine, sine abs, trapezoid, step2, step4, chainsaw |
周波数カウンタ | No |
PCへのデータ転送 | No |
SDカードへの波形保存 | No |