製作モジュール一覧

ラベル MCP3008 の投稿を表示しています。 すべての投稿を表示
ラベル MCP3008 の投稿を表示しています。 すべての投稿を表示

2018年9月6日木曜日

Nucleo DCO 内蔵ADCで入力系のテスト

POTx16 PizzaBoxのMCP3008(SPI ADC)でPOTの値を読み取れないかと試してみましたが、通信速度が遅いせいかメインループがうまく回らなくなりました。

うまく動かないテストプログラム(mbed-cli)
https://github.com/ryood/Nucleo_DCO/tree/master/mbed/Nucleo_DCO_Test06

MCP3008によるPOT値の読み取り


単体のテストプログラムを書いてMCP3008から読み取る時間を計測しました。

オンラインからライブラリ(mcp3008)を追加

> mbed add https://os.mbed.com/users/ryood/code/mcp3008/

MCP3008のテストプログラム(mbed-cli)
https://github.com/ryood/Nucleo_DCO/tree/master/mbed/MCP3008_Test01



ch1:D4 ch2:D5

ch1は16ch分、ch2は1ch分でH/Lしています。1ch分で48.3usかかっていて100kHzのサンプリング周期の10usより長くなっています。

はっきりとは言えませんが、Nucleo_DCO_Test06がうまく動作しないのは、MCP3008とのSPI通信中に何かが競合して処理が戻ってこない可能性が高いためだと思います。

内蔵ADCによるPOT値の読み取り


NucleoF767ZIは12bit ADCが24chあり、ZIOヘッダにも18ch分引き出されています。そのうち2chはDACと共用されています。

内蔵ADCのテストプログラム(mbed-cli)
https://github.com/ryood/Nucleo_DCO/tree/master/mbed/InternalADC_Test01


ch1:D4

内蔵ADCの読み取りは7.88usです。これもかなり遅いですが100kHzのサンプリング周期の10usよりは短いです。内蔵ADCの読み取り中に割り込み(Ticker)が優先されればOKです。

内蔵ADCでNucleo DCOのPOT入力を読み取り


前回の3オシレーターMIXするテストプログラムに結合しました。


u8g2-mbed + DDS(3OSC) + 内蔵ADCの結合テストプログラム(mbed-cli)
https://github.com/ryood/Nucleo_DCO/tree/master/mbed/Nucleo_DCO_Test07 (69e60db6bbf20065a08d25b653dfb63fc732724e)

処理時間の計測


メインループのタイミング

周波数は7.752Hzになっています。OLEDに表示させているFPSも7.8fps程度になっています。

波形出力の割り込み処理のタイミング



サンプリングレート100kHz程度で(ジッターあり)、処理時間は2usです。まだ余裕がありそうですが、サンプリングレートを倍の200kHzにするとメインループに処理が戻らず、割り込みも処理落ちしてしまいました。


波形出力


POTで周波数がだいたい200Hz、100Hz、50Hzになるようにして波形出力しました。

UART_TRACEを有効にして読み取ったパラメーターを表示


OSC1:drate      OSC1:phase      OSC1:PulseWidth OSC1:amplitude  OSC2:drate      OSC2:phase      OSC2:PulseWidth OSC2:amplitude  OSC3:drate      OSC3:phase      OSC3:PulseWidth OSC3:amplitude
201.648364      0.012698        0.012943        0.159463:       98.107455       0.012698        0.011233        0.155800:       50.439564       0.012454        0.010745        0.157265:
201.453004      0.012943        0.012943        0.160684:       97.912095       0.009524        0.010745        0.157265:       50.439564       0.013919        0.012698        0.159707:
201.501844      0.012210        0.008547        0.160928:       97.912095       0.012210        0.010745        0.156532:       50.390724       0.012698        0.012210        0.156288:
201.697204      0.012943        0.012454        0.161416:       97.912095       0.010745        0.010989        0.156777:       50.341884       0.012210        0.012454        0.156777:
201.892564      0.011722        0.012454        0.159707:       97.814415       0.008059        0.010989        0.155556:       50.293044       0.011477        0.011966        0.156288:

読み取り値はfloat型で、結構ふらついています。

出力波形はUART_TRACE、CHECK_PINを無効にして計測しました。

3オシレーター合成(OSC1 + OSC2 + OSC3)

他のチャンネルのLevel POTを最小にして1chだけのオシレーターの波形出力を計測しました。

OSC1のみ

OSC2のみ

OSC3のみ

特にOSC3の波形が歪んでいますが、POTの読み取り値がふらついているためだと思います。ADC読み取りを抑止して、プログラム上でパラメーターを決めて(OSC1、OSC2のamplitude=0.0、OSC3のamplitude=0.3にした)出力すると以下のように比較的きれいです。


メモ:


波形を増やす。波形切り替え。

Range切り替え。

ADCの読み取りは内蔵でもかなり時間がかかる。

Freq POTを回すと周波数の変化がトビトビ。Phase POT、Level POTを回すとブチブチ。→補完する?

2017年6月21日水曜日

キックマシン KIK01 POTをMCP3008で読み取り

Nucleo F446RE(mbed)でA/DコンバーターのMCP3008を使ってPOTの値を読み取るようにしてみた。


出力は内蔵12bitDACから、A/DコンバーターとのSPI通信はSCK、MOSI、CSに33Ωのダンピング抵抗を入れた。MISOは1kΩのRでプルダウンした。

オーディオ出力波形は前回と変わらない。(参考:「キックマシン KIK01 Nucleo(mbed)でプロトタイピング」)

mbed repository:
https://developer.mbed.org/users/ryood/code/KIK01_Proto02/ Revision:13

SPI通信のようす


MOSI

ch1:MOSI ch2:SCK

MISO

ch1:MISO ch2:SCK

CS1(D11)

ch1:CS1 ch2:SCK

CS2(D10)

ch1:CS2 ch2:SCK

SPIクロック(SCK)が419.7kHzとなっているが、MCP3008クラスがSPIオブジェクトをコピーして持つ仕様になっているようで、MCP3008クラスのコンストラクタを呼び出す前にSPI.frequecy()を呼び出さないとクロックの設定が反映されないようだ。なので、デフォルトの周波数になっている。

SPIオブジェクトの周波数をローカルで設定をしないとダメなので、しばし保留。参照かポインタでSPIオブジェクトを持つように変更する予定です。

処理時間の計測


DigitalOutをH/Lさせて、

D2: サンプリング周期ごとの割り込み中の処理時間(エンベロープ生成+波形出力)
D3: エンベロープ生成時間
D4: MCP3008/16chの読み取り時間

がわかるようにしてみた。

D2: サンプリング周期ごとの割り込み中の処理時間

ch1:D2 ch2:SPI_SCK

50kHzの割り込み中の処理時間は5us。プログラムで48kHzに設定しているのでちょっと速い。

割り込み処理中のch1がHiになっている間も、ch2のA/Dコンバーター読み取り用のSPIの SCK(クロック)が出力されているのでSPI通信は非同期で行われているようだ。

普通、SPI用ハードウェアはレジスタに値を設定してやれば、CPUと独立して勝手に通信を行ってくれる。mbedでもこの仕組が効いているんだと思う。ありがたいことです(^q^/

D3: エンベロープ生成時間

ch1:D3 ch2:SPI_SCK

エンベロープ生成には3usかかっている。

D2:D3

ch1:D2 ch2:D3

わかりやすいようにD2とD3を同時に測定。48kHzのサンプリングレートだと周期の1/4を処理に使っているので、まだ余裕がありそう。

D4: MCP3008/16chの読み取り時間

c1:D4 ch2:SPI_SCK

MCP3008の16ch分の読み取りに0.732msかかっていて、その間SCKが出力されている。A/Dコンバーターの読み取りはメイン・ループ内で行っているのでエンベロープ生成、波形出力の割り込みが優先される。(←はず)

2017年6月15日木曜日

POTx16 PizzaBoxの構想

可変抵抗をただ16個並べただけ+A/Dコンバーターを使ってマイコンとのやりとりの線数減らす構想。

PizzaBoxといっても宅配ピザのSサイズより小さいと思う。たぶん。(17cm×17cm)

モックアップを作ってみた。


中は、


スッカスカ

枠は現状のダンボールでもいいが、木工の練習のためにダイソーで売っているMDFで組んでみるつもりです。

課題は、木材をきちんと裁断できるか、接合ははうまくできるかなど。


中の基板のパーツを並べた。

まずは基板をつくって、パネルにPOTを並べてダンボールのモックアップでどうなるか見てみます。

2017年6月11日日曜日

SPI ADCのMCP3008をNucleo(mbed)で使ってみる。

MicroChipのADCの10bitバージョンのMCP3008をNucelo F401REで使ってみた。MCP3008はMCP3208より解像度は低いが、SPIの最大クロック数が3.6MHzまで対応している。

mbedのライブラリ


MCP3208用のライブラリをMCP3008用に書き換えてみた。

mbed repository:
Library:
https://developer.mbed.org/users/ryood/code/mcp3008/

Test Program:
https://developer.mbed.org/users/ryood/code/Nucleo_MCP3008_Test/

ライブラリのA/Dコンバーターの差動入力はテストしていないのでコメントアウトしている。

ブレッドボード配線図


MCP3008に送る電源は5Vでも3.3Vでもよい。

5V電源のほうがSPIのクロックを上げられるが、Nucleoに載っているMPUが3.3V駆動なので、Nucleo→MCP3008のSPI信号が3.3Vになり、一応はMCP3008の仕様外になる。Nucleoの方は3.3V駆動だが、5VトレラントなのでMCP3008→Nucleoの信号レベルが5Vでも問題はない。

3.3V電源だとSPIのクロックの最大値が低くなる(1.35MHz@2.7V)が、3.3V系同士なので信号レベル的には安心。

UART出力


ダンピング抵抗を入れてみる。


出力の近くにダンピング抵抗を入れるとオーバーシュートや振動が抑えられるので入れてみた。

mbed repository:
https://developer.mbed.org/users/ryood/code/Nucleo_MCP3008_Ticker_Test/

配線図


NucleoにArduino互換のシールドを載せている。(参考:「ベースマシン UI Controller ダンピング抵抗用シールドの製作」)シールド上でピンソケットを使ってダンピング抵抗を入れられるようにしている。SCK、MOSI、CSに33Ωの抵抗を挿入、MISOはジャンパでショート。

また、SPI通信用のケーブルは、30cm程度のものを2本コネクタでつないでわざと状態を悪くしている。


ダンピング抵抗なし

MOSI

ch1:MOSI ch2:SCK

MISO

ch1:MISO ch2:SCK

SCK、MOSIはNucleoが出力している信号で、オーバーシュートや振動がかなり出ている。MOSIMISOはMCP3008が出力している信号で立ち上がり/立ち下がりが遅い。

33Ωダンピング抵抗あり


MOSI

ch1:MOSI ch2:SCK

MISO

ch1:MISO ch2:SCK

33Ωだと多少整形されている感じ。ようすを見ながら差し替えられるようにしておいた方が良さそう。