日々の記録

ほどよく書いてきます。

ATTiny13AのADC機能を使う

2013年07月29日 15時31分15秒 | その他雑記
ATTiny13Aという8ピンマイコンを使ってみる。

ADコンバータがちゃんと使えるかの確認。
最終的には8bit程度の分解能で十分なので、左詰で上位8ビットの読み出ししかしませんが、
10bit ADCに変更するのも十分可能でしょう。

ArduinoっぽくAnalogReadという関数にしてみた。


/*
* _20130729_ATTiny13A_ADC.c
*
* Created: 2013/07/29 13:48:05
* Author: makoto
 
ATTiny13A Pin割り振り
1:PB5 RESET ADC0 →出力端子に設定しちゃうとリセット出来なくなるので使わない
2:PB3 CLKI ADC3
3:PB4 ADC2
4:GND
5:PB0 MOSI OC0A
6:PB1 MISO OC0B
7:PB2 SCK ADC1
8:VCC
 
*/

#include <avr/io.h>
unsigned char AnalogRead8bit(unsigned char Ch)
{
//8bit分解能で十分なのを前提に設定を行っている。
 
//デジタル入出力からの切り離し
DIDR0
= (0<<ADC0D) //ADC0ピンの切り離し。しかし、ADC0はリセット端子になってるから設定しちゃダメ
| (0<<ADC1D) //同ADC1
| (1<<ADC2D) //同・・
| (0<<ADC3D); //同・・
 
ADMUX
= (0<<REFS0) //Reference: 0でVCC参照, 1で1.1V内部電圧源
| (1<<ADLAR) //ADC Left Adjust Result: 1にセットすると左詰で結果を出してくる
| (Ch); //ADMUX1, ADMUX0で入力チャンネルを選べる 00から11までADC0からADC3まで対応
 
ADCSRA
= (1<<ADEN) //ADC enable
| (1<<ADSC) //ADC Start Conversion 1にすると変換開始
| (0<<ADATE) //ADC Auto Trigger Enable (for Continuous Conversion)
| (0<<ADIF) //ADC Interrupt Flag 変換完了すると1になるらしい
| (0<<ADIE) //ADC Interrupt Enable 変換完了したときに割り込み許可
| (0b100); //Clock Division: ADコンバータはクロック50-200kHzで性能がよい
//分周は0のとき2、それ以上の時2^n分周 1.2MHz(Default)のとき16分周(100)で75kHz。9.6MHzのとき128分周(111)で75kHz
 
loop_until_bit_is_set(ADCSRA,ADIF); //ADIFビットが1になるまでムダループ
return ADCH;
}
 
unsigned int AnalogRead(unsigned char Ch)
{
//10bit分解能用ルーチン
 
//デジタル入出力からの切り離し
DIDR0
= (0<<ADC0D) //ADC0ピンの切り離し。しかし、ADC0はリセット端子になってるから設定しちゃダメ
| (0<<ADC1D) //同ADC1
| (1<<ADC2D) //同・・
| (0<<ADC3D); //同・・
 
ADMUX
= (0<<REFS0) //Reference: 0でVCC参照, 1で1.1V内部電圧源
| (0<<ADLAR) //ADC Left Adjust Result: 1にセットすると左詰で結果を出してくる
| (Ch); //ADMUX1, ADMUX0で入力チャンネルを選べる 00から11までADC0からADC3まで対応
 
ADCSRA
= (1<<ADEN) //ADC enable
| (1<<ADSC) //ADC Start Conversion 1にすると変換開始
| (0<<ADATE) //ADC Auto Trigger Enable (for Continuous Conversion)
| (0<<ADIF) //ADC Interrupt Flag 変換完了すると1になるらしい
| (0<<ADIE) //ADC Interrupt Enable 変換完了したときに割り込み許可
| (0b100); //Clock Division: ADコンバータはクロック50-200kHzで性能がよい
//分周は0のとき2、それ以上の時2^n分周 1.2MHz(Default)のとき16分周(100)で75kHz。9.6MHzのとき128分周(111)で75kHz
 
loop_until_bit_is_set(ADCSRA,ADIF); //ADIFビットが1になるまでムダループ
return ADC;
}
int main(void)
{
//PB4(ADC2)からアナログ値を読み込み、PB0からPB3に4ビット表示。
DDRB = 0b1111; //出力端子設定
while(1)
{
PORTB = AnalogRead8bit(2) >> 4; //アナログ値読み込みとビットシフト
}
}
 




Atmel Studio 6.1を使っています。

以上のコードをコンパイルすると74バイト。コードの割にはでかくね?
コメント (4)
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする