📄 main.c
字号:
/*
AD转换:
1、做AD转换时外部的抗干扰电路非常重要。
2、如果要做比较精确的AD,不要使用内部参考电压,因为内部2.56的参考电压的漂移比较明显。
3、AD转换第一次的结果应舍弃
*/
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <util/delay.h>
#define uint unsigned int
#define uchar unsigned char
uint RESULT_BUFF[8];
void delayMS(uint t)
{
uint m=0;
for(;m<t;t++)
_delay_loop_2(250*4);
}
unsigned int AdcConvert(void)
{
unsigned int i;
unsigned int ret;
/// ADMUX=0xc0; ///内部2.56v参考电压,通道0
ADCSRA|=_BV(ADEN); //使能ADC,单次转换模式
///连续转换8次
for(i=0;i<8;i++)
{
ADCSRA|=_BV(ADSC);
_delay_loop_1(60);
ret=(uint)ADCL;
ret|=(uint)(ADCH<<8);
RESULT_BUFF[i]=ret;
}
ret=0;
for(i=1;i<8;i++)
{
ret+=RESULT_BUFF[i];
}
ret=ret/8;
return(ret);
}
int main(void)
{
DDRB=0xff;
ADMUX=(1<<REFS1)|(1<<REFS0)|(0<<MUX3)|(0<<MUX2)|(0<<MUX1)|(1<<MUX0)/*|(1<<ADLAR)*/;
///基准电压为内部基准电压 选通ADC0
///置位ADLAR, 转换结果为左对齐
ADCSRA=(1<<ADEN)|(1<<ADSC)|(0<<ADFR)|(0<<ADIF)|(0<<ADIE)|(0<<ADPS2)|(0<<ADPS1)|(0<<ADPS0);
ADCSRA|=_BV(ADEN);
_delay_loop_2(20);
_delay_loop_2(10);
while(1)
{
uint temp;
temp=AdcConvert();
PORTB=(temp*2.56)/1024;
}
}
/*10 位 精度
0.5 LSB 的非线性度
± 2 LSB 的绝对精度
13 - 260 μs 的转换时间
最高分辨率时采样率高达15 kSPS
6 路复用的单端输入通道
2 路附加复用的单端输入通道 (TQFP 与MLF 封装)
可选的左对齐ADC 读数
0 - VCC 的 ADC 输入电压范围
可选的2.56V ADC 参考电压
连续转换或单次转换模式
ADC 转换结束中断
基于睡眠模式的噪声抑制器
*/
/*
向 ADC 启动转换位ADSC 位写"1” 可以启动单次转换。在转换过程中此位保持为高,直
到转换结束,然后被硬件清零。如果在转换过程中选择了另一个通道,那么ADC 会在改
变通道前完成这一次转换。
Table 73. ADC 转换时间
条件
采样& 保持( 启动转换后的时钟周期数) 转换时间( 周期)
第一次转换 13.5 25
正常转换,单端 1.5 13
ADC 转换结果转换结束后(ADIF 为高),转换结果被存入ADC 结果寄存器(ADCL, ADCH)。
单次转换的结果如下:
ADC=V(in)*1024/V(REF)
*/
/*
ADC 多工选择寄存器- ADMUX
Bit 7 6 5 4 3 2 1 0
REFS1 REFS0 ADLAR – MUX3 MUX2 MUX1 MUX0
读/ 写 R/W R/W R/W R R/W R/W R/W R/W
初始值 0 0 0 0 0 0 0 0
Bit 7:6 – REFS1:0: 参考电压选择
Table 74. ADC 参考电压选择
REFS1 REFS0 参考电压选择
0 0 AREF, 内部Vref 关闭
0 1 AVCC, AREF 引脚外加滤波电容
1 0 保留
1 1 2.56V 的片内基准电压源, AREF 引脚外加滤波电容
Bit 5 – ADLAR: ADC 转换结果左对齐
Bits 3:0 – MUX3:0: 模拟通道选择位
ADC 控制和状态寄存器A -ADCSRA
Bit 7 6 5 4 3 2 1 0
ADEN ADSC ADFR ADIF ADIE ADPS2 ADPS1 ADPS0
读/ 写 R/W R/W R/W R/W R/W R/W R/W R/W
初始值 0 0 0 0 0 0 0 0
Bit 7 – ADEN: ADC 使能
ADEN置位即启动ADC,否则ADC功能关闭。在转换过程中关闭ADC将立即终止正在进行的转换。
Bit 6 – ADSC: ADC 开始转换
在单次转换模式下,ADSC 置位将启动一次ADC 转换。在连续转换模式下,ADSC 置位将启动首次
转换。第一次转换( 在ADC 启动之后置位ADSC,或者在使能ADC 的同时置位ADSC) 需要25 个ADC
时钟周期,而不是正常情况下的13 个。第一次转换执行ADC初始化的工作。
在转换进行过程中读取ADSC 的返回值为"1”,直到转换结束。ADSC 清零不产生任何动作。
Bit 5 – ADFR: ADC 连续转换选择
该位置位时,运行在连续转换模式。该模式下,ADC 不断对数据寄存器进行采样与更新。该位清零,
终止连续转换模式。
Bit 4 – ADIF: ADC 中断标志
在ADC 转换结束,且数据寄存器被更新后, ADIF 置位。如果ADIE 及SREG 中的全局中断使能位I
也置位,ADC 转换结束中断服务程序即得以执行,同时ADIF 硬件清零。此外,还可以通过向此标
志写1 来清ADIF。要注意的是,如果对ADCSRA 进行读-修改-写操作,那么待处理的中断会被禁
止。这也适用于SBI 及CBI 指令。
Bit 3 – ADIE: ADC 中断使能
若ADIE 及SREG 的位I 置位, ADC 转换结束中断即被使能。
Bits 2:0 – ADPS2:0: ADC 预分频器选择位
Table 76. ADC 预分频选择
ADPS2 ADPS1 ADPS0 分频因子
0 0 0 2
0 0 1 2
0 1 0 4
0 1 1 8
1 0 0 16
1 0 1 32
1 1 0 64
1 1 1 128
ADC 数据寄存器- ADCL 及ADCH
读取ADCL 之后,ADC 数据寄存器一直要等到ADCH 也被读出才可以进行数据更新。因此,如果转换
结果为左对齐,且要求的精度不高于8 比特,那么仅需读取ADCH 就足够了。否则必须先读出ADCL
再读ADCH。
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -