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);
}
}
}



