void get_AD(void)//ADC初始化 { ADMUX = 0x40;//AVCC为参考电压源,AREF引脚接地且0000为ADC0输入 ADCSRA = 0x00;//关掉ADC ADCSRA = (1 << ADEN) | (1 << ADSC) | (1 << ADFR) | 0x07;//128分频,连续转换 }为什么要初始化
时间: 2024-01-20 11:02:06 浏览: 203
这是对ADC(模数转换器)进行初始化的函数。ADC是将模拟信号转换为数字信号的电路,它可以将模拟量信号(如温度、压力、光强等)转换为数字信号(二进制数),便于微处理器进行处理。初始化函数中的具体操作如下:
1. ADMUX = 0x40; 设置参考电压源为AVCC,ADC0为输入通道;
2. ADCSRA = 0x00; 先将ADC关闭,避免出现意外的转换;
3. ADCSRA = (1 << ADEN) | (1 << ADSC) | (1 << ADFR) | 0x07; 使能ADC,设置128分频,开启自动触发(ADFR)和连续转换(ADSC)模式,ADC开始工作。
通过ADC初始化,可以保证ADC工作正常,从而确保模拟信号正确地转换为数字信号,为微处理器后续的处理提供准确的数据。
相关问题
uchar Alcohol[] = {"Alcohol: mg/L"};//lcd第一行要显示的数组 uchar Set[] = {"Set : mg/L"};//lcd第二行要显示的数组 uchar ten_1, ten_2, ten_3,ten_4;//个十百千位要显示的数字 uint adc_data, adc_l, adc_h; void get_AD(void)//ADC初始化 { ADMUX = 0x40;//ADC0, ADCSRA = 0x00;//关掉ADC ADCSRA = (1 << ADEN) | (1 << ADSC) | (1 << ADFR) | 0x07;//128分频,连续转换 s_ms(500);//延时 adc_l = ADCL; adc_h = ADCH; adc_data = adc_h << 8 | adc_l; adc_data = adc_data >> 1; adc_data -= 35; } unsigned int ad_cat(void)//电压采集函数 { unsigned int t1,t2; ADCSRA = 0X00;//disable ADC ADMUX=0x00;//ref 左对齐 ADC0 ACSR = 0x80;//使能ADC可用,不用修改 ADCSRA|=BIT(ADEN); //ADC使能 ADCSRA|=BIT(ADSC); //开始转换 while(!(ADCSRA&(BIT(ADIF))));//ADIF置一,adc转换结束时,跳出循环 ADCSRA&=~BIT(ADIF);//清零 t1 = (unsigned int)ADCL; t2 = (unsigned int)ADCH; t2 = (t2<<8)+t1;//高位左移8位加上低位 return t2; }解释代码并给出注释
```
uchar Alcohol[] = {"Alcohol: mg/L"}; //LCD第一行要显示的数组
uchar Set[] = {"Set : mg/L"}; //LCD第二行要显示的数组
uchar ten_1, ten_2, ten_3, ten_4; //个十百千位要显示的数字
uint adc_data, adc_l, adc_h; //ADC采集的数据
void get_AD(void) //ADC初始化函数
{
ADMUX = 0x40; //设置ADC通道为ADC0
ADCSRA = 0x00; //关闭ADC
ADCSRA = (1 << ADEN) | (1 << ADSC) | (1 << ADFR) | 0x07; //打开ADC,设置128分频,连续转换
s_ms(500); //延时,等待ADC稳定
adc_l = ADCL; //读取ADC低8位
adc_h = ADCH; //读取ADC高8位
adc_data = adc_h << 8 | adc_l; //将ADC高8位和低8位组合成16位数据
adc_data = adc_data >> 1; //右移1位,相当于除以2,得到真正的ADC采集值
adc_data -= 35; //将ADC采集值减去35,得到真实电压值
}
unsigned int ad_cat(void) //电压采集函数
{
unsigned int t1, t2;
ADCSRA = 0X00; //关闭ADC
ADMUX = 0x00; //设置ADC通道为ADC0,左对齐
ACSR = 0x80; //使能ADC可用,不用修改
ADCSRA |= BIT(ADEN); //使能ADC
ADCSRA |= BIT(ADSC); //开始转换
while(!(ADCSRA&(BIT(ADIF)))); //等待ADC转换完成,ADIF置1
ADCSRA &= ~BIT(ADIF); //清除ADIF标志位
t1 = (unsigned int)ADCL; //读取ADC低8位
t2 = (unsigned int)ADCH; //读取ADC高8位
t2 = (t2 << 8) + t1; //将ADC高8位和低8位组合成16位数据
return t2; //返回电压值
}
```
以上是代码的注释,主要是对变量和函数的作用进行了说明。这段代码主要是关于ADC的初始化和电压采集函数的实现。在初始化函数中,将ADC的通道、分频器、连续转换等参数进行设置,然后延时等待ADC稳定,读取ADC采集数据,计算得到真实的电压值。在电压采集函数中,通过设置ADC的通道和使能ADC,开始转换并等待转换结束,最终读取ADC数据并计算得到电压值。这段代码可能是用于检测酒精含量的电路中的一部分。
ADMUX = 0x40;//ADC0, ADCSRA = 0x00;//关掉ADC ADCSRA = (1 << ADEN) | (1 << ADSC) | (1 << ADFR) | 0x07;//128分频,连续转换 s_ms(500);//延时 adc_l = ADCL; adc_h = ADCH; adc_data = adc_h << 8 | adc_l; adc_data = adc_data >> 1; adc_data -= 35;解释其中代码
这段代码实现了使用AVR单片机的ADC模块进行模拟信号采集的功能。下面是每行代码的解释:
1. ADMUX = 0x40;//ADC0,设置ADC模块采集通道为ADC0,即单片机上的模拟输入引脚PA0。
2. ADCSRA = 0x00;//关掉ADC,关闭ADC模块,确保ADC模块处于未启用状态。
3. ADCSRA = (1 << ADEN) | (1 << ADSC) | (1 << ADFR) | 0x07;//128分频,连续转换,打开ADC模块并设置ADC工作模式。其中:
- (1 << ADEN) | (1 << ADSC) | (1 << ADFR):使能ADC、启动转换、设置为自由运行模式(即连续转换);
- 0x07:设置ADC时钟分频系数为128,即ADC时钟频率为CPU时钟频率的1/128。
4. s_ms(500);//延时,等待ADC模块稳定。s_ms函数可能是一个自定义的延时函数,用于在程序中实现延时。
5. adc_l = ADCL; adc_h = ADCH; adc_data = adc_h << 8 | adc_l;,读取ADC转换结果。其中:
- ADCL和ADCH分别是ADC转换结果的低8位和高8位寄存器;
- 先读取ADCL再读取ADCH的原因是,数据在读取ADCL之后会被锁定,这样就可以保证读取到转换结果的同时也保证数据的准确性;
- adc_h << 8 | adc_l是将ADCH和ADCL合并为一个16位的adc_data值。
6. adc_data = adc_data >> 1; adc_data -= 35; 由于ADC转换结果的范围是0~1023,需要进行一些处理才能得到实际的信号值:
- adc_data >> 1将adc_data值右移1位,相当于将其除以2,这样可以将范围缩小到0~511;
- adc_data -= 35将adc_data值减去35,这是因为ADC模块的参考电压(Vref)设置为AVCC,即单片机供电电压,而AVCC可能存在波动,因此需要进行一些校准,此处假设校准值为35。这样就可以得到最终的模拟信号值。
阅读全文