2015年10月4日日曜日

小ネタ実験: 電圧検知できるLEDのパイロットランプ AVRを使う

デジタルノイズが乗りそうで気が進まないので保留していたが、AVRの周辺機能にアナログ・コンパレータがあるので、これを使って電圧検知のテストをしてみた。

使ったのはATtiny13で、たった8Pinだがアナログ・コンパレータもADCも付いている。

ブレッドボード図
AVRのコンパレータは1入力で内蔵のリファレンス電圧(1.1V)と比較できるので、これを使ってみた。

Pin3(PB4)がLED出力、Pin6(AIN1)が検知する電圧入力だ。

 #define F_CPU 9600000  
 #include <avr/io.h>  
 #include <avr/interrupt.h>  
 #include <util/delay.h>  
 ISR (ANA_COMP_vect)  
 {  
      if (ACSR & (1 << ACO))  
      {  
           PORTB |= (1 << PB4);  
      }  
      else  
      {  
           PORTB &= ~(1 << PB4);  
      }  
 }  
 int main(void)  
 {  
      DDRB = 0x00;  
      // LED output  
      DDRB |= (1 << PB4);  
      // AIN1をバンドギャップ・リファレンス、割込み有効化  
      ACSR = (1 << ACBG) | (1 << ACIE);  
      sei();  
   while(1)  
   {       
   }  
 }  

Atmel Studioのプロジェクト
https://github.com/ryood/AVR_Analog_Comparator_Test

トリマーPOTで電圧を調整したのでかなりアバウトだが、LEDの点灯/消灯時の電圧をテスターで計ってみた。
LED点灯時: 1.171V
LED消灯時: 0.951V
まあまあ1Vあたりで切り替わるようだ。

ノイズ

VCCの波形をオシロで見てみた。

AVRをブレッドボードに乗せている時

AVRをブレッドボードから外した時

拡大

18.4MHzぐらいのノイズが乗っている。

ATtiny13の内蔵RCで9.6MHz駆動しているので、このクロック由来のノイズのようだ。
(なんで2倍になるのかよくわからないですが)

これだけ盛大にノイズが乗るとアナログ回路には使いづらいが、電圧の閾値をRで分圧して入力してやるとかいっそのことADCをつかうとかすればマイコンを使った回路には使えそうだ。

PINが空いていればわざわざATtiny13を用意する必要もないかな。

メモ:

ATtiny13の逆刺し(上下左右間違え)は危険。かなり発熱した(^q^;