ATtiny15L は内部に 1.22V±0.05V の基準電圧を持っている。この基準電圧と電源電圧を比較すれば電源電圧の低下を監視することができる。
アナログコンパレータを使うために必要となるレジスタは、アナログコンパレータ制御/ステータスレジスタだけ。このレジスタ ACSR(Analog Comparator Control and Status Register) ではアナログコンパレータの電源 ON/OFF の設定や、内部基準電圧の選択や、アナログコンパレータ出力や、アナログコンパレータ割り込みに関する設定等ができる。
ATtiny15L では PB0 と PB1 がアナログコンパレータ入力に割り当てられていて、 PB0 に基準となる電圧を入力する。今回は内部基準電圧を使うので PB0 には何もつながない。被測定電圧を PB1 に入力する。こちらには電池電圧を抵抗で分圧して入力する。被測定電圧が基準電圧を下回るとコンパレータ出力が 1 になり、上回ると 0 になる。
リチウム電池の電圧は充電初期で 4.2V 。使用末期電圧が 3V となる。そこで電源電圧が 3.1V に低下したら発光ダイオードを点灯させるようにする。電源電圧が 3.1V の時に抵抗で分圧された被測定電圧が内部基準電圧の 1.22V をわずかに下回るように設定すれば、コンパレータ出力が 1 になる。この設定電圧を作り出すために 10K オームの抵抗と 10K オームのトリムポットを使ってみた。
割り込みを使う方法もあるが、今回は最も簡単な割り込みを使わない方法でプログラミングしてみた。なお今回のプログラムでは内蔵発振周波数確度は問題ないので校正値の OSCCAL レジスタへのセットは省略した。
ldi temp, 0b01000000 ; ||||||||________ACIS0: Analog Comparator Interrupt Mode Select ; |||||||_________ACIS1: Analog Comparator Interrupt Mode Select ; |||||| 今回はアナログコンパレータ割り込みを使わないので設定不要 ; ||||||__________予約ビットなので設定不要 ; |||||___________ACIE: Analog Comparator Interrupt Enable ; |||| アナログコンパレータ許可ビット 今回は0で未使用 ; ||||____________ACI: Analog Comparator Interrupt Flag ; |||_____________ACO: Analog Comparator Output ; || コンパレータ出力がここにセットされる ; ||______________ACBG: Analog Comparator Bandgap Select ; | 今回は内部基準電圧(1.22V±0.05V)を使う ; |_______________ACD: Analog Comparator Disable ; このビットをセットするとアナログコンパレータ禁止となる out ACSR, tempはじめに PB1 をアナログコンパレータ入力に設定し、 PB0 と PB1 を内部プルアップなしに設定する。あとは ACSR のアナログコンパレータ出力ビットを常に監視して、 1 がセットされたら発光ダイオードを点灯させる。
わかれば簡単だが、 ACSR レジスタの使い方を理解するのに結構時間がかかってしまった。今回のプログラムは実際に ATtiny15L に書き込み、可変電源を使って電源電圧が 3.1V に低下したときに LED が点灯するようにトリムポットを調整してみた。ごくわずかな電圧変化で LED が点滅することが確認できたので十分実用になりそうだ。
前から気になっていたが、 8 ピンの AVR も 8 ピンの PIC より電流食いだ。今回のテストでは 3V の電源電圧で約 3mA の電流を消費している。もちろん LED が消えた状態で。そこで次回は少しでも消費電流を抑えるために sleep 命令を使ったプログラムを考えてみる。せっかくだからアナログコンパレータ割り込みも一緒に勉強してみる。