製作モジュール一覧

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

2018年9月1日土曜日

Nucleo DCO 3オシレーターをMIXするテスト

3波形を合成(加算)して出力するテストをしました。

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

パラメータ OSC1 OSC2 OSC3
波形 サイン波 サイン波 サイン波
周波数 1kHz 2kHz 1kHz
振幅 0.5 0.5 0.0
位相 0.0 0.0 / 0.5 0.0

OSC2は、位相が0の場合と0.5(π rad)の場合の2通りです。

OSC3は、加算していますが振幅0なので、OSC1とOSC2の2波形の合成波形が出力されます。

OSC1 + OSC2(位相:0.0)

ch1:Dac1(PA_4)

OSC1 + OSC2(位相:0.5)

ch1:Dac1(PA_4)

同様の波形合成をシミュレーションしました。

シミュレーション回路図

過渡解析

緑の線が位相0°、青の線が位相180°(π rad)です。

波形出力の割り込み処理時間

ch2:CheckPin1(D4)

割り込み処理に要した時間(PW)は1.7マイクロ秒です。ジッターがあるため、線が多重になっています。


OLEDに表示させている書き換えのフレームレートは9.4fps程度です。

レスポンスがどうなるかわかりませんが、メインループ内で入力処理を行う余裕はありそうです。

2018年8月30日木曜日

Nucleo DCO OLED表示(u8g2)と波形出力のテスト

u8g2-mbedを使ってSSD1306 OLED(I2C)に表示しつつ、内蔵DACから波形出力しました。Nucleoボードは、F446REだとサンプリング・レート100kHzではだめで50kHzぐらいまで下げないと追いつかなかったので、F767ZIを使用しました。


Nucleo_DCO_Test04 ピンアサイン


Arduino Nucleo Description
D15 PB_8 OLED/I2C/SCL
D14 PB_9 OLED/I2C/SDA
GND GND OLED/GND
D5 PE_11 CheckPin
D4 PF_14 CheckPin
- PA_4 WaveOut

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

u8g2-mbedを使ったプログラム作成の手順


プロジェクト作成

PS D:\Users\gizmo\Documents\mbed> mbed new Nucleo_DCO_Test04
[mbed] Creating new program "Nucleo_DCO_Test04" (git)
[mbed] Adding library "mbed-os" from "https://github.com/ARMmbed/mbed-os" at branch/tag "latest"
[mbed] Updating reference "mbed-os" -> "https://github.com/ARMmbed/mbed-os/#f8b140f8d7cb226e41486c5df66ac4f3ce699219"
The following paths are ignored by one of your .gitignore files:
mbed-os.lib
Use -f if you really want to add them.

u8g2-mbedから以下のファイルをプロジェクトディレクトリにコピー
u8g2.lib
.mbedignore
src/*
src/main.cppはu8g2-mbedを使ったプログラムの雛形として使えます。

.mbedignoreの中身は

PS D:\Users\gizmo\Documents\Develop\Nucleo_DCO\mbed\Nucleo_DCO_Test04> cat .mbedignore
u8g2/cppsrc/*
u8g2/doc/*
u8g2/sys/*
u8g2/tools/*

となっていて、mbedのBUILD対象外とするファイルを指定するようです。

参考「Ignoring files from mbed build

続いてプロジェクトディレクトリに移動して、デプロイ

> mbed deploy

コンパイルです。

> mbed compile -t GCC_ARM -m NUCLEO_F767ZI

Nucleo_DCO_Test04ではOLEDに
fps | 経過時間
表示更新回数
を表示しています。fpsはおおよそ10.9になりました。OLEDの表示はメイン・ループ内で行っていて1秒間に10.9回のループです。操作子からの入力もメイン・ループ内で行うと思うので、fpsはもっと下がると思います。

出力波形

ch1:PA_4

Ticker割り込みの処理時間

ch2:D4

Hになっている時間(PW)が波形出力の割り込み処理に要した時間で、1.2マイクロ秒です。

mbedのオンラインコンパイラ(mbed OS 2)でやったときは(参考「Nucleo DCOの構想 ~ いわゆるプロダクト・アウト」)720ナノ秒だったので、処理時間が増えました。

これはOLED表示のためというよりは、OS 2 → OS 5に移行したためなんじゃなかな~と思います。

F767でもいろいろやろうと思うと48kHzのサンプリング・レートがキープできるかどうかちょっと心配です。

ToDo:

・3オシレーターの波形合成(ミキシング)
・入力系の処理のテスト