AVRで電圧計
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); } } }