2026年8月11日火曜日

プログラマブルシンクモジュール(2)



電源から決めた電流をひっぱるモジュールを作りたい。電源回路や電池の評価に使う。
世の中には電子負荷とか充放電試験装置とかあるにはあるんだけど、プログラム可能なステップ数やサンプリングレートが限られてたり、制御範囲が所望の範囲じゃなかったりってことで、こういう場合は自分で作ってしまおう。ちな、成功する保証はない。

目次
  1. シンク回路確認
  2. シンク回路ソフト
  3. シンク回路動作確認

  1. シンク回路確認    
  2. シンク回路が動くのかどうか確認していく
    • AVR128DB28のArduino化
    • まずこんな感じではんだブリッジを作る。
      Arduino IDEでこんな感じで設定して、最後に「ブートローダを書き込む」
      んで、はんだブリッジを変更する。
      んで、Arduino IDEからBlinkを書き込んでみる。
      と、ちゃんとLEDが点滅する。(めんどくさいので動画無し)

    • 基準電圧選択機能の確認
    • まずは基準電圧が狙い通りできているか。ボルテージフォロアの出力が4つの基準電圧なのでそれを測定してみる。
      測定点 電圧
      V1 2.049V
      V2 205.4mV
      V3 20.4mV
      V4 2.8mV
      ざっくりあってはいるんだけど、正直うちのテスターでは正確に測定できていないんじゃないかと思う。特に一番低い電圧。現時点ではこれで良しとしておく。デジタルマルチメーター欲しい🥺

    • MUX確認
    • Arduino化したAVR128DB28にコードを書いて動きを確認する。GPIOでMUX_A0, MUX_A1, MUX_ENを操作するだけ、、、まあそれだけじゃちとさみしいのでLEDも点滅させてみる。
      TMUX1104の真理値表はこんなん
      EN A1 A0 Selected Input Connected To Drain (D) Pin
      0 X X All channels are off
      1 0 0 S1
      1 0 1 S2
      1 1 0 S3
      1 1 1 S4
      (まあ、「"All channels are off"ってどういう状態?」とか、「論理の"1"が電圧レベルとして"H"なのか"L"なのかわからん」とか正直めっちゃ不親切なデータシートです。Geminiに調べさせたら確かに記述はないけど、一般的に"0"は"L"、"1"は"H"だからそう思っていいんじゃないかって。世界的な半導体メーカーなのに色々雑なんよねーこのメーカー。)
      TMUX1104 ノード
      S1 V_1
      S2 V_3
      S3 V_2
      S4 V_4
      回路とはこんな感じで接続されていて、S1->S3->S2->S4って選択していく感じのArduinoコードを書いていく。ちょっとカッコつけてタイマー割り込みで状態遷移していくスタイル。
      tmux1104ctrl.ino
      で、こんな感じになる(本当は高速に動かしてオシロでってのがスジなんだけど、うちのオシロのオフセットがひどいんでテスターのロギング機能使うことにした)
      横軸サンプリング(1S/s、、、あ、ってことは秒ってことか)、縦軸電圧(対数スケール)。
      まあ、ちゃんと選択できてるね。

    • DAC確認
    • こちらもArduino化したAVR128DB28にコードを書いて動きを確認する。MUXは2.048V出力設定で固定とする。そして、MCP4921を制御してみるって訳だ。
      Microchipのデータシートによると、
      ってことで、これをSPIで送るだけなんだけど、ここで、問題が、、、普通にやっても当初仕様の250kS/sはどうあがいても達成できない。くそう、Geminiと相談してAVR128DB28って決めたのに、実際に工夫無くやると全くダメ。んで、クリスタルを32MHzに付け替えて(オーバークロックだけど、このコアは32MHzは余裕でいけるらしい)、bootloaderも32MHz crystal (overclocked)にして再書き込みして、コードも絶妙に調整して、、、なんとか100kS/s。こういうことあるから余裕のある設計が必要よね( ˘ω˘ ; )
      mcp4921ctrl.ino
      んで、こうなる
      0, 1/2, 1=(2.048V ideal)の3相を30us周期で動いているから10us/S=100kS/s。
    (目次)

  1. シンク回路ソフト    
  2. シンク回路を動作させるガチなソフトを作成していく
    今回制御マイコンとしてAVR128DB28を洗濯した理由がFlash領域が広いってことなので、これをしっかり使えるように構成する。で、AVR128DB28のFlashは32kBごとに区切られていて(詳しくは、手前味噌ながらこちら(https://sunday-engineer.jimdofree.com/2025/02/12/avr128dbxx%E3%81%AEprogmem%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/))、連続してデータを保存するのはコードの複雑さが増えてしまう。それと、電流をひっぱるテストをするときって比較的単純なパタンを繰り返すことも多いので、Flashにいくつかのパタン定義をして、このパタンを繰り返したり、さらに決めた順序で繰り返したりする使い方を考える。まあコード見ればわかるでしょってことで、
    mcp4921ctrl1.ino
    これを実行するとこうなる。
    以下、Geminiにコードと波形を比較して考察してもらった結果^^;

    詳細な波形解析ポイント

    1. Pattern A のタイマ制御とオーバーシュート表現

      • 最初2サンプルの 0x3257(~30mV設定)による初期スパイク(約20us)のあと、8サンプル(80us)の ~20.48mV フラット期間を経て、5サンプル(50us)の Low(0mV)へ遷移しています。この150usの波形が正確に 4周期 繰り返されています(t = 210us ~ 810us)。

    2. Pattern B のステップ減衰

      • 2サンプル(20us)ごとの振幅ステップ(20mV ➔ 10mV ➔ 0mV)が正確に追従しており、60usのパルスが 4周期 出力されています(t = 810us ~ 1050us)。

    3. Pattern C の長周期マルチレベル出力

      • 100us(10サンプル)の低振幅(~5mV)から100us(10サンプル)の中振幅(~10mV)への切り替え、および40usのLow出力が正確に 2周期 出力されています(t = 1050us ~ 1530us)。

    4. Pattern D と loop() の周回動作

      • Pattern D による 200us のベースライン休止(t = 1530us ~ 1730us)を経て、t ≒ 1730us から再び Pattern A に戻り、全体のシーケンス(約1.52ms周期)が繰り返されています。

    1サンプルの10.0usタイマ精度、Far Addressからの直接読み出し、DAC/MUXの切り替えタイミングともに意図通りの完璧な動作です。

    ということなので、きっとうまくいっているに違いない。
    いや、10us周期でスパイク入ってるのとPatternBの最初の降圧で異常値出てる。PatternBの最初の降圧の異常値はDAC遅延が関係してそうだけど、、、いろいろこねくり回したけど、どうにもならんかった、、、10us周期のスパイクはタスクを10us周期にしているからMUX更新とかDACラッチとかのデジタル系が飛んできているかと思いきや、タスク周期を20usにしても10us周期でスパイクが来る、、、なんだかわからん、、、 てか、もっと高級なオシロ欲しい🥺
    (目次)

  1. シンク回路動作確認    
  2. 実際に電流をひっぱってみる
    こんな感じでエネループ2本直列の電源から電流をひっぱってみる。まあ最終段の抵抗の電位差がエネループから流れる電流ってことよね。んでもって、この抵抗の電圧はオペアンプのイマジナリショートによってIN(+)と同じ電圧になっている。だから電流を制御できるわけだよ。まあ結局こんな感じ
    うーん、、、やっぱりノイズが気になる。PatternBの異常値は起こってるのがここだけだから設定値の与え方で回避可能かもしれない。
    いちおうエネループ側にシャント抵抗47ohmを差し込んで、この抵抗の電位差を電流に変換したものがこちら。
    うーん、、、オフセットしてるなあ、、、高性能オシロほしい🥲
    まあ、とりあえず、色々課題はあるけど、電流を吸い込む回路とそのソフトは完成、、、てことにしよう;
    (目次)

0 件のコメント:

コメントを投稿