📄 adc.c
字号:
#include"main.h"
//extern volatile ulong test_data;
extern volatile uint adc_sum;
void adc_init(uchar channel,uint volt_ref)
{
cbi(ddra,channel);
cbi(porta,channel);
ADMUX=(volt_ref<<REFS1)|(1<<REFS0)|(channel<<MUX0);
//channel PA0~3;ref volt 0:AVCC,1:internal 2.56
/*
REFS1,0:
00:AREF
01:AVCC
11:2.56
MUX4,3,2,1,0
00000:ADC0
01000:ADC0X10
01010:ADC0X200
*/
ADCSRA=(1<<ADEN)|(1<<ADATE)|(1<<ADPS2)|(1<<ADPS1)|(0<<ADPS0);
/*ADPS2,1,0:prescaler
000:2
001:2
...
X2
100:16
...
111:128
*/
sbi(ADCSRA,ADSC);
}
void start_an_adc(void)
{
//start an A/D conversion
sbi(ADCSRA,ADIE);
loop_until_bit_is_set(ADCSRA,ADIF);
cbi(ADCSRA,ADIE);
}
ISR(SIG_ADC)
{
adc_sum=ADC;
}
void write_adc(void)
{
uint j=0;
uchar adc[5];
switch(ADMUX&0xc0)
{
case 0x40:j=(ulong)adc_sum*50000/1024;break;//AVCC
case 0xc0:j=(ulong)adc_sum*25600/1024;break;//internal 2.56v
}
adc[0]=j/10000;
j=j%10000;
adc[1]=j/1000;
j=j%1000;
adc[2]=j/100;
j=j%100;
adc[3]=j/10;
adc[4]=j%10;
write_number(adc[0]);
write_data('.');
write_number(adc[1]);
write_number(adc[2]);
write_number(adc[3]);
write_number(adc[4]);
write_data('V');
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -