PadaukマイコンのVDD,VPP用の可変電源を作り、ROMの内容をダンプできるようにしたいと思います。
可変電源の設計
ブロック図
ブロック図は上記のようにしようと思います。ESP32のPWM出力をLPFでアナログ電圧に変換し、オペアンプの非反転増幅回路で振幅電流ともに増幅します。
Padaukマイコンの電源の電流は20mA程度と、EEVblogのスレッドにあった気がするので、オペアンプには最大40mA電流が出力できるLM358にしようと思います。
DCDCの設計
LM358は、電源電圧から1.5V下までの電圧は出力できません。Voutを12Vまで出せるようにするためには、12V+1.5Vで13.5Vの電源電圧が必要です。
PadaukマイコンのVPPはデバイスによって変わりますが、最大で11Vあればいいようなので、余裕を持って12Vとし、DCDCの電圧は13.5Vにしようと思います。
DCDCのICには中華昇圧DCDCでは有名なMT3608を使います。
R2を10kΩとした時のR1を求めます。R2の値の計算には以前作った計算ツールを使います。
MT3608のVrefは0.6Vです。Vrefに0.6V、R2に10kΩ、Voutに13.5V、E系列にE12を指定すると、右側に計算結果が表示されます。
R1を220kΩにした場合、Voutが13.8Vになるようです。問題ないのでこの値を使おうと思います。
LPFの設計
LPFは簡単なRCフィルターにしようと思います。とりあえず10kΩと0.1uFで特性を見てみると、20kHzで-40dBでした。PWMの周波数を20kHzとすると、20kHzは1/100に減衰します。3.3Vの1/100なので、リップルは33mVです。まあいいかなと思います。
増幅回路の設計
続いて増幅回路を設計します。オペアンプの電源には13.8Vが供給されています。PadaukマイコンのVPPは12V程度、VDDは6V程度が上限なので、そうなるように非反転増幅回路のゲインを設定します。
LPFの出力の最大電圧は3.3Vです。VPPが12Vくらいになるためには、ゲインは3.6倍くらいです。E12系列の抵抗でいい感じとして、10kΩと27kΩのフィードバック抵抗にしました。
そうすると、PWMが100%の時で出力電圧が12.2Vとなります。
続いて同様にVDDも設計します。VDDが6V程度になるためには非反転増幅回路のゲインは2倍がいい感じです。
PWMが100%の時で出力電圧は6.6Vとなります。
今回、オペアンプの出力にダイオードを追加して、電流の吸い込みはしないようにしました。Padaukマイコンは、プログラミングモードにするために、先にVPPをONし、後からVDDをONします。このVPPがONでVDDが0Vの状態の時に、マイコン内部でVPPからVDDへ大きな電流が流れてしまうそうです。そこで、VDDが0Vでも電流を吸い込まないように、オペアンプの出力にダイオードを追加しました。
基板に実装
設計した回路を基板に実装します。チップ部品を使っているので、とても小さく作れました。
動作の確認
ESP32のPWMを制御して、0から12Vまで0.5V刻みで出力した時のVPP出力の波形です。綺麗なステップ波形になっています。12V設定時の出力電圧は11.9Vと、ほぼ設定通りの出力です。
同様にESP32のPWMを制御して、0から6Vまで0.2V刻みの出力波形です。こちらも綺麗はステップ波形となっています。6V設定時の出力電圧は5.9Vとこちらもいい感じです。
回路の完成
ブレッドボードに回路を作り、回路の完成です。
デバイスIDを読み取ってみる
setVPPVoltage(5.5); //VPP=5.5V delay(6); setVDDVoltage(2.5); //VDD=2.5V delay(6); sendData(0xA5A5A5A6,32); //send 32bit receiveData(&data,16); //receive 16bit Serial.printf("ID=%x\n",data); setVDDVoltage(0.0); setVPPVoltage(0.0);
VPP,VDDの電圧を設定できるようにプログラムを修正しました。これでデバイスIDが読み取れるはずです。それでは実行してみましょう。
おおお!!デバイスIDのAA1が読み取れました!
フラッシュROMの内容を読み取ってみる
sendData(addr,13); //addr 13bit PDA_INPUT(); PCK_UP(); delayMicroseconds(5); receiveData(&data,14); //receive 14bit Serial.printf("%04x",data); PDA_OUTPUT();
今度はフラッシュROMの内容を読み取ってみましょう。
何も書き込んでいないので全て0x03FFが返ってきます。
最後に近い0x7ED〜0x7EFに何かしら書いてあります。キャリブレーションデータでしょうか?
何も書き込んでいないで、正しく読めているかわかりませんが、ROMの最後に何かデータがあるので、とりあえずダンプできていそうです。
さて次回は
ESP32をUSBデバイスのマスストレージに設定して、ダンプした結果をパソコンから読み取れるようにしたいと思います。
コメント