使ったのは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まあまあ1Vあたりで切り替わるようだ。
LED消灯時: 0.951V
ノイズ
VCCの波形をオシロで見てみた。AVRをブレッドボードに乗せている時
AVRをブレッドボードから外した時
拡大
18.4MHzぐらいのノイズが乗っている。
ATtiny13の内蔵RCで9.6MHz駆動しているので、このクロック由来のノイズのようだ。
(なんで2倍になるのかよくわからないですが)
これだけ盛大にノイズが乗るとアナログ回路には使いづらいが、電圧の閾値をRで分圧して入力してやるとかいっそのことADCをつかうとかすればマイコンを使った回路には使えそうだ。
PINが空いていればわざわざATtiny13を用意する必要もないかな。
0 件のコメント:
コメントを投稿