TinkercadによるArduinoシミュレーション28 ~ DCDCコンバーター
1. DCDCコンバーター
前回はPWMからアナログ波形出力する方法について紹介したが、PWMの応用としてDCDCコンバーターがあるので今回はこれを紹介したい。
DCDCコンバーターとは直流電圧を異なる直流電圧へ変換する機器の総称で、高電圧・高電流対応のものでなければ下のような電子部品パッケージのタイプが一般に市販されている。
2. DCDCコンバーターの構成
直流電圧を異なる電圧へ変換する方法としては、抵抗による電圧降下を利用する方法とスイッチングによるデューティー比を利用する方法があり前者はリニアレギュレータと呼ばれ後者をDCDCコンバーター(あるいはスイッチングレギュレータ)を指す場合が多い。なおDCDCコンバーターは入力電圧より出力電圧の方が低い降圧コンバーター(バックコンバーター)と出力電圧の方が高い昇圧コンバーター(ブーストコンバーター)の2種類がある。
一般的なDCDC降圧コンバーターの回路を下に示す。
スイッチング素子はnpnトランジスタとしているが、MOSFETもよく使われる。トランジスタにパルス制御信号を入力すると、パルス信号に応じてコレクタからエミッタへ電流がON/OFFすることにより、入力電圧がチョッピングされる。後段のダイオード、インダクタ、キャパシタによりチョッピングされた入力電圧を平滑化して直流電圧に変換する。詳しい説明は第3回 DC-DCコンバータの回路技術|パワーエレクトロニクス・ワールド|TDK Techno Magazineを参照。
2. DCDCコンバーターのシミュレーション
上のDCDC降圧コンバーターの回路シミュレーションをTinkercadで実行したのが下図になる。トランジスタのパルス信号はファンクションジェネレータの矩形信号1kHzを用いた。(デューティー比は50%)入力電圧は9V電池を接続した。パルス信号のデューティー比は50%であることから、DCDCコンバーターの出力は4.5Vになるがその通りになっている。
次に上のファンクションジェネレータの代わりにArduinoのanalogWrite()
を利用したPWMパルスをトランジスタのベースに入力して、DCDC降圧コンバーターを構成することを考える。Tinkercad上でシミュレーションしようとしたが、シミュレーション時間が進まずストップしてしまった。恐らくArduinoと周辺回路の構成にダイオードやトランジスタのような非線形素子が増えると、計算時間が異常に増えてしまうようだ。そこで本来のDCDC降圧コンバーターの原理図と構成が異なるが、下のように電圧入力側から分岐して、CRフィルタ回路で平滑化する回路で代用することにした。
トランジスタがONのときは、電流がエミッタからグラウンドに流れるのでVout=0、OFFのときは電流が出力側に流れるのでVout=Vinとなる。よってベースのパルス信号のデューティー比が低いとVoutが高くなり、デューティー比が低いとVoutが高くなる。平滑化のところはインダクタの代わりに抵抗としており、そこで抵抗ロスが発生してしまうため本来のDCDC降圧コンバーターよりも電圧変換ロスが大きい。
Arduinoの5ピン(Unoの場合、5ピンのPWMは980Hz)からPWMをトランジスタに入力するようにスケッチは以下のようにした。analogWrite()
に入力する値は0-255で指定するが、今回は200とした。
int pin; void setup() { pin=5; pinMode(pin, OUTPUT); } void loop() { analogWrite(pin,200); }
Tinkercadでのシミュレーション実行結果を下に示す。出力電圧波形はCRフィルタによって平滑化されていること、PWMのデューティー比は高いが、出力DCは1.1Vで1/9程度に降圧されていることが確認できる。 なおデューティ比から考えると9*(1-200/255)=1.94Vが出力されるはずだが、抵抗の電圧降下の影響と考えられる。入力側100Ωを10Ω等小さくすると出力が1.9V程度になるが、実際に入力側の抵抗を小さくすると、今回の回路の構成だと電流がトランジスタを通ってグラウンドに流れていくためトランジスタの耐電流を越えると破損する可能性がある。(汎用炭素抵抗も使用電力に制約があり破損する。今回の回路も100Ωで最大90mA流れるので通常の炭素抵抗の耐電力は超えている)シミュレーション上は破損はないので、このようなことは気にせずできてしまう。
4. 出力電圧のフィードバック制御
最後に上の回路で出力電圧をArduinoのアナログ入力端子に接続して電圧を読み出し、設定した目標電圧に近づくように5ピンから出力するPWMを変動させるようにフィードバック制御することを考える。上のシミュレーションの回路から電圧出力をアナログ入力端子0に入力し、スケッチを以下のようにする。
int pin; int val,width,dW; float Vout,Vtemp,dV; void setup() { pin=5; pinMode(pin, OUTPUT); Vout=1.5; //目標電圧 width=200; // 初期PWM入力値 dW=1; // PWM変動幅 Serial.begin(9600); } void loop() { analogWrite(pin,width); // PWMを出力 delay(100); // 静定時間を適度にとる val=analogRead(0); Vtemp=(float)val/1023*5; //アナログ読み取り→電圧 dV=Vout-Vtemp; // 目標電圧と読み取り電圧差分 if(dV>0.05){ width=width-dW; //パルス幅減らす } else if(dV<-0.05){ width=width+dW; //パルス幅増やす } else{ } // 以下表示 Serial.print("Output: "); Serial.print(Vtemp); //読み取り電圧 Serial.print("V "); Serial.print("Err: "); Serial.print(dV); //目標電圧との差分 Serial.println("V"); }
analogWrite
でPWMを出力したら、少し時間をおいてanalogRead
で読み出して目標よりも足りなければパルス幅を減らして出力を上げる、逆に目標を越えていればパルス幅を増やして出力を下げるという処理をしている。
増減のパルス幅は単純に固定しているため目標との差が大きい場合は制御に時間がかかる。ここでは取り上げないがPID制御のように目標との差分に応じてパルス幅の増減量を変動させれば、目標との差分が大きくても早く収束させることができる。
9V電池を1.5V出力になるようにフィードバック制御してTinkercadのシミュレーション結果を下に示す。PWMの初期値,すなわちanalogWrite()
に入力する値は200としているので、初期の出力電圧は1.1Vでそこからパルス幅を調整して1.5Vになっている。表示は小さいが、シリアルモニタに各ステップでの出力電圧(読み出し電圧)と目標との差分を表示しており、徐々に差分が0に近づいていくことがわかると思う。
5. まとめ
今回はPWMの応用としてDCDCコンバーターをArduinoとトランジスタ・CRフィルタと組み合させてTinkercad上でシミュレーションした。またArduinoの入力端子に出力電圧をフィードバックすることで、所望の電圧になるようにPWMを制御するところもシミュレーションで実行した。