図3はパワーブロックの回路図です。パワーMOSFETは連載第11回「パワーMOSFETでシャー芯をともす」で登場した「STP75NF75」です。
STP75NF75のゲート(g)は、ArduinoのGPIOの10番に接続します。ドレイン(d)はフライバックトランスの1次側の一端に接続、もう1つのコイルの端は実験用電源の正極に接続します。ソース(s)はグランドに接続します。このグランドは実験用電源のグランドとArduinoのグランドと共通です。
リスト1はArduinoで動作させるプログラムです。外付けの可変抵抗で周波数を決定します。生成したパルスは、パワーブロックのパワーMOSFETのゲートに接続され、フライバックトランスの一次側をドライブします。
1: #include <avr/io.h> 2: 3: int val,prev; 4: 5: void setup() { 6: pinMode(10, OUTPUT); 7: pinMode(14, OUTPUT); 8: pinMode(16, OUTPUT); 9: digitalWrite(14,LOW); 10: digitalWrite(16,HIGH); 11: TCCR1A = 0b00100001; 12: TCCR1B = 0b00010010; 13: } 14: 15: void loop(){ 16: val = analogRead(A1); 17: if (val!=prev){ 18: OCR1A = val*2; 19: OCR1B = val; 20: prev = val; 21: } 22: }
1行目のinclude文は、ArduinoのAVRマイコンに内蔵されてるペリフェラルデバイスのレジスターのアドレスをシンボル名でアクセスできるよう定義されているヘッダファイルです。
3行目ではグローバル変数が定義されています。valにはA-Dコンバーターから読み込んだ可変抵抗の電圧の値が格納されます。prevはvalの1つ前の値が格納されます。
5行目のsetup関数には、AVRマイコンを起動した後に一度だけ実行されるコードを記述します。6行目では10番ピンを出力ピンに設定しています。このピンはArduinoで生成したパルスをパワーブロックに渡すためのものです。7行目では14番ピンを出力ピンに設定しています。9行目でこのピンは低い電圧レベルを出力しますが、これは3本ある可変抵抗のピンのうち端にあるピンに接続されています。前出のブロックダイヤグラムではグランドに接続されていますが、GPIOの出力を低レベルとしてグランドの代わりにしています。
8行目のピンも出力に設定されていますが、10行目で出力はHighレベルの電圧を出力するように設定しています。このピンもブロックダイヤグラムでは正電源に接続する図になっていますが、可変抵抗の正電源の代わりを16番ピンが行っています。
このように、本来GPIOを出力として使う場合は外部に電圧の高低を伝える役割を果たしますが、今回はこの2本のピンは電源の+/−として使っています。このような使い方をしているのはブレッドボード上の配線を省くためです。
デメリットとしては、せっかくのインタフェース用のピンがその用途に使えなくなってしまいます。ですが今回の回路の場合、GPIOピンは十分に余っていますのでこの用途に使いました。ただし、GPIOがドライブできる電流を超えて消費するデバイスには使えません。
11行目と12行目はタイマー2のレジスターの設定を行っています。これらのレジスターのそれぞれのビットの意味などは、AVRの仕様書や、たくさん見つかるであろうネット上の解説Webサイトを参考にしてください。
15行目からはloop関数で、ある一定間隔で呼ばれるコードをここに記述します。16行目でアナログ入力のA1に入力された電圧を10ビットの分解能で読み込みます。可変抵抗でHighレベルの電圧とLowレベルの電圧を分圧した電圧が入力されます。このため、最大が1023、最低が0となります。
17行目で先ほど入力した電圧の値と以前に入力した電圧の値(prev)に差があると18行目と19行目を実行します。18行目ではOCR1Aに出力したい波形の長さを設定します。19行目ではOCR1Bに波形をLowレベルにしたいタイミングを設定します。
このコードであれば、パルス長の半分のタイミングに波形はLowとなりますので、デューティー比はちょうど半分の50%となります。20行目では、先ほどA1で取得した値をprevに格納します。17行目のif文で判定しているのは、可変抵抗を操作していない場合には先ほどの動作をスキップしたかったからです。
Copyright © ITmedia, Inc. All Rights Reserved.