STM32F103C8T6とTFTタッチスクリーンLCDで2CHオシロスコープ・Pulse generator・Function Generator

更新日 2024.04.16 登録日 2023.11.23

大阪教育大学の光永さんの Arduino でオシロスコープ は古い128x64のLCDディスプレイ用に作られたものですが、それを基に128x64の1.3インチOLEDで使えるように変更して ArduinoとOLEDで2CHオシロスコープ・Pulse generator・Function Generator・周波数カウンタ を作ったので、それを基にSTM32F103C8T6に移植し、320x240のタッチパネル付き2.8インチLCDで使えるように変更しました。

開発環境は 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.21 update)

これで最高サンプリング速度と2チャンネルという点で同じCPUを使ったDSO-138を超えたと思います。その他の色々な機能の面では劣るところがたくさんありますが。

ソースコード

最新版はGitHubに置いてあります
https://github.com/siliconvalley4066/STM32F103C8T6TFTOscilloscope

STM32TFTOscillo107.zip 2024.04.16 update

STM32TFTOscillo010.zip

TFT LCDのライブラリは何故かTFT_eSPIではエラーが出るのでAdafruit_ILI9341とXPT2046_Touchscreenを使用します。Arduino IDEのライブラリマネージャーから検索してインストールしてください。
その後、高速描画できるAdafruit_ILI9341_STMに切り替えました。詳細は後述します。(2024.01.04 update)

FFTにはarduinoFFT by Enrique Condesライブラリを使っていますが、2024年3月にVersion 2.0.0に更新されて呼び出し方法が変わってしまったのでVersion1.04で対応しました。ただし、Adafruit_GFX_AS.hとAdafruit_ILI9341_STM.hのswapマクロとarduinoFFTのswap関数が競合するようになったので、arduinoFFTライブラリソースコードのarduinoFFT.hの先頭に#undef swapを書き加える必要があります。 (2024.03.08 update)

回路図

10:1プローブを使うために入力インピーダンスを1Mohmに近付けたいので、2Mohmの抵抗を使ってみると、STM32のADCの入力インピーダンスが低いようで、信号源インピーダンスが高いと波形が乱れます。高入力インピーダンスをあきらめて100kohmの抵抗を使うことで入力インピーダンスは約50kohmになります。
*

操作方法

Raspberry Pi Pico WとTFTタッチスクリーンLCDで2CHオシロスコープ・Pulse generator・Function Generator・周波数カウンタと同じです。

時間軸の拡大は時間軸レンジがハイライトされてCyanになっている状態で時間軸レンジをタップすると、x1 -> x2 -> x5 -> x10 -> x1 と順に変化します。拡大時には右側に倍率を表示します。拡大にはsin(x)/xによる補間をしています。(2024.03.20 update)

Pulse Generatorについて

STM32F103C8T6とOLEDで2CH WEBオシロスコープ・Pulse generator・Function Generatorと同じです。

PWM DDS Function Generatorについて

STM32F103C8T6とOLEDで2CH WEBオシロスコープ・Pulse generator・Function Generatorと同じです。

TFT表示とタッチスクリーン制御について

(2024.01.04 added) danさんのstm32duinoで最初はAdafruit_GFX_ASでコンパイルエラーが出るので、Adafruit_GFX_ASとAdafruit_ILI9341_STMの組み合わせを諦めて普通のAdafruit_GFXとAdafruit_ILI9341を使いました。この場合はタッチスクリーンとSPIバスを共有しても問題ありませんでした。Adafruit_GFX_AS.hが古いようで、高速描画のAdafruit_GFX_AS.hを使うためにはSTM32用ライブラリのAdafruit_GFX_AS.cppの62行目辺りに
#define textsize textsize_x
を追記する必要がありました。これはArduino_STM32との比較で分かりました。

Arduino_STM32の方はSPI.hでコンパイルエラーが出ました。SPI.hの294行目辺りの
void transfer(uint8_t * trx_buf, uint32 len) { transfer((const uint8_t *)trx_buf, trx_buf, len); }

void transfer(uint8_t * trx_buf, size_t len) { transfer((const uint8_t *)trx_buf, trx_buf, len); }
のように変更して回避しています。

これでコンパイルエラーは無くなりましたが、タッチスクリーンとSPIバスを共有していると表示がぐちゃぐちゃになります。タッチスクリーンを読みだした後にSPIバスの設定をし直すようにして回避することが出来ました。これは
次はSTM32ボードを積極的に使ていきたい(23) グラフィック液晶(4)
を参考にしました。

Known Bugs

  • DMAサンプリングでCH2の階調落ちがある。設定不足なのか性能限界なのかは不明。(2024.01.04 update) コーディングにケアレスミスがありました。Version1.02で修正済みです。
  • 波形表示が所々途切れることがある。
  • STM32のADCの入力インピーダンスが低いようで、信号源インピーダンスが高いと波形が乱れます。OPアンプのバッファを入れた方が良いかもしれない。
  • 原理的に周波数測定には画面上で2周期以上が必要。
  • トリガモードのOneがうまく機能しない。
  • トリガが掛からない状態でトリガモードをNormにすると、トリガ検出から抜け出せなくなり操作不能になる。トリガが掛かる入力を入れれば復帰する。
  • 2ch表示で信号源インピーダンスが大きい場合は相互に観測波形に影響が出る。入力インピーダンスが下がるのを許容して入力回路の抵抗値100kohmを10kohm以下に下げれば軽減できると思う。
  • 2ch間でレベル差が大きい部分には相互干渉が発生することがある。
  • ADC入力の保護抵抗を省略したのでSTM32が壊れやすい。直列に1kohmから10kohmの抵抗を入れておいた方が良い。
  • Pulse generatorはCPUクロックを分周していて1/2から整数分の1の周波数を発生する。周波数の高い方は36MHz, 24MHz, 18MHz, 14.4MHz, 12MHzのように飛び飛びの値になる。Duty cycleも実現可能な値が限られていて50%も不可能な場合がある。周波数の低い側の分解能は1/65536になる。
  • これ単体で2チャンネル入力にPulse generatorとFunction Generatorの出力を入れて波形観測して遊べます。
  • 改良可能性

  • DMAを使って1Msps以上に高速にできるはず。Version1.00で実装済み。(2023.11.27 update)
  • 取り込みサンプル数を増やして表示位置を移動できるようにしてみたい。
  • 時間軸拡大表示。2倍、5倍、10倍にできますが位置は波形の先頭に固定です。(2024.03.20 update)
  • Hold Off調整機能を入れた方が便利かもしれない。
  • 機能概要

    機能 内容
    入力チャンネル数 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, 94us, 57us, 18us, 9.7us (2.57Msps), (1 channel) 4.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
    サンプル数 300samples/channel 12bit/sampleを電圧レンジに応じて0から200にスケーリングして表示
    表示解像度 LCD: 300x200 dots, 水平25dots/div 垂直25dots/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

    関連するオシロスコープ

  • Arduino UNO/Nano OLED版: ArduinoとOLEDで2CHオシロスコープ・Pulse generator・Function Generator・周波数カウンタ
  • Arduino UNO/Pro Mini LCD版: ArduinoとLCDタッチシールドで2CHオシロスコープ
  • ESP32 OLED版: ESP32とOLEDで2CHオシロスコープ・Pulse generator・Function Generator
  • ESP32 OLED WEB版: ESP32で2CH WEBオシロスコープ・Pulse generator・Function Generator
  • ESP32 LCD WEB版: ESP32とTFTタッチスクリーンLCDで2CH WEBオシロスコープ・Pulse generator・Function Generator
  • Raspberry Pi Pico OLED版: Raspberry Pi Pico WとOLEDで2CH WEBオシロスコープ・Pulse generator・Function Generator・周波数カウンタ
  • Raspberry Pi Pico LCD版: Raspberry Pi Pico WとTFTタッチスクリーンLCDで2CHオシロスコープ・Pulse generator・Function Generator・周波数カウンタ
  • STM32F103C8T6 OLED版: STM32F103C8T6とOLEDで2CHオシロスコープ・Pulse generator・Function Generator
  • STM32F103C8T6 LCD版: STM32F103C8T6とTFTタッチスクリーンLCDで2CHオシロスコープ・Pulse generator・Function Generator
  • STM32F103C8T6 0.96-inch 80x160 LCD版: STM32F103C8T6と0.96-inch 80x160 LCDで2CHオシロスコープ・Pulse generator・Function Generator
  • STM32F103C8T6 DLO-138-SPI: STM32F103C8T6とTFT LCDで2CHオシロスコープDLO-138-SPI

  • <=Arduinoで電子工作に戻る
    <=Siliconvalley4066番地に戻る
    ゲストブックへ
    siliconvalley4066@yahoo.co.jp