Version 1 (modified by michkawa, 7 years ago) (diff) |
---|
BBBでGPIOを用いたリレー制御
この記事は、以前cERLでLaserOscillatorの微小温度制御用ヒーターを作った時のものです。
まだ、EPICS環境が少し古い状態のまま作成していますが、やっていることは同じなので、作成例として転載します。
Laser Oscillator用ヒーター制御
Laserで使用しているoscillatorは、出力するレーザー周波数を加速器の周波数に同期させるためにpiezoを使って調整しているが、piezoの調整範囲を超えるとリセットがかかり、再度同期するまで周波数が不定になる。burstではさほど問題ではないがCWでは問題になるので、piezoの調整範囲(35~65)を超えそうになった場合には、一旦ビームを止めて手動でリセットしていた。
偶に測定中に勝手にリセットがかかり、測定が中断することがあったので、この問題をある程度解決するために、oscillatorの下にヒータを入れて温度制御してやることにした。
機器
ヒーターをPWM制御することで、温度調整を行うようにした。
回路としては、ヒーター電源をリレーでON/OFFすることでDUTYを調整する。
ヒーター
ヒーター本体は、ユニバーサル基板に1w10Ω抵抗を4つ直列に接続したものを6列並列接続したものを作成。
電源
ヒーター用の電源は18V汎用直流電源を使用。
制御部
制御部は、BeagleBone Black(以下、BBB)に専用ユニバーサル基盤を載せて、リレー回路を実装したものを作成。
リレーの回路図は以下のようにした。
このリレー回路のON/OFFは、BBBのP8-11(GPIO45)pinに接続した。
このピンを使用したのは、起動時に特別は設定を行わなくてもGPIOとしてLOW状態のまま使用可能なため。起動時にHIGHになっているピンもある。
詳細はこのページを参照。
IOC
BBBのOSはDebian7.0で、開発環境はBBBのローカルに構築して今の所はNFSは使用していない。
BBB用のepics環境は、/opt/epicsに構築するように設定している。ファイルは他のBBBで以前構築したものをコピーして使用。
/cerl/epics/embed/BeagleBoneBlack/debian/epics_bbb_debian.tar.gzにコピーしておく。
device support
今回は、GPIOしか使用しないため、epics-devgpioを使用してみた。
以下のようにしてインストール。ファイルはgit-hubからダウンロードしたものをコピー。
root@beaglebone:~# cd /opt/epics/R314.12.4/modules/soft root@beaglebone:/opt/epics/R314.12.4/modules/soft# mkdir devgpio root@beaglebone:/opt/epics/R314.12.4/modules/soft/devgpio# unzip epics-devgpio-master.zip root@beaglebone:/opt/epics/R314.12.4/modules/soft/devgpio# mv epics-devgpio-master 1.0 root@beaglebone:/opt/epics/R314.12.4/modules/soft/devgpio/1.0# emacs -nw configure/RELEASE EPICS_BASE=/opt/epics/R314.12.4/base root@beaglebone:/opt/epics/R314.12.4/modules/soft/devgpio/1.0# make
app
appはrootのホームディレクトリに作成。
root@beaglebone:~# mkdir -p epics/dio/ root@beaglebone:~# cd epics/dio/ root@beaglebone:~/epics/dio# makeBaseApp.pl -t example dio root@beaglebone:~/epics/dio# makeBaseApp.pl -i -t example dio root@beaglebone:~/epics/dio# emacs -nw configure/RELEASE SNCSEQ=$(EPICS_BASE)/../modules/soft/seq/2.2.4 DEVGPIO=$(EPICS_BASE)/../modules/soft/devgpio/1.0 EPICS_BASE=/opt/epics/R314.12.4/base
始めはGPIOをON/OFFするためのレコードをマニュアルを参照して作成。
record(bo, "$(user):bbb:GPIO:45:OUT") { field(DESC, "BBB GPIO_45(P8_11) OUT") field(DTYP, "devgpio") field(OUT, "@P8_11 H") field(ZNAM, "L") field(ONAM, "H") }
コンパイル時には、dioApp/src/Makefileにdevgpioの設定を追加。
dio_DBD += devgpio.dbd dio_LIBS += devgpio
ブレッドボード上にLEDをつけて、起動時にOFF状態でレコードからON/OFFできることは確認した。
リレーのON/OFF時間をPWM制御する部分はsequencerで作成。10秒を1サイクルとしてON/OFFするようにした。
PI制御
始めは手動でdutyを変えていたが、キチンと制御するために、以前iBNCTで作成した冷却水温度のPI制御シーケンスを使用することにした。
sequencerは、duty制御用とは別に作成し、piezoの値変化から、dutyを制御するように作成した。
以下のようになって、一応制御できているようだ。
但し、現状では0%や100%になった場合には、手の出しようがないのでそのまま任せておくしかない。
これを解決するには、電源電圧を上げるか、抵抗を増やして発熱量を上げるか、外部からの温度変化が少なくなるように工夫するしかない。
Attachments (2)
- oscilator_ctrl.png (63.0 KB) - added by michkawa 7 years ago.
- relay_schematic.png (16.8 KB) - added by michkawa 7 years ago.
Download all attachments as: .zip