设计与开发

avr单片机驱动 小5带你飞(8)—AVR(ATmega 328P)单片机片内ADC的原理和使用(1)

小编 2025-08-02 设计与开发 23 0

小5带你飞(8)—AVR(ATmega 328P)单片机片内ADC的原理和使用(1)

ATmega328p内部集成了一个10位的逐次逼近的A/D转换器。该转换器与一个8通道的模拟多路复用器连接。它能够对来自端口A的8路单端输入电压进行采样。

ADC转换模块的原理图

看一下它的基本特性:

10位分辨率

0.5 LSB积分非线性

±2 LSB绝对精度

13 -~260µs转换时间

最高采样速率76.9 kSPS/s

6路可选的单端输入通道

2路额外多路复用单端输入通道(TQFP 、QFN/MLF)

温度传感器输入通道

ADC读取的结果可设置为左端对其

0~Vcc ADC输入电压范围

可选择1.1v ADC参考电压

自由连续转换模式和单次转换模式

在ADC转换完成时中断

睡眠模式噪音消除

ADC的供电和参考电压:

ADC由独立的专用的模拟电压引脚AVCC供电,AVCC和VCC的电压差别不能大于±0.3V。

ADC的参考电源可以是芯片内部的1.1v的参考电源,也可以是AVCC,也可以采用外部参考电源,使用外部参考电源的时候,外部参考电源可由引脚AREF接入,使用内部参考电压源的时候,可以通过在AREF引脚外部并接一个电容来提高ADC的抗噪性能。这个电容一般可为0.1uF

与ADC有关的寄存器:

ADMUX:多路复用选择寄存器

bit6、bit7 :ADC参考电压选择。如果在转换过程中改变了设置,则只有等待当前转换结束后才起作用。如果在 AREF引脚上施加了外部参考电压,则内部参考电压将不能被选择。这个参考电压的选择见下图:

还是解释一下:

00 :AREF,内部基准源关闭

01 :AVCC,AREF外接滤波电容

10 : 保留

11 :1.1v内部基准电压源,AREF外接滤波电容

bit5:转换结果对齐位。置位左对齐,清位右对齐

bit4:一个保留位

bit3~bit0:模拟通道选择位

就是选择连接到哪个通道上,这个没啥说的。看表就好了,如下:

2. ADCSRA:ADC控制和状态寄存器A

bit7:ADC使能位。置位则启动ADC功能,清位ADC功能关闭

bit6:ADC开始转换。

在单次转换模式下,该位置位将启动一次ADC转换,在连续转换模式下,该位置位,将启动首次转换

bit5:ADC自动触发使能位。

该位置位,则启动ADC自动触发功能。

bit4:ADC中断标志位

ADC转换结束且数据寄存器被更新后该位置位,如果ADIE及SREG寄存器中的全局中断使能位I被置位,

则ADC转换结束中断服务程序被执行,同时该位被硬件清零,也可以通过软件写1清零。

bit3:ADC中断使能位。如果该位及SREG寄存器中的全局中断使能位I被置位,则ADC转换结束中断将被使能。

bit2~bit0:ADC预分频器的选择。这三位决定ADC输入时钟与CPU时钟之间的分频系数,如下表:

3. ADCL 、 ADCH :ADC数据寄存器

分别是左对齐的和右对齐的数据

ADC转换结束后,转换结果将存在这两个寄存器当中。首先ADMUX寄存器当中的ADLAR和MUXn影响转换结果在寄存器中的存放形式。当ADCL被读取时,ADC数据寄存器在读取ADCH之前不会更新,如果转换结果为左对齐且只需要8位的精度,那么仅需要读取ADCH就可以了,否则需先读取ADCL然后读取ADCH。

4.ADCSRB :ADC控制和状态寄存器B

bit2~bit0:ADC自动触发源的选择

说明一下吧:

000:连续转换模式

001:模拟比较器

010:外部中断请求0

011:定时器/计数器0比较匹配A

100:定时器/计数器0溢出

101: 定时器/计数器0比较匹配B

110:定时器DIDR0数器1溢出

111:定时器/计数器1捕捉事件

5. DIDR0:数字输入禁用寄存器0

说明一下:

bit5~bit0 :当这些位置位,相应的ADC引脚的数字输入缓存区被禁止,相应的PIN寄存器读取的时候都为0,

模拟信号运用于ADC5~ADC0,是不需要这么做的,ADC6和ADC7是没有缓存区的。

下面来看看ADC的基本使用步骤:

ADC输入端口初始化

基准电压的设置,数据对齐方式的设置,通道的选择。(ADMUX寄存器的配置)

AD使能,启动装换,中断的设置(ADCSRA寄存器的设置)

触发源的选择(ADCSRB寄存器的设置)

选择中断号,编写中断服务程序,读取ADC的数据(ADCL 、 ADCH )

好的,关于ADC的寄存器就写这么多了,下一篇我们来写ADC的驱动程序。

更多内容请关注头条号:小5嵌入式

avr单片机编程入门精品,新手学习必看(有典型实例哦)

单片机分为很多种,有什么avr单片机,stm32单片机等,随着单片机被广泛的使用,这些都是在单片机学习中需要接触的,有很多人问我:对于avr单片机编程来说,学习这个的时候很是迷茫,死活入不了门,到底avr单片机编程如何入门,这里就让我这个老鸟教会你。

首先要知道,avr单片机是什么?不然不了解这个,那接下来的学习也是白瞎,AVR单片机是1997年由ATMEL公司研发出的增强型内置Flash的RISC(Reduced Instruction Set CPU) 精简指令集高速8位单片机。可以广泛应用于计算机外部设备、工业实时控制、仪器仪表、通讯设备、家用电器等各个领域。

AVR单片机特点(ATmega16):

1、131条机器指令,且大多数指令的执行时间为单个系统时钟周期;

2、32个8位通用工作寄存器;

3、工作在16MHz时具有16MIPS的性能;

4、配备只需要2个时钟周期的硬件乘法器。

AVR单片机优势:

AVR单片机是Atmel公司推出的较为新颖的单片机,其显著的特点为高性能、高速度、低功耗。它取消机器周期,以时钟周期为指令周期,实行流水作 业。AVR单片机指令以字为单位,且大部分指令都为单周期指令。而单周期既可执行本指令功能,同时完成下一条指令的读取。通常时钟频率用4~8MHz,故 最短指令执行时间为250~125ns。

了解了这些,那接下来就通过一系列的实例,让你对avr单片机了解透彻

系统时钟:

ATmega16的片内含有4种频率(1/2/4/8M)的RC振荡源,可直接作为系统的工作时钟使用。同时片内还设有一个由反向放大器所构成的OSC(Oscillator)振荡电路,外围引脚XTAL1和XTAL2分别为OSC振荡电路的输入端和输出端,用于外接石英晶体等,构成高精度的或其它标称频率的系统时钟系统。

为ATmega16提供系统时钟源时,有三种主要的选择:(1)直接使用片内的1/2/4/8M的RC振荡源;(2)在引脚XTAL1和XTAL2上外接由石英晶体和电容组成的谐振回路,配合片内的OSC(Oscillator)振荡电路构成的振荡源;(3)直接使用外部的时钟源输出的脉冲信号。方式2和方式3的电路连接见图2-6(a)和2-6(b)。

内部看门狗:

在AVR片内还集成了一个1MHz独立的时钟电路,它仅供片内的看门狗定时器(WDT)使用。因此,AVR片内的WDT是独立硬件形式的看门狗,使用AVR可以省掉外部的WDT芯片。使用WDT可以有效的提高系统的可靠行。

avr单片机的工作流程:

AVR CPU的工作是由系统时钟直接驱动的,在片内不再进行分频。图2-7所示为Harvard结构和快速访问寄存器组的并行指令存取和指令执行时序。CPU在启动后第一个时钟周期T1取出第一条指令,在T2周期便执行取出的指令,并同时又取出第二条指令,依次进行。这种基于流水线形式的取指方式,使AVR可以以非常高的速度执行指令,获得高达1MIPS/MHz的效率。

存储器:

所有的I/O寄存器可以通过IN(I/O口输入)和OUT(输出到I/O口)指令访问,这些指令是在32个通用寄存器与I/O寄存器空间之间传输交换数据,指令周期为1个时钟周期。此外,I/O寄存器地址范围在$00-$1F之间的寄存器(前32个)还可通过指令实现bit位操作和bit位判断跳转。SBI(I/O寄存器中指定位置1)和CBI(I/O寄存器中指定位清零)指令可直接对I/O寄存器中的每一位进行位操作。使用SBIS(I/O寄存器中指定位为1跳行)和SBIC(I/O寄存器中指定位为0跳行)指令能够对这些I/O寄存器中的每一位的值进行检验判断,实现跳过一条指令执行下一条指令的跳转。

在I/O寄存器专用指令IN、OUT、SBI、CBI、SBIS和SBIC中使用I/O寄存器地址$OO~$3F。

当以SRAM方式寻址I/0寄存器时,必须将该其地址加上$0020,映射成在数据存储器空间的地址。

两个重要的寄存器:状态寄存器SREG和堆栈指针寄存器SP

堆栈是数据结构中所使用的专用名词,它是由一块连续的SRAM空间和一个堆栈指针寄存器组成,主要应用于快速便捷的保存临时数据、局部变量和中断调用或子程序调用的返回地址。堆栈在系统程序的设计和运行中起者非常重要的作用,只要程序中使用了中断和子程序调用,就必须正确的设置堆栈指针寄存器SP,在SRAM空间建立堆栈区。

处在I/O地址空间的$3E($005E)和$3D($005D)的两个8位寄存器构成了AVR单片机的16位堆栈指针寄存器SP。AVR单片机复位后堆栈寄存器的初始值为SPH=$00、SPL=$00,因此建议用户程序必须首先对堆栈指针寄存器SP进行初始化设置。

AVR的堆栈区是建立在SRAM空间的,16位的SP寄存器可以寻址的空间为64K。

由于AVR的堆栈是向下增长的,即新数据进入堆栈时栈顶指针的数据将减小(注意:这里与51不同,51的堆栈是向上增长的,即进栈操作时栈顶指针的数据将增加),所以尽管原则上堆栈可以在SRAM的任何区域中,但通常初始化时将SP的指针设在SRAM最高处。

对于具体的ATmega16芯片,堆栈指针必须指向高于$0060的SRAM 地址空间,因为低于$0060的区域为寄存器空间。ATmega16片内集成有1K的SRAM,不支持外部扩展SRAM,所以堆栈指针寄存器SP的初始值应设在SRAM的最高端:$045F处。

根据上面所讲述,AVR的SP堆栈指针寄存器指示了在数据SRAM中堆栈区域的栈顶地址,一些临时数据、局部变量,以及子程序返回地址和中断返回地址将被放置在堆栈区域中。在数据SRAM中,该堆栈空间的顶部地址必须在系统程序初始化时由初始化程序定义和设置。

当执行PUSH指令,一个字节的数据被压入堆栈,堆栈指针(SP中的数据)将自动减1;当执行子程序调用指令CALL或CPU响应中断时,硬件会自动把返回地址(16位数据)压入堆栈中,同时将堆栈指针自动减2。反之,当执行POP指令,从堆栈顶部弹出一个字节的数据,堆栈指针将自动加1;当执行从子程序RET返回或从中断RETI返回指令时,返回地址将从堆栈顶部弹出,堆栈指针自动加2。

通过这些原理及实例,你是否对avr单片机编程有了更深入的了解呢,其实avr单片机学习并不难,只要你认真去学,把每一步每一个流程都掌握透彻,那你就在avr单片机编程方面就已经入门了,这些你是否get到了呢?

相关问答

为什么很少有 AVR单片机 的教程?

AVR单片机是1997年由ATMEL公司研发出的增强型内置Flash的RISC(ReducedInstructionSetCPU)精简指令集高速8位单片机。可以广泛应用于计算机外部设备、工业....

求高手讲解一下:要使 单片机 正常工作,需要具备哪几个条件?

现在单片机这个大家庭中成员实在太多,每个成员的秉性都不太一样,就拿必须要有的工作电源来说,各个类别的单片机都不一样,比如C51系列的单片机其标准工作电压...

如何用51 单片机驱动 2相4线步进电机?

转速。在...用两个全局变量控制正反转,两个定时器中断分别控制两个电机,或用一个定时器产生一个时间单位,用两个变量计数分别控制两个电机转速。在proteu...

关于max485与 单片机 连接的问题?

[回答]传统的单片机实验系统因其购买成本高、系统使用烦琐,已经越来越不适合当前以培养学生实际能力为主要方向的高等教育,本系统可以帮助学校轻松组建单...

单片机 下载线问题使用吗?

stc单片机下载用的是普通串口,需一根USB转TTL下载线,或者用RS232转TTL线(和开发板上加MAX232芯片效果一样),前者需安装驱动程序,后者不需要,但成本高,且...s...

目前常用的 单片机 型号有哪些?都有什么优缺点?

现在市场上的单片机型号可以说是非常多的,其中有通用型的单片机,还有专用型的单片机。专用型单片机一般我们不常见到。今天我们结合这个问题来介绍一下目前常...

初学者如何快速上手 单片机 ?

如果需要快速学习好单片机,要从几方面做好准备:第一,硬件上的准备。器件资料首先得熟悉;芯片架构及指令集得清楚;芯片的外围电路设计从原理到器件选型要掌...单...

单片机 直接点亮数码管需要译码器吗?

就看你用的单片机提供的驱动电流是不是足够驱动数码管,好像51的不行,所以要加三极管放大,avr的话是可以直接驱动的用于驱动数码管的话,就用七段显示译码器,...

对Arduino设为输出(OUTPUT)的引脚进行写操作(digitalWrite)的作用是什么?

首先要明确IO口的几种常见模式。对于数字IO而言,常见的模式有:推挽输出、开漏输出、浮空输入(高阻输入)、上拉输入、下拉输入。STM32支持上述的所有模式,但...

2018流行什么 单片机 ?推荐全球热销 单片机 品牌排行榜?-牌子网

51单片机。特点,够老够经典,很多人估计都是从它入门的吧!简单易用,资料齐全,发展这么多年也有它自己的领域。主要应用在一些简单的控制场所,比如玩...

猜你喜欢