STM32F103C8T6で2CH USBオシロスコープ・Pulse generator・Function Generator

更新日 2024.05.12 登録日 2024.05.12
*

大阪教育大学の光永さんの 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

STM32USBOscillo010.zip

回路図

STM32のADCの入力インピーダンスが低いので高入力インピーダンスをあきらめて100kohmの抵抗を使うことで入力インピーダンスは約50kohmになります。ブレッドボードで動作確認をするだけなら入力回路は省略しても構わないでしょう。DDS出力が不要ならR8,R9,C4,C5は無くても動きます。
*

操作方法

Arduino IDEでUpload Method: "STM32duino bootloader"にして書き込めばUSB接続そのままにして使えます。ファイル"STM32F103scope.html"をEdgeやGoogle Chrome等のブラウザで開くとシリアルポートの選択ができるので、Arduino IDEで使ったポートを選択すれば波形が表示されるはずです。あとはブラウザの画面で直感的に操作できると思います。

Pulse Generatorについて

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までしか設定できません。

PWM DDS Function Generatorについて

Lab3 - Laboratory for Experimental Computer Science を流用させていただきました。波形データはその他色々な所から集めました。周波数の設定と波形の選択だけがオリジナルです。周波数の分解能は取り敢えず0.01Hzにしました。インタラプト処理が入るので速いサンプリング時にオシロスコープの波形が間延びするようなら明示的にOFFにした方が良い。サンプリング周波数は35.15625kHzにしました。メモリに余裕があるので用意した23波形すべてを使えます。
リンク先が消えているようなので同じ内容を探してみました。 Arduino Sinewave Generator
現状ではユーザーインターフェースが無いので238.41Hzの正弦波に固定です。

Known Bugs

  • 元にした通信プロトコルが8bit/sampleなので12bit ADCの性能を活用できていない。
  • 周波数測定には画面上で3周期程度が必要。
  • 2チャンネル表示時には周波数測定がめちゃくちゃ。
  • Single Shotのユーザーインターフェースは未実装。
  • 入力の保護抵抗を省略したのでマイコンが壊れやすい。直列に100kohm程度の抵抗を入れておいた方が良いが垂直方向のゲインの調整が必要。
  • これ単体で2チャンネル入力にPulse generatorとFunction Generatorの出力を入れて波形観測して遊べます。
  • 改良可能性

  • 12bitデータを送るようにしたい。
  • Reference

  • pico-RP2040-oscilloscope https://github.com/jklomp/pico-RP2040-oscilloscope
  • Arduino でオシロスコープ https://n.mtng.org/ele/arduino/oscillo-j.html
  • 機能概要

    機能 内容
    入力チャンネル数 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

    関連するオシロスコープ

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

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