HOME > natural science Laboratory > ものづくり講座 > AVRマイコン TIPS集

AVRで電圧計

文責:佐瀬 一弥 (2010年6月 5日) カテゴリ:AVRマイコン TIPS集(38)

ATmega168で電圧を測定し、値を7セグLEDに表示し、シリアル通信で送信する。写真は電池の電圧を測定しているところ。7セグLEDは桁ごとにダイナミック点灯しているので、写真には下位の桁がとらえられていないが、目で見るとすべて点灯して見える。


外観


つなぎ方

プログラム。

#include <avr/io.h>
#include <util/delay.h>

void wait( unsigned char time );
void USART_init(void);
void hello(void);

unsigned char segdat[10]={0b11100111, 0b00100001, 0b11001011, 0b01101011, 0b00101101,0b01101110, 0b11101110, 0b00100011, 0b11101111, 0b01101111 };

int main(void)
{
	int n0,n,v,i,j;
	unsigned char dt;
	
	DDRB = 0xff;
	DDRC = 0;
	DDRD = 0b1110000;
	
	USART_init();
	ADCSRA = 0b10000100; // ADイネーブル,1/16クロック,1/16=62.5kHz,ADイネーブル
	
	hello();
	
	ADMUX  = 0b00001110; //基準,入力選択,内部1.1V選択,右そろえ,基準電圧の内部接続切り,Arefピンの電圧を使う
	wait(2); //マルチプレクサが安定するまで待つ
	ADCSRA = 0b11000100; //変換開始
	while( ADCSRA & 0b01000000 )    // 変換終了待ち
		;
	n0 = ADC;
	
	while(1){
		ADMUX  = 0b00000101; //基準,入力選択,5ch選択,右そろえ,基準電圧の内部接続切り,Arefピンの電圧を使う
		
		ADCSRA = 0b11000100;//変換開始
		while( ADCSRA & 0b01000000 )    // 変換終了待ち
			;
		n = ADC;
		v = (float)n / (float)n0 * 1.1 *100;
		
		dt = v / 100 + '0';
		while( !(UCSR0A & 0b00100000 ) )//USART送信
			;
		UDR0 = dt;
		
		while( !(UCSR0A & 0b00100000 ) )//USART送信
			;
		UDR0 = 0x2E;//アスキーコード"."
		
		dt = v % 100 / 10 + '0';
		while( !(UCSR0A & 0b00100000 ) )//USART送信
			;
		UDR0 = dt;
		
		dt = v % 10 + '0';
		while( !(UCSR0A & 0b00100000 ) )//USART送信
			;
		UDR0 = dt;
		
		while( !(UCSR0A & 0b00100000 ) )//USART送信
			;
		UDR0 = 0x20;//アスキーコード" "
		
		for(i=0;i<20;i++){
			dt = v / 100;
			dt = v % 10 ;
			PORTD = 0b00100000;
			PORTB = segdat[dt];
			wait(2);
			
			dt = v % 100 / 10;
			PORTD = 0b01000000;
			PORTB = segdat[dt];
			wait(2);
			
			dt = v / 100;
			PORTD = 0b10000000;
			PORTB = segdat[dt] | 0b00010000;
			wait(2);
		}
	}
	return 0;
}

void wait( unsigned char time )     // 2500クロック単位のwaitルーチン
{
       unsigned char j,k;

       for( j= 0;j< time ; j++)
               for( k = 0; k < 250; k++)       // 10 * 250 = 2.5 msec
                       ;                                               // WinAVR 20070525の場合,
                                                                       // 最適化なしで,6命令10クロック
}

void USART_init(void){
	UBRR0 = 25;				// 2400ボー
	UCSR0B = 0b00011000;	//送受信イネーブル
	UCSR0C = 0b00000110;	//8bit、パリティなし、ストップビット1
}

void hello(void){
	int i,j;
	for(j=0;j<2;j++){
		for(i=0;i<50;i++){
			PORTD = 0b00100000;
			PORTB = 0b00001111;
			wait(2);
			PORTD = 0b01000000;
			PORTB = 0b11101000;
			wait(2);
			PORTD = 0b10000000;
			PORTB = 0b00001111;
			wait(2);
		}
		for(i=0;i<50;i++){
			PORTD = 0b00100000;
			PORTB = 0b11101000;
			wait(2);
			PORTD = 0b01000000;
			PORTB = 0b00001111;
			wait(2);
			PORTD = 0b10000000;
			PORTB = 0b11101000;
			wait(2);
		}
	}
}



タグ: ,

▲このページのトップNPO法人 natural science トップ

▲このページのトップNPO法人 natural science トップ




Warning: mysqli_connect(): (28000/1045): Access denied for user 'xsvx1015071_ri'@'sv102.xserver.jp' (using password: YES) in /home/xsvx1015071/include/natural-science/include_counter-d.php on line 8
MySQL DBとの接続に失敗しました