DCOとDCAの結合テスト(UIなし)NucleoシーケンサーのUIを省いてDCO->DCAのテスト配線図MCP4922+NJM13700のDCAのエンベロープ波形をコントロールするPOTはつないでいる。DCOの出力を100mV(p-p)以下にしているので、ノイズ(おそらくSPI信号)がかなり重畳している。ch2:MCP4922の出力波形(エンベロープ)エンベロープを変化させたようすをYoutubeにあげた。メモ:DCOの出力波形が0V~+100mV程度になっているのを-50mV~0V~+50mVにしたほうがいいか?→AC結合すればなんとかなる(@@?シーケンスのnoteOn/Offは未実装。DCOではなくDCAで処理する。ベースマシンMCP4922とNJM13700のDCAの整理この間作ったAmpControllerクラスでMCP4922とNJM13700のDCAを制御する実験をしてみた。100mV(p-p)以内にしておけば、MCP4922からの出力は0V~3.3V(MCP4922のGND-VDDのフルスケール)でも出力波形は歪まないようだ。NJM13700の使ってないチャンネルの処理NJM13700のチャンネルBを開放のまま使うとすぐ発振したりするのでOPAMPの使っていない回路と同じように、OUTPUTとINPUT-を直結してボルテージフォロアにし、INPUT+をGNDに落とした。INPUTは電流を流し込まなければ良いと思うので開放のままとした。これでいいのかどうかわからないが安定度はだいぶ増した感じだ。BIASはいまだよくわかっていないので両チャンネルとも開放のままとした。※LM13700のDATASHEETを見るとRを介して正電源に接続して電流を流してやればリニアリティが改善するようなことが書いてある。NJM13700のチャンネルBを処理しても、まだ発振する場合がある。波形入力には自作のPCM5102を使ったファンクションジェネレータを使っていて、この出力が発振する。入れていて、これが発振してしまっているのかもしれない?ファンクションジェネレータのスイッチをOFF→ONすれば直るが。NJM13700のチャンネルBを処理する前は全体の電源を入れなおさないと発振が止まらなかった。波形のGNDレベルが片側に張り付いてしまうこともあった。ch2:波形出力これも直ったような感じだがもうちょっとテストした方が良さそう。メモ:電源をちゃんと考える。一度シミュレーションしてみる。NJM13700のDIODEバイアスの実験。KitでEEPROMを使ってみる。シーケンサーで作ったシーケンスを永続化したいのだが、何が一番簡単か考えてみるとマイコンに内蔵されているflashメモリーに書いてしまえれば話が早そうだ。プログラムをflashメモリにおいてSRAMを作業領域として分離して使うタイプのCPUだと、実行時にそうは簡単にflashメモリーに書き込めない仕組みになっているようだ。flashメモリへの実行時書き込みは宿題として、簡単にアクセスできそうなメモリはSDカードEEPROMぐらいだと思う。5LPでEEPROMを使ってみることにした。CreatorのexampleのEEPROM_Designというプロジェクト。P0[2].のとおり配線した。KitのCY8C5888-LP097を指定。USBを引っこ抜いて挿しなおしても表示値は追随していたので、RST回数やERASE回数はEEPROMに保持されていると思う。KitはLP097、CQ出版のはLP035。PSoCにはEm_EEPROMというコンポーネントがあって、EEPROMが実装されていないPSoC4てもflashメモリーでエミュレートできるようだ。小ネタ実験mbedでMCP4922にエンベロープ波形を送るクラスを作る。エンベロープ波形の生成とSPI送信をmbedでクラス化してみた。ブレッドボード図MCP4922の出力でNJM13700を使ったVCAのコントロールもしてみたかったが、配線がぐちゃぐちゃしてきたのでまずは単体でテストした。}}プログラム(クラス構成)もなんかぐちゃぐちゃしてきた(^q^;一度クラス図を書いて整理したほうが良さそうな気もする。FunctionPointerを使うテストmbedにはコールバックを簡単に記述するためにFunctionPointerというクラスが用意されているようだ。APIはドキュメントに載っていないようだが、mbed-src/api/FunctionPointer.hで定義されている。いつものようにとりあえず動かしてみた。}}foo1はコールバックに普通の関数、foo2はBarクラスのメンバ関数をコールバック関数として登録している。コールバック関数をFunctionPointer::attach()で登録して、FunctionPointer::call()で呼び出す。FunctionPointerを使うとコールバック関数は引数、返値とも取れない。FunctionPointer.hにはint型の引数を一つだけとるevent_callback_tというクラスもtypedefされているのでこちらも同じようにテスト。DCFシールドを追加してテストしてみた。DCFのcutoffとresonanceをコントロールする。DCFシールドにSPIで値を送っている。DCFシールドは同一のSPIバス(SPI1)を使用。5110)は別のSPIバス(SPI2)を使用。DCFからの出力ジョイスティックがニュートラルの状態。cutoff:124、resonance:130cutoff、resonanceを上げて発振させた状態。cutoff:255、resonance:232cutoffだけ上げて発振させた状態。DCOからの出力はIDACの出力を1kΩの抵抗で電流電圧変換していて、振幅は0V~612mV。DCFからの出力は発振させると電源電圧の5V(p-p)付近になるが、AC結合しているのでパルス幅によっては0Vからの振幅になる。->OTAはの信号入力は差動で100mV以内にしないといけないので1/50~1/5程度に減衰。808をシミュレーションしてみる。Google+の電子工作部でTubeSceamerというエフェクタの回路を教えてもらったのでLTSpiceでシミュレーションしてみた。回路図Driveと書いてあるところがダイオードを使ったリミッターで、R5:{Rdrive}の値とR6の値で増幅率を決め、D1/D2のダイオードで増幅しすぎた電圧をクリップするのでダイオードの特性で歪む。21倍の非反転増幅回路で(R9+R10)の途中のC7で高周波数をGNDに逃がしてLPFの働きをする。過渡解析(drive)R5:{Rdrive}の値を変化させてみた。±20mVの正弦波を入力して歪み方を見てみた。R5:{Rdrive}の値を上げると歪みだすが、なかなかおもしろい歪み方をする。この定数だと矩形波近くまでガチガチに歪むことはないようだ。OD-1ダイオードを1本追加するとOD-1の歪み方になるそうなのでこれもシミュレーション。回路図<追記:2016.06.21>OD-1の回路図を見たら、Driveの回路の3本目のダイオードは並列ではなくて、直列に入れるようです。並列だと非対称にならないか(^q^;</追記>追加するダイオードの方向はよくわからないが、1kHzの正弦波の入力ではどちらでも大差ないようす。過渡解析(dirve)過渡解析(tone)メモ:1kHzの正弦波のシミュレーションではよくわからないが、このヘンテコな歪み方はリアルタイムにデジタル処理して再現するのはなかなか難しいのではないだろうか。ギターは弾けないので(弾けないわけではなくて偉そうなこと言えない)、ギターのエフェクタとして評価はできないが、ダイオードを使ったリミッタの歪はなかなかおもしろそうな気がする。小ネタ実験Nucleo(mbed)のPwmOutで波形を出力してみる。DACのMCP4922を使ってVCAをコントロールしてみたが、外付けDACを使わないでPWMでできるかどうかやってみた。F401REでは使えないようだ(←実際に試したわけではないです。)参考:https://developer.mbed.org/questions/4255/AnalogOut-problem-on-Nucleo-F401RE/PWMなら使えるのでLPFを通してモジュレーション波形が出せるかどうか試してみた。}}キャリアを可聴帯域の外の100kHzにして10usごとにデューティ比を変化させてみた。サンプリングレートは10usの逆数の100kHz。256段階で変化させているので8bit相当になる。15.9kHzの2段積み(とりあえずの値)。拡大PWM出力も拡大してみると波形が崩れているようだ。LPFを外すとPWM波形はちゃんと出力される。(オシロの仕様(?)で何回か分の波形が重ねて表示されるようです。)メモ:PWM出力にすればMCP4922を省略できそうだが、PWM出力だと何かいろいろ問題が出てきそうなので保留。Nucleo-F446REという上位バージョンだとDACも搭載されているようだ。DACを最初に製品化したのはシャープだったと思うが、ついにホンハイに買収されてなんとも悲しい話。今、WebでPDMで検索したらシャープのΔΣの技報がひっかかった。F401REで動作確認してみた。シールドを作ったとき、Nucleoが3.3V駆動なのに気付いていなくて、シールドは5V電源で動作するように作った。Arduino互換のピンソケットはちゃんと5Vのピンが出ているのでシールドはそのまま5V駆動できる。2.4Vとなっているので、3.3Vで駆動のNucleoから送っても問題ないようだ。}}A0、A1につないだPOTでフィルターのcutoffとresonanceをコントロールする。ch2:出力Resonanceをあげない状態だと、普通のLPFとしても動作する。Resonance(Q)と増幅率が連動しているのでResonanceを下げると出力レベルは下がる。出力は-300mVぐらいが下限の様だ。メモ:NJM13700を使ったVCAの入力振幅は±100mV以下にしないと歪むので、うまくレベル調整できるようにしたい。←まずはなるべく歪まないように設計。5Vを分圧して±2.5V程度でフィルターに使うOPAMPを駆動すると入出力レベルの調整が厳しい。LTC1144という負電圧を作り出すICがあるのでこれを使う手もありそう。(アナログ系の素子を±5Vの両電源で駆動できる)cutoff/resonanceの設定によってはファンクションジェネレータが異常発振してしまう。ベースマシン2016年6月16日木曜日ArduinoとNucleoでPCとのSerial(UART)通信の最高速度を調べてみる。SPIやI2Cの通信状態を解析しようと思うと補足した信号をPCに送ってから見やすいように整形・グラフ化するのが良さそうだ。Arduinoでは、I2Cはデフォルトで100kbps、SPIはよく覚えていないが数Mhzぐらいだった気がする。ArduinoのSerialはデフォルトが9600bps(9.6kbps)なので、I2Cと比べても明らかに遅い。HIDも使えそうなのでWebで調べてみたがUARTより特に速い感じでもない。SDカードに一回保存して...とか、TCP-IP/Wi-fiを使ってみるとか一瞬思ったがかなりめんどくさそう。Uno/NucleoとのSerial通信をどれぐらいの速度でできるか調べてみた。Uno最高1Mbpsで送信できたが、PC(putty)で受信すると取りこぼしが結構ある。Serial.print(strBuffer);}1Mbpsを指定した場合はおおよそ1Mbpsで出力できた。指定した0x55なので、ビットにすると0b01010101になる。したがってオシロの表示値の499.3KHzの倍の998.6kHzが送信レートになる。puttyの受信のようす’U'がいっぱい並んでいるが、0x55をASCIIコードで文字にすると'U'になる。ボーレートが1Mbpsで実際送信できたのは800kbps弱。時々読みこぼしてしまうようだ。}}表示値が1MHzなので、同じく倍にして2Mbps。Arduino互換のD0、D1には信号が出ていなくて、分割できるようになっている通信用(?)の基板のRX、TXと書いてあるところでUART信号を捕捉できた。F401REをmbedで使うと2Mbpsが最大のようだ。F401REは最大84MHz駆動となっているが、ほんとにそのクロックで動作してるのだろうか?mbedだとクロックの計測方法がわからない。Nucleoのボード上ではX3と書いてあるところにクリスタルを刺すような表示になっているが、実装されていない。clockだと921,600bpsまでしか指定できない。F401REで2Mbps。←データの取りこぼしがあるかどうかは要確認。Analyzerはなんとか出来そうもするがPC側のプログラムを作るのもしんどそうだなあ(^q^;フルスピードのUSBを使うにはどうすればいいんじゃろ。F401REで動作させてみた。回路図ブレッドボード図Nucleoは3.3V駆動なので、MCP4922も3.3V駆動させた。I-V変換回路とNJM13700は別に±5Vの電源を使用。AのVrefとして使うようにしてみた。AのVrefはVDD/2になり、channelAの出力は0V~VDD/2、3.3V駆動させているので0V~1.65Vの振幅になる。プログラムで後から振幅を調整できるのがメリット。波形の振幅は±100mV(p-p)以内におさえないと激しく歪む。歪ました方が面白い場合もあるのでトリマーで調節できるようにしようか。ADSR波形にLPFを入れてみるMCP4922で出力した波形がカックカクなので、出音がブツブツ言う。LPFを入れてアナログチックな波形にしてみた。LTSpiceでシミュレーション過渡解析125m秒と言うのは、120BPMの四分音符の長さ。これぐらいのなまり方ちょうど良さそう。ch2:WaveOutメモ:いまだに割と簡単に発振してしまう。意図しない発振なのでつぶす必要がある。デカップリングコンデンサは入れているので、NJM13700の使ってないB側をGND入力のボルテージフォロワーにして安定させてみるとか。オーディオ信号が発振するのでNJM13700の周辺だと思う。KitでEEPROMを使ってみる。mbedでMCP4922にエンベロープ波形を送るクラスを作る。808をシミュレーションしてみる。Nucleo(mbed)のPwmOutで波形を出力してみる。DCFシールドの動作確認ArduinoとNucleoでPCとのSerial(UART)通信の最高速度を調べてみる。MCP4922とNJM13700でSPI制御のDCA(Nucleo編)MCP4922とNJM13700でSPI制御のDCAを作ってみる。