電源から決めた電流をひっぱるモジュールを作りたい。電源回路や電池の評価に使う。 世の中には電子負荷とか充放電試験装置とかあるにはあるんだけど、プログラム可能なステップ数やサンプリングレートが限られてたり、制御範囲が所望の範囲じゃなかったりってことで、こういう場合は自分で作ってしまおう。ちな、成功する保証はない。
目次
- シンク回路確認 シンク回路が動くのかどうか確認していく
- AVR128DB28のArduino化 まずこんな感じではんだブリッジを作る。
- 基準電圧選択機能の確認 まずは基準電圧が狙い通りできているか。ボルテージフォロアの出力が4つの基準電圧なのでそれを測定してみる。
- MUX確認 Arduino化したAVR128DB28にコードを書いて動きを確認する。GPIOでMUX_A0, MUX_A1, MUX_ENを操作するだけ、、、まあそれだけじゃちとさみしいのでLEDも点滅させてみる。
- DAC確認 こちらもArduino化したAVR128DB28にコードを書いて動きを確認する。MUXは2.048V出力設定で固定とする。そして、MCP4921を制御してみるって訳だ。
Arduino IDEでこんな感じで設定して、最後に「ブートローダを書き込む」 んで、はんだブリッジを変更する。
んで、Arduino IDEからBlinkを書き込んでみる。
と、ちゃんとLEDが点滅する。(めんどくさいので動画無し)
| 測定点 | 電圧 |
| V1 | 2.049V |
| V2 | 205.4mV |
| V3 | 20.4mV |
| V4 | 2.8mV |
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 |
| TMUX1104 | ノード |
| S1 | V_1 |
| S2 | V_3 |
| S3 | V_2 |
| S4 | V_4 |
tmux1104ctrl.inoで、こんな感じになる(本当は高速に動かしてオシロでってのがスジなんだけど、うちのオシロのオフセットがひどいんでテスターのロギング機能使うことにした)
横軸サンプリング(1S/s、、、あ、ってことは秒ってことか)、縦軸電圧(対数スケール)。
まあ、ちゃんと選択できてるね。
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。
- シンク回路ソフト シンク回路を動作させるガチなソフトを作成していく
Pattern A のタイマ制御とオーバーシュート表現
最初2サンプルの
0x3257(~30mV設定)による初期スパイク(約20us)のあと、8サンプル(80us)の~20.48mVフラット期間を経て、5サンプル(50us)の Low(0mV)へ遷移しています。この150usの波形が正確に 4周期 繰り返されています(t = 210us ~ 810us)。
Pattern B のステップ減衰
2サンプル(20us)ごとの振幅ステップ(20mV ➔ 10mV ➔ 0mV)が正確に追従しており、60usのパルスが 4周期 出力されています(t = 810us ~ 1050us)。
Pattern C の長周期マルチレベル出力
100us(10サンプル)の低振幅(~5mV)から100us(10サンプル)の中振幅(~10mV)への切り替え、および40usのLow出力が正確に 2周期 出力されています(t = 1050us ~ 1530us)。
Pattern D と
loop()の周回動作Pattern D による 200us のベースライン休止(t = 1530us ~ 1730us)を経て、t ≒ 1730us から再び Pattern A に戻り、全体のシーケンス(約1.52ms周期)が繰り返されています。
今回制御マイコンとして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サンプルの10.0usタイマ精度、Far Addressからの直接読み出し、DAC/MUXの切り替えタイミングともに意図通りの完璧な動作です。
ということなので、きっとうまくいっているに違いない(ときどきだましに来るけど、今回はたぶん大丈夫;)。てか、もっと高級なオシロ欲しい🥺(目次)


































