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を回すとブチブチ。→補完する?

0 件のコメント:

コメントを投稿