事无巨细,AVR学习系列 BBS.CEAPRK.COM 发布
作者:LOSINGAMONG ADC上阵 E-mail:Losingamong@qq.com
事无巨细,ADC上阵
元器件明天就应该补齐了,到时候板上剩下的大部分资源就可以启用了,活活。今天还
是要挖掘挖掘可用的资源吧。
今天来讲讲 AVR单片机的片内 ADC的使用方法。比较简单,希望很快完成。
先看看什么是 ADC:
ADC,英文全称为 Analog Digital Converter,即模拟数字转换器,可以将连续的模
拟量通过取样转换成离散的数字量。
那什么是模拟量呢:在时间上或数值上都是连续的物理量称为模拟量,比如温度,
电压,电流,气压,它们都是连续变化的,在波形上都是一条平滑的曲线。
所以对 ADC 通俗的理解则是:用数字来表达模拟量的大小。
ADC 现在已经被大量应用于日常生活中了,常见的数字式电子产品诸如 MP3,数
码相机,高清电视,还有你看这篇文章时正在使用的个人电脑,都不可能摆脱的了 ADC
的身影。各位对 ADC 的理解,ADC 之于行业的意义,相信会在生产生活中逐渐得到全
面的体会的。
AVR 单片机,相比于 8 位单片机市场的老大——51 单片机来说,内部集成了 10
位精度的 ADC,不得不说这是一个巨大的优势。首先 ADC 是模拟器件,容易受到干扰,
集成在片内,干扰问题得到了很好的解决。其次,节省了外围电路,也大大降低了成
本,电路
也因此变得简易,要知道一片低级的 ADC 就差不多顶一片 51 或者 AT
MEGA16 了。况且 10 位的精度,足够应付大部分
不高的工作场合了。
现在我说说 ADC 转换器的一些关键参数:
参考电压,关于参考电压,要记住以下几点点:
1、提供 ADC 转换的分辨率,具体见转换精度的说明。
2、参考电压直接影响 ADC 的转换精度,所以要十分准确。
3、输入电压大于参考电压的规定值,转换量程仍为参考电压最大值,但是应该
尽量避免这种情况,否则会产生未知的危险,甚至烧毁单片机。
4、参考电压(有的 ADC 芯片是参考电压的数倍)代表 ADC 输入电压的最大值。
转换精度:也称最小分辨率,精度是指 ADC 将模拟量转换之后的最小变化量。比
如 10 位精度 ADC,参考电压为 5V,转换结果位 10 位二进制数。它的转换精度则为 5/(2
Bb
s
.
Ce
p
a
r
k.
co
m
事无巨细,AVR学习系列 BBS.CEAPRK.COM 发布
作者:LOSINGAMONG ADC上阵 E-mail:Losingamong@qq.com
的 10 次方)=4.88mv。表示转换后数字量每±1,则表示模拟量有±4.88mv 的变化。
转换时间:衡量 ADC 性能的一个重要指标,即 ADC 完成一次转换所需要的时间,
ADC 的工作时钟频率越高,转换越快。(当然高速的 AD 价格可以是很贵的)
AVR 片内的 AD,可通过设置分别使用不同的参考电压,转换方式,时钟频率以及
单路或差分输入通道,可以将差分信号放大。应该说功能还是比较全面的。
注:差分信号,即两个有一定差值的信号,将差分信号放大即是将此差值进行放
大。
现在可以看看 AVR 单片机的各个寄存器的关键位,我们就是通过操作这些寄存器
来设置 AVR 片内 AD 的工作方式的:
ADMUX 寄存器:
REFS1、REFS0:ADC 参考电压选择位;
ADLAR:ADC 转换结果对齐选择位;
MUX4~MUX0:输入通道选择位,包括差分信号的输入。
ADCSRA 寄存器:
ADEN:ADC 转换使能位,该位置“1”时,ADC 可以启用。
ADSC:ADC 转换开始位,该位置“1”时,转换启动。
ADATE:ADC 自带转换触发允许,即该位置“1”时,ADC 在设定工作方式下连续
转换,而不是单次转换。
ADIE:ADC 中断允许为,ADC 一次转换完成后,将该位置“1”,在全局中断允许
的前提下,可触发 ADC 中断。
ADCL 和 ADCH 寄存器:存放 ADC 转换结果。
SFIOR 寄存器:
ADTS2、ADTS1、ADTS0:设置 ADC 连续转换的方式。
以上各寄存器详细功能请查看 AVR 官方数据手册,有详细说明。
我的设置
为:使用内部 2.56V 参考电压,转换结果左对齐,输入通道 PA0,
连续自由转换(即转换完一次接着马上进行下一次转换),使能 ADC 中断。(其实很简
单,就 5 个要设置的地方)设置完以后启动 ADC(写 ADSC 位为“1”),ADC 就开始工
作了。
来看论坛的片内 ADC 的外围电路设计:
Bb
s
.
Ce
p
a
r
k.
co
m
事无巨细,AVR学习系列 BBS.CEAPRK.COM 发布
作者:LOSINGAMONG ADC上阵 E-mail:Losingamong@qq.com
异常简单的一个电路,只有一个 10K电位器提供输入电压,接在输入通道 PA0上,
滑动 PA0可得到不同的输入电压从而得到不同的显示效果,验证我们的程序正确与否。
下面是源程序,功能为将采样到的模拟电压转换为数字量并在数码管显示,其中
数码管显示的各个函数功能在《事无巨细,数码管闪亮》一文有详解,在此节省篇幅,
不做重复说明:
#include
#include
#include
#define uchar unsigned char
#define uint unsigned int
/*数码管显示数据与位置数组*/
unsigned char const LedData[]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xF8,
0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x7f};
unsigned char const LedPos[]=
{0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
/*全局变量定义*/
Bb
s
.
Ce
p
a
r
k.
co
m
事无巨细,AVR学习系列 BBS.CEAPRK.COM 发布
作者:LOSINGAMONG ADC上阵 E-mail:Losingamong@qq.com
uchar bai,shi,ge;
/*函数声明*/
void HC595shift(void);
void HC595store(void);
void display(uchar pos,uchar dat);
void HC595send(uchar x);
void init(void);
void readbyte(void);
int main(void)
{
init();
while(1); //等待中断产生,即转换结束
}
void init(void)
{
DDRA=0x00;
PORTA=0x00; //PA0 设置为输入口,内部上拉失效,高阻态
DDRB=0xff;
PORTB=0x00; //PB 口设置输出方向,输出低电平
ADMUX=0xe0; //内部参考电源 2.56V,输出数据左对齐,PA0 输入通
道
SFIOR=0; //自由连续转换
/*使能 ADC,开始转换,允许自动转换,允许 ADC 中断,128 分频*/
ADCSRA=0xef;
sei(); //允许全局中断
}
Bb
s
.
Ce
p
a
r
k.
co
m
事无巨细,AVR学习系列 BBS.CEAPRK.COM 发布
作者:LOSINGAMONG ADC上阵 E-mail:Losingamong@qq.com
ISR(ADC_vect ) //ADC 转换函数
{
readbyte(); //读取转换结果
display(0,16); /*显示转换结果,小数点*/
display(0,bai); /*显示转换结果,最高位*/
display(1,shi); /*显示转换结果,次高位*/
display(2,ge); /*显示转换结果,最低位*/
}
void readbyte(void) //读取转换字节函数
{
uchar byte;
byte=ADCH;
bai=byte/100;
shi=byte%100/10;
ge=byte%10;
}
/*以下为一系列数码管显示函数*/
void HC595send(uchar x)
{
uchar n,temp;
for(n=0;n<8;n++)
{
temp=x&0x80;
if(temp!=0)
{
PORTB|=(1<流程十分简单,初始化 init()完毕之后,ADC 开始转换,while(1)
死循环无限等待 ADC转换结束触发中断,中断触发后进入中断服务函数 ISR(ADC_vect )
后将转换结果读出并分离显示。
小贴士:平日总说 AVR,AVR 你知道 AVR 这个称呼怎么来的吗?
我来告诉你:1997 年,由 ATMEL 公司挪威设计中心的 A 先生与 V 先生利用 ATMEL
公司的 Flash 新技术, 共同研发出 RISC 精简指令集的高速 8 位单片机,简称 AVR。
希望能给有需要的人一点帮助。
Bb
s
.
Ce
p
a
r
k.
co
m