スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

MCUを使ったオシロスコープ、、まで行かない波形観測器

STマイクロのMCU STM32F417を使い、オシロスコープまでも行かない波形観測をしてみました。
秋月電子にもDSO138とゆうSTM32F1を使った簡易オシロスコープキットが販売されているので、ある程度の機能が必要な時はDSO138を購入したほうが良いと思われます^^;

まず、手持ちのebayで安価に入手できるSPIインターフェースな液晶パネルコントローラーにILI9341を使用した赤い基板のパネルでの表示。



通信速度等々、ほぼ何も調整していないので、結構遅いです。

次にちょっと調整したもの。



ダイレクトメモリアクセスとか、難しいことをせず、描画命令をそのままMCU内のSPIマスターに渡しているだけなので、あまり速くはなってませんが、それでも、繋いだだけよりは、、。





これは16bitパラレル入力タイプの液晶パネルコントローラーILI9325をSTM32F4のFSMC(フレキシブルメモリコントローラー)に接続した物の動画です。このFSMCを液晶パネル作動用に使うのは、STM32のアプリケーションノートにも有る使い方で、とんすけぶろぐのとんすけさんが、STBeeボード+2.4インチ液晶パネルYHY024006Aで動画再生60FPS超えるとゆうページの中で、仕組みと手順を公開されてます。
安価な小型TFT液晶パネルをMCUを使って動画再生されている方々に重宝されている機能のようで、この動画、更に下にある動画でも、非同期SRAMと同じような通信方法で、約10Mhzで通信しています。で、16bit幅で通信されているので、通信速度はSPI通信での速度を遥かに上回ります。




これは、STM32F4に載っているADCを使い、秋月電子で販売されているミニDDSファンクションジェネレーターからの出力を観測しています。ADCの設定とか、あまり触っていない状態ですが、案外綺麗に出力されています。
ADCで読み込んだ数値にしたがって、点を打っているだけの状態です。
ある意味リアルタイムでの出力です。



これはADCで連続で読み込んだ1表示画面分数値を一旦配列に入れて表示、少々Delayを入れて調整したものです。DMA等凝ったことしていません。表示自体、液晶パネル自体短手の240ピクセル内の128ピクセルしか使ってないので、ADC8bitの分解能でも余るほど。やはり肝となるのは、ADCの読取り速度ですね。。
案外な速度まで、信号が出ていることを観測することができました。

多分ですが、外部メモリコントローラーが載っているMCUで有れば、STM32に限らず、ほとんど同様な事が出来るのでは?と思ってます。たまたま、STM32での、作例や、サンプルコード等々がnet上に多く有ったので。。
基本8080とゆう昔からあるインターフェースなので、16bit幅でなくとも、8bit幅でも。。
実際の所PIC32などではPMP(パラレルマスターポート)とゆうインターフェースがあり、8(16?)bitと制御線でのコントロールが可能なようです。


特定用途用の、決まった信号が出ているか、、といった使い方であるならば、この程度の物でもチェッカーとしては使えるのでは?と思います。


追記。。

もうチョット高い周波数が見れると良いかなぁと思い、秋月電子で販売されている作動速度の速い8bit出力のADコンバータAD9286を超オーバースペックですがFPGAのMax10で20Mhzの8bitデータとし出力。STM32F4のGPIO Inputにて読み取って波形観測してみました。



ADCはパスコン等を取り付けたほぼ素のまま。アナログ電源用に別LDOを使用しています。きちんとADCを使うのならば、OPAMP等々を使用してもっときちんとした回路とせねばならないとは思うのですが、素のままでどこまでみれるのか?とゆう好奇心で試してみました。

FPGA側はFIFOとか、バッファリングとか、特別難しいことをせず、また、STM32F4側も単にGPIOを使って1画面分のデータ配列に入れて表示をしているだけです。
ADCをもっと高速に作動させて、FPGA側にFIFOを作って1画面分のデータを取得(加工もするとよいかも)、STM32F4の液晶パネルに表示、、だともっと高い信号を観測出来ると思います。

何に使うか、どこまで性能が必要か?により、色々と機能を追加出来るのではないかと思います。

FPGA側に読取り速度等々の設定を幾つか作っておき、MCUから設定変更とか、、。

更に追記。。



見やすくして、数値の表示も。
これでも200mSのウエイトを掛けているので、結構重そうな演算をさせてもイケるかも。


MCUでの小さいTFT液晶パネルについて。。

最近触ってる、、このブログで取り上げているBeagleboneBlack/Greenに繋いだ秋月3000円液晶パネル以外は16/8bitインターフェースか、SPI接続の物を使用しています。
aitendoで色々と売られているこの手の液晶パネル、液晶パネルにコントロールICが付属した形となっており、コントロール用ドライバIC内に液晶パネルのドットと同じだけのRAMを内蔵しています。1ピクセルに対して、16bitの色データが割り当てられてます。

MCUを使い、液晶パネルの各種駆動方法とかの初期設定を済ました後は、コントロール用のドライバICのコマンドを使用してドライバIC内のRAMを書き換えているだけです。

個人的な感想ですが、SPI接続での液晶パネルでの表示はどのMCUを使ってもさして手間は変わらないと思います。
ただ、SPI接続な液晶パネルの場合、1画面表示するのに掛かるデータ通信速度がネックとなり、1画面の表示速度を上げようとするとなかなかに難しいMCUもあります。



SPIインターフェースなTFT液晶パネルの場合、、、。


先に使用したPSoC5LPの場合、ロジック部分とプログラム用のAPIを回路図ブロックで作りますが、その生成されたSPIマスターのAPI内の送信コマンドは、1データを送った後、送った事を確認するフラグを確認し、確実に送信がされたことを確かめます。そのルーチンがあるために、データが続けて送られず、チョット間隔が空いてから次のデータが送信されるようです。
描画のためのデータを作ったりするほうが明らかに遅いので、SPIライブラリのソースコードを読み、直接SPIの送信用レジスタに書き込みをすると、描画速度が上がります。

また、STM32F4のSPI通信の場合、SPI器をのレジスタに直接データを書いても一定の間隔が挿入されるようで、次々と送信はされないようです。
この場合、描画ルーチンとの兼ね合いもあるので私自身試してはいませんが、DMAを使いメモリから直接SPIの送信レジスタに送ると次々送信されるようです。

ILI9341 LCD Driver + STM32F4 + DMA

STM32F2XXまたはSTM32F4XXでSPI DMAを通じて FULL DUPLEX通信を具現する


8/16bitパラレル接続なTFT液晶の場合、、、。。

基本的には昔から使われているi8080インターフェースとゆうもの、のようで、特定のMCUに有るメモリコントローラーを使って接続することも可能だと思われます。

PSoC5LPの場合、回路図ブロックとして、そのものズバリのGraphicLCDInterfaceMacroなるものがあり、8/16bit共コマンド/データのセレクトピンを1本余分に追加するだけで使用できます。
マクロの設定を回路ブロックの設定ウインドウを使って通信条件の設定ができます。

割とお手軽なのでは??
またPSoC5LPには、ExternalMemoryInterfaceなるものも有るのでそちらも使えるのかもしれません。

STM32の場合他記事でも書きましたしWeb上を検索すると多数出てくるはずですが、FSMCとゆうメモリコントローラを使用した接続方法がとても速い速度での液晶パネルの描画が可能です。DMAを使用せずとも、かなりの速度で描画できますが、動画等の再生などでは、SDカードから直接メモリへ、メモリからFSMCへとCPU部分を余り使わないでの描画が可能なようです。

ADCについて。。

今回使ったSTM32F411のADCはAVRに較べて結構速いADCが3つ載っています。このADC、DMA転送を使い一つの入力を3つのADCの取り込みタイミングをズラし、3倍の速度での取り込みが可能です。他STM32でも、品種により複数のADCが載っているものはこの複数のADCでの取り込みが可能なようです。
参考にしたのはSTMicroのSTM32F4xx standard peripherals library内のファイル内にあるSTM32F4xx_StdPeriph_Examplesの中のADC_TripleModeInterleavedとゆうサンプルコード。

このADCのサンプルコード、DMAを使い3つのADCの出力結果を指定されたメモリアドレスに延々と転送し続けます。
このメモリアドレス(変数の配列を指定)を読み込み、TFTLCDパネルに書き込むだけ、、なんですが、このサンプルのままだと、ADCから送られるデータが次々と入れ替わっていくので、1画面表示分の配列を作り、1画面分のADCのデータが溜まったらDMA転送が止まるように、DMAの設定をCirclarからNomalへ。
一度DMA転送を止めるともう一度開始するには、DMA転送するデータの数とかデータの行き先等を再設定する必要があるので、ADCよりメモリへ1画面分のデータをDMAで転送→指定データ数でDMA停止、LCDに描画→再度ADCのデータをDMAを使ってメモリに送る為に一旦DMAとADCを初期値に戻す→ADCとDMAを再度設定し直しデータ取得スタート、とゆう手順で動画上のプログラムは動いています。

下記は再度DMA転送する記述です。

delay_nms(20);
DMA_DeInit(DMA2_Stream0);
ADC_DeInit();
ADC_Config();
ADC_SoftwareStartConv(ADC1);

DMA転送終了フラグが立つのが、転送直後ではないようなので、Delayしてから初期設定に戻し、再度設定させADCを動かしています。使用したDMAチャネルのDMA完了フラグを見て処理を行うのが正式な書き方だと思われます。


スポンサーサイト

テーマ : 自作・改造
ジャンル : コンピュータ

コメントの投稿

非公開コメント

ライセンス
アクセスカウンター
プロフィール

あきらひとし。

Author:あきらひとし。
木工用CNCルーターフレームと、ステッピングモータードライバを作ってみました。
たぶん記事は一般的な人には殆ど必要のない事ばかりなの、かも。

モーターは回るだけでも楽しい。制御(速度、トルク、位置)できるともっと楽しい!

メールフォーム

名前:
メール:
件名:
本文:

リンク
最新記事
カテゴリ
スポンサードリンク
スポンサードリンク 
スポンサードリンク
オンラインカウンター
現在の閲覧者数:
検索フォーム
RSSリンクの表示
最新トラックバック
最新コメント
月別アーカイブ
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。