DIV5142の統合コントローラ(PICO)を検討する!の巻き(その2) 2027.11.18
(その1)はこちら

やっぱり忘れていました

以前の検討から2〜3か月経つと、すっかり忘れてしまっているようです。
思い出しながら作るより、すこしドキュメントを残しながら整理しつつ進めていったほうが良さそうです。
ということで、ほとんど備忘録になってしまいそうです。

フィルター構造は2種類用意しましょう!

PCM5142に書き込むフィルタ構造は2種類用意することにします。

biquad_12x2
 BIQUADフィルタを12連結したものです。最後にゲイン調整用のスケールを付け足しておきます。
 最大の減衰量は12*12=144dB/octになります。BPFとしてつかう場合はその半分の72dB/octです。
 減衰量は少ないですが、最大で192kHzまで対応可能です。
 2WAYでLPF,HPFで減衰量を288dB/octまで確保する場合はPCM5142を2連結で使います。

biquad_24x2
 BIQUADフィルタを24連結したものです。最後にゲイン調整用のスケールを付け足しておきます。
 最大の減衰量は12*24=288dB/octになります。BPFとしてつかう場合はその半分の144dB/octです。
 減衰量は大きいですが、最大で96kHzまでとなります。アップサンプリングをしない場合などは、この
 フィルタ構成を使う方が、基板が節約できます。

1.biquad_12x2の構成

ブロック図です。 <データファイル>


Build結果でcycleは255(<256)なので192kHzまで対応可能です。

<CFGファイル> PCM5142に書き込む命令、データのひな型です。
<C言語テーブル> CFGファイルをC言語テーブルに変換。


係数の格納場所は以下の通り。

L Biquad_1_1_N0 0x0000
Biquad_3_1_N0 0x000A
Biquad_5_1_N0 0x0014
Biquad_7_1_N0 0x001E
Biquad_9_1_N0 0x0028
Biquad_11_1_N0 0x0032
Biquad_13_1_N0 0x003C
Biquad_15_1_N0 0x0046
Biquad_17_1_N0 0x0050
Biquad_19_1_N0 0x005A
Biquad_21_1_N0 0x0064
Biquad_23_1_N0 0x006E
R Biquad_2_1_N0 0x0005
Biquad_4_1_N0 0x000F
Biquad_6_1_N0 0x0019
Biquad_8_1_N0 0x0023
Biquad_10_1_N0 0x002D
Biquad_12_1_N0 0x0037
Biquad_14_1_N0 0x0041
Biquad_16_1_N0 0x004B
Biquad_18_1_N0 0x0055
Biquad_20_1_N0 0x005F
Biquad_22_1_N0 0x0069
Biquad_24_1_N0 0x0073
L Scale_1_Coefval 0x0078
R Scale_2_Coefval 0x0079


2.biquad_24x2の構成

biquadフィルタを24連結しています。<データファイル>


命令サイクルは495(<512)なので96kHzまで対応可能です。

<CFGファイル> PCM5142に書き込む命令、データのひな型です。
<C言語テーブル> CFGファイルをC言語テーブルに変換。

係数の格納場所は以下の通り。

L Biquad_1_1_N0 0x0000
Biquad_3_1_N0 0x000A
Biquad_5_1_N0 0x0014
Biquad_7_1_N0 0x001E
Biquad_9_1_N0 0x0028
Biquad_11_1_N0 0x0032
Biquad_13_1_N0 0x003C
Biquad_15_1_N0 0x0046
Biquad_17_1_N0 0x0050
Biquad_19_1_N0 0x005A
Biquad_21_1_N0 0x0064
Biquad_23_1_N0 0x006E
Biquad_25_1_N0 0x007A
Biquad_27_1_N0 0x0084
Biquad_29_1_N0 0x008E
Biquad_31_1_N0 0x0098
Biquad_33_1_N0 0x00A2
Biquad_35_1_N0 0x00AC
Biquad_37_1_N0 0x00B6
Biquad_39_1_N0 0x00C0
Biquad_41_1_N0 0x00CA
Biquad_43_1_N0 0x00D4
Biquad_45_1_N0 0x00DE
Biquad_47_1_N0 0x00E8
R Biquad_2_1_N0 0x0005
Biquad_4_1_N0 0x000F
Biquad_6_1_N0 0x0019
Biquad_8_1_N0 0x0023
Biquad_10_1_N0 0x002D
Biquad_12_1_N0 0x0037
Biquad_14_1_N0 0x0041
Biquad_16_1_N0 0x004B
Biquad_18_1_N0 0x0055
Biquad_20_1_N0 0x005F
Biquad_22_1_N0 0x0069
Biquad_24_1_N0 0x0073
Biquad_26_1_N0 0x007F
Biquad_28_1_N0 0x0089
Biquad_30_1_N0 0x0093
Biquad_32_1_N0 0x009D
Biquad_34_1_N0 0x00A7
Biquad_36_1_N0 0x00B1
Biquad_38_1_N0 0x00BB
Biquad_42_1_N0 0x00CF
Biquad_44_1_N0 0x00D9
Biquad_46_1_N0 0x00E3
Biquad_48_1_N0 0x00ED
Biquad_50_1_N0 0x00C5
L Scale_1_Coefval 0x0078
R Scale_2_Coefval 0x0079


高次のフィルターの設定は、複数のPCM5142に異なるデータを書き込む必要があります。
フィルターの設定関数をどのようにするかは、すこし悩むところです。
寝ながら考えましょう(笑。

秋の夜長の半田付け 2024.11.19

Renew DIV5142も動くことが確認できたので、今回使用する最大枚数である
4枚のうち、残り3枚を作成です。
 PCM5142はすべて新品を使うのは勿体ないので、使わない基板から取り外します。
多分再利用できると思うけど、ダメだったらその時考えましょう。


この基板から2個のPCM5142を再利用しましょう。


ICの周りに半田をたっぷりつけて、左右を交互に温めながらICが動きだしたら、
一気にずらします。半田ゴテ1本でもできます。



取り外したPCM5142の周りの半田をある程度除去です。
このくらい残っていても、基板への半田付けは支障ありません。


合計4枚のRenew DIV5142が出来あがりました。右からNo.1〜4になります。再利用のPCM5142はNO4のCH3,CH4に搭載しました。
およそ1枚作成するのに1時間弱かかりました。3枚作ったので3時間ほどかかりました。

一応、動作確認 2024.11.20

4枚連結しての動作確認です。

4枚のRenew DIV5142とI2Cコントローラを連結しています。


反対から見るとこんな感じ。金属スペーサは10mmのものに1mmのスペーサを入れています。

動作させてみると、なぜか3枚目のRenewDIV5142の出力からプチノイズが観測されます。
残りのRenewDIV5142からノイズはありません。おそらく、接続する基板の枚数が多いため
ダンピング抵抗の不整合が生じているのでしょう。枚数を4枚から3枚に減らすとノイズが解消するようです。
そこで、ソースとなるRenew SRC4137のダンピング抵抗の両端をピンセットで挟むとノイズが消えるので、
そこを短絡させることにしました。このあたりは、ケーブルの長さとか色々と影響がでるところなので、
すこし調整が必要になるところでしょう。まあ、こういった対策も、経験になるので案外面白いところだったりします。


ソースとなるRenew SRC4137の出力のダンピング抵抗の一部(DATAライン)を
短絡させると、プチノイズが消えました。


突如、PICO(もどき)があ〜

PICO(もどき)にプログラムを入れるためには、最初にBOOTボタンを押しながらRESETスイッチを押します。
そうすると、PC画面上に仮想ディスクが現れるので、そこにバイナリーであるUF2ファイルをドラッグしてやります。
しかし、いきなりそれが出来なくなってしまいました。
何度BOOTボタンを押しながらRESETスイッチを押しても、仮想ディスクが現れません。
ひょっとして壊れた?
 おもむろに、違うPICO(もどき)に差し替えてみたとろこ、正常に動き出しました。
ひょっとして壊れたのかなあ〜。とりあえず、シールを貼って分別です。

なぜか動かなくなったPICO(もどき)です。

しばらくしてから、もう一度と思って不良シールを貼ったPICO(もどき)を差し込んでみたところ、
なんとプログラムの書き込みができるようになりました。で、問題はプログラムは書き込めて
RenewDIV5142も動いているようなのですが、今度はQVGA画面が真っ白のまま動いていません。
こちらが直ったら、あちらが壊れる?というパターンかな?
 ひょっとしてCPU(RP2040)の半田付けが悪いのだろうか?と思ってルーペで見てみますが、
よくわかりません。そこで、ダメ元なのでCPUの周りにフラクスを塗って半田ゴテで撫でまわすことに。
そうすると、なぜかQVGAも動き出しました。これが功を奏したかどうかわかりませんが、
とりあえず復活です。まあ、また動かなくなるまでしばらくこのままで使いましょう。

ダメ元でCPUの周りにフラクス塗って、半田ゴテを当て直してみました。
これが功を奏したかどうか不明ですが、また動き出しました。


他の表示器も試しておきましょう!

QVGAは表示文字数が多いのとグラフィックなどもできるので便利ですが、従来通りのLCDも
捨てがたいものがあります(レトロ感に浸れる)。
LCDも取り付けられるようにしているので、こちらも動作確認です。
ただ、PICの動作速度を見込んだプログラムになっているのですが、PICO(もどき)だと、
かなり高速なのでパルス幅などがギリギリになってしまいそうなので、PICO用にすこし
ライブラリを修正です。

バグ発見!(その1)

簡単なプログラムを組んで動かしてみようとしましたが、全然反応なし。
オシロでピン電圧を観測しますが、動いていません。どうやら74LV164の出力
がまったくでていません。調べてみると、本来VCCに接続されている箇所が
間違ってGNDに接続されていました。
ということで、修正です。


黄色部分を削除して、水色の線をジャンパーで飛ばします。


修正例です。あれ?髪の毛が映っているぞ?

これでOK

あたらためて秋月のSC2004のLCD(5V用)を接続して動くことが確認できました。

秋月のSC2004が動作しました。


中華LCDもテスト

秋月のLCDはすこし高いので、20x4のLCDはもっぱらALIで購入したものをつかっています。
だいたい送料込みで700円程度です。このLCDのいいところは、ピンがインラインなのでブレッドボードに
使い易いです。なおバックライトLEDの電流制限抵抗は100Ωにしています。


中華LCDも動作しました。

中華LCDを使用する場合には基板に修正点がありました。これは、動作させる前に気付いたのですが、
WR端子(5番ピン)がGNDに接続されていなかったので、これを接続です。ベタを削って接続しても
よかったのですが、GND端子(1番ピン)も近いので、そちらとジャンパーしました。


中華LCDを接続する場合は、1番ピンと5番ピンを接続します。

残る表示器はOLED(128x64)だけど、これは日を改めましょう。
もう、寝なくっちゃ!

久しぶりの作業復帰 2024.12.26

年末のあわただしいときですが、現実逃避のためこの作業に戻ってきました(笑。
それにしても、色々と脇道に逸れてしまいました。

さて、この統合コントローラをつかっての最終系は
コントローラ+RenewDIV5142+高精度DELAYI2cDAC
をすべて組み合わせて統一的に動かすことですが、
いきなりは無理なので、ひとつづつ動かしていきましょう。
ということで、まずは計画的に進めるためにSTEPを分けていきます。
まずは一番シンプルな構成STEP1からです。

STEP1
ハード構成: コントローラ+RenewDIV5142(1枚)の組み合わせ
ソフト内容: (1)44.1〜192kHz対応の4WAYチャンネルデバイダ(最大-72dB/oct)
        (2)44.1〜96kHz対応の4WAYチャンネルデバイだ(最大-144dB/oct)
        (3)44.1〜192kHz対応の2WAYチャンネルデバイダ(最大-144dB/oct)
        (4)44.1〜96kHz対応の2WAYチャンネルデバイダ(最大-288dB/oct)
調整機能:  遮断周波数設定、次数設定、フィルタ特性設定(バターワース、リンクウィッツ)、減衰量
         入力フォーマット(I2Sのみでもいいかな?)
         周波数設定(自動設定も可)

それにしても、1か月以上間をあけるとすっかり忘れてしまっています。
開発環境のためにH/W準備はすぐできますが、ソフトをかなり他の用途にむけて弄っていたので、
もとに戻すのにかなり手間取りました。とりあえず、基本的なところが動くことを確認して、本日は終了。


動作確認のための準備です。

  
  f=4800Hz(上:LPF,下:HPF)         f=5000Hz(上:LPF,下:HPF)      f=5200Hz(上:LPF,下:HPF)
 とりあえず、カットオフFc=5000Hzで定数設定して動作することだけ確認です(@-144dB/oct)


#さて、明日は今年最後の宿泊出張です。なんでこんな年末に?という感じですが、ひょっとして
#帰省する人の移動費を浮かせるために、設定されたんじゃ?帰りは混むかな?

捕らぬ狸の皮算用? 2024.12.29

Biquadを24素子連結することで、96kHzまでなら最大-144dB/octのBPF、あるいは-288dB/octのLPF,HPFが
作成できるかと思い込んでいましたが、実験してみて色々とわかってきました。

12素子+ゲイン調整スケール の場合
 これは192kHzまで対応可能なことを確認です。ただしマスタークロックは256FS以上が必要です。
動作可能な範囲は下記表です。打消し線のあるところは動作しません。
必要な命令サイクル(255)から考えて128FSでは動作できません。256FS以上のMCKがあれば、
192kHzまで対応可能なようです。

512FS 256FS 128FS
MCK 45,49MHz 88k、96k 176,192k
MCK 22,24MHz 44k,48k 88,96k 176,192k
MCK 11,12MHz 22k,24k 44,48k 88,96k

24素子+ゲイン調整スケール の場合
 これが予想外の動作でした。12素子の結果からマスタークロックは512FS以上が必要なことは
わかっていましたが、24素子のうち、最大で14素子までしかBIQUADの定数を設定することができません
でした。15素子以上に設定すると、まったく動かなくなりました。
動作範囲は下記の範囲ですが、14素子の利用までが限界です。

512FS 256FS 128FS
MCK 45,49MHz 88k、96k 176,192k
MCK 22,24MHz 44k,48k 88,96k 176,192k
MCK 11,12MHz 22k,24k 44,48k 88,96k

しかし、なぜだろう?FESP5142-Do(GEQ)では問題なく24素子で96kHzで動いたのだけど、
回路ブロックの構成が関係するのだろうか?違いはゲイン調整スケールの位置が、
FESP5142では先頭に、今回の検討では末尾にあるだけの違いだけど、それが関係
するのだろうか?それとも他に原因があるのかな?
一度色々と調べてみる必要がありそうです。

結構癖ありそう!(解決) 

どうやらBIQUADのメモリーへの配置にポイントがありそうです。
FESP5142-Doでは、BIQUADはLch、Rchともそれぞれが先頭から
連続になるように配置していましたが、今回は先頭からLch、Rchで
交互になるようにしていました。どうも交互に配置するのがダメなようです。
FESP5142-Doと同様に連続して並べてやることで、24素子が有効につかえる
ようになりました。
 しかし、同じ構造で動くパターンとそうでないパターンがあるのも困りものです。
コンパイラーがうまく処理してくれればいいのですが。
 ここまで調べるのに結構な時間がかかりました。
 まあ、年末年始に時間はあるので(←ほんと?)、色々と調べましょう。

いままで検討したメモリー配置。R,Lで互いに行きかうようなメモリー配置にすると、うまく動かないようです。



BIQUADのメモリーの配置をチャンネル毎に連続して並べることで全ての素子が使えるようになりました。

やり直し! 2024.12.30

BIQUADのメモリー配置はL,Rそれぞれで連続させたほうがよいようなので、
動いている12素子の分もふくめて、やり直しです。
ここの記載は備忘録みたいなものです。

12素子の場合 biquad_12x2a

ブロックはこんな感じ。以前と変わっていませんが、メモリー配置が連続になるようにしています。

リソース自体の変化はないのですが、動作は違うのですよね〜。

以下はBIQUAD素子の配置場所
int biquad12a_coeff_l[12+1]={0,0x00,0x05,0x0A,0x0F,0x14,0x19,0x1E,0x23,0x28,0x2D,0x32,0x37};
int biquad12a_coeff_r[12+1]={0,0x3C,0x41,0x46,0x4B,0x50,0x55,0x5A,0x5F,0x64,0x69,0x6E,0x73};
#define SCALE_SET12A_L (0xf0)
#define SCALE_SET12A_R (0xf1)

コンパイル結果: biquad_12x2a.cfg

24素子の場合 biquad_24x2a


int biquad24a_coeff_l[24+1]={0,0x00,0x05,0x0A,0x0F,0x14,0x19,0x1E,0x23,0x28,0x2D,0x32,0x37,0x3C,0x41,0x46,0x4B,0x50,0x55,0x5A,0x5F,0x64,0x69,0x6E,0x73};
int biquad24a_coeff_r[24+1]={0,0x78,0x7D,0x82,0x87,0x8C,0x91,0x96,0x9B,0xA0,0xA5,0xAA,0xAF,0xB4,0xB9,0xBE,0xC3,0xC8,0xCD,0xD2,0xD7,0xDC,0xE1,0xE6,0xEB};
#define SCALE_SET24A_L (0xf0)
#define SCALE_SET24A_R (0xf1)

コンパイル結果: biquad_24x2a.cfg

これで大丈夫かな〜
 あたらしく作成したデータをもとに、DIV5142のもっとも基本的な関数となるBPFの設定ルーチンを作成です。
試しに12,24素子をつかって、通過帯域1000〜5000HzでのBPF(-72および-144dB/oct)を組んで、実測です。
なお、サンプリング周波数は48kHzです。下図のように、問題なく動作しているようです。
 流石に-144dB/octになるとかなり急峻です。

基本となるBPFルーチンを作成。通過帯域1000〜5000Hzで減衰率は-72,-144dB/Octです。

割り込み停止の憂
 2024.12.31

今日は朝からプログラム作成です。大晦日なのに、部屋の掃除もせずに〜
と冷たい視線を浴びていますが、まあこんなときにしかできません。.


表示周りのプログラムを作成中です。周波数設定は1Hz単位で出来るように
する予定です。


基本的な部分はかなり出来ました。操作して設定変更した値をフラッシュメモリーに書き込むのですが、
これがまた嫌らしい。というのもフラッシュメモリーへの書き込みのときには割り込みを停止しないと
いけいないので、その方法を探します。
 その中でこれがヒット!というものがありました。

ints = save_and_disable_interrupts(); //割り込み禁止
flash_write_eeprom(); // フラッシュ書き込み
restore_interrupts(ints); //割り込み再開

save_and_disable_interruptsとrestore_interruptsなる関数があるらしいのです。
さっそく、これで試してみますが、コンパイルのときに
「そんな関数ライブラリはないで〜」
と文句をいってきて、動かすことすらできません。
PICOのディレクトリを探しますが、どこにあるのだろう?それともないのかな?
しばらく悪戦苦闘しますが、もうギブアップ!

それで、他の方法を探します。
すると、タイマー割り込みをキャンセルする方法があったので、それを使ってみることに。

cancel_repeating_timer(&timer); //タイマー割り込み停止
flash_write_eeprom(); // フラッシュ書き込み
add_repeating_timer_ms(-1,&timer_callback,NULL,&timer);//割り込み再開

cancel_repeating_timerをつかって割り込みを停止させます。
この関数は問題なくみつかったので、プログラムとしては試せたのですが、
フラッシュの書き込みのときにハングアップしてしまいました。

なぜ?
フラッシュの書き込みができないと、どうしようもありません。かといって、タイマー割り込みを使わずに
プログラムを書くのも困難を極めそうです。で、色々と調べてみると、タイマー割り込みを停止しても
最後っ屁っで、割り込みをかけてくるかもしれないと想定です。そこで、割り込み禁止後に、
割り込み周期よりすこし長い時間の待ちをいれることにしました。

cancel_repeating_timer(&timer); //タイマー割り込み停止
delay_us(1500);  //1.5msのディレイ
flash_write_eeprom(); // フラッシュ書き込み
add_repeating_timer_ms(-1,&timer_callback,NULL,&timer);//割り込み再開

これで、問題なくプログラムが動作するようになりました。
ふう〜、色々なことで躓くなあ〜。
まあ、それもプログラムの楽しさです。

あ、もうそろそろ来年になっちゃうな〜。

(その3につづく)