用atmega16编程十位数计算机,AVR单片机(学习ing)—(九)、ATMEGA16的模数转换器—01...

然后紧接着就是模数转换器了~~

然后就先不写了~~

a4c26d1e5885305701be709a3d33442f.png~~

九、ATMEGA16的模数转换器

九—(01)、ATMEGA16的模数转换器的介绍

1、介绍

1)特点:

• 10 位 精度

• 0.5 LSB 的非线性度

• ± 2 LSB 的绝对精度

• 65 - 260 μs 的转换时间

• 最高分辨率时采样率高达15 kSPS

• 8 路复用的单端输入通道

• 7 路差分输入通道

• 2 路可选增益为10x 与200x 的差分输入通道

• 可选的左对齐ADC 读数

• 0 - VCC 的 ADC 输入电压范围

• 可选的2.56V ADC 参考电压

• 连续转换或单次转换模式

• 通过自动触发中断源启动ADC 转换

• ADC 转换结束中断

• 基于睡眠模式的噪声抑制器

Note: 1. 在PDIP封装下的差分输入通道器件未经测试。只保证器件在TQFP 与MLF封装下正常

工作。

2)介绍和框图

ATmega16有一个10位的逐次逼近型ADC。ADC与一个8通道的模拟多路复用器连接,能

对来自端口A 的8 路单端输入电压进行采样。单端电压输入以0V (GND) 为基准。

器件还支持16 路差分电压输入组合。两路差分输入(ADC1、ADC0 与ADC3、ADC2)

有可编程增益级,在A/D 转换前给差分输入电压提供0dB(1x)、20dB(10x) 或46dB(200x)

的放大级。七路差分模拟输入通道共享一个通用负端(ADC1), 而其他任何ADC 输入可做

为正输入端。如果使用1x 或10x 增益,可得到8 位分辨率。如果使用200x 增益,可得

到7 位分辨率。

ADC 包括一个采样保持电路,以确保在转换过程中输入到ADC 的电压保持恒定。ADC 的

框图如 Figure 98 所示。

ADC 由AVCC 引脚单独提供电源。AVCC 与VCC 之间的偏差不能超过± 0.3V

标称值为2.56V 的基准电压,以及AVCC,都位于器件之内。基准电压可以通过在AREF

引脚上加一个电容进行解耦,以更好地抑制噪声。

a4c26d1e5885305701be709a3d33442f.png

2、ADC的工作过程

ADC 通过逐次逼近的方法将输入的模拟电压转换成一个10 位的数字量。最小值代表

GND,最大值代表AREF引脚上的电压再减去1 LSB。通过写ADMUX寄存器的REFSn位

可以把AVCC 或内部2.56V 的参考电压连接到AREF 引脚。在AREF 上外加电容可以对

片内参考电压进行解耦以提高噪声抑制性能。

模拟输入通道与差分增益可以通过写ADMUX 寄存器的MUX 位来选择。任何ADC 输入

引脚,像GND 及固定能隙参考电压,都可以作为ADC 的单端输入。ADC 输入引脚可选

做差分增益放大器的正或负输入。

如果选择差分通道,通过选择被选输入信号对的增益因子得到电压差分放大级。然后放大

值成为ADC 的模拟输入。如果使用单端通道,将绕过增益放大器。

通过设置ADCSRA 寄存器的ADEN 即可启动ADC。只有当ADEN 置位时参考电压及输

入通道选择才生效。ADEN 清零时ADC 并不耗电,因此建议在进入节能睡眠模式之前关

闭ADC。

ADC转换结果为10位,存放于ADC数据寄存器ADCH及ADCL中。默认情况下转换结果为

右对齐,但可通过设置ADMUX 寄存器的ADLAR 变为左对齐。

如果要求转换结果左对齐,且最高只需8 位的转换精度,那么只要读取ADCH 就足够了。

否则要先读ADCL,再读ADCH,以保证数据寄存器中的内容是同一次转换的结果。一旦

读出ADCL, ADC 对数据寄存器的寻址就被阻止了。也就是说,读取ADCL 之后,即使

在读ADCH 之前又有一次ADC 转换结束,数据寄存器的数据也不会更新,从而保证了转

换结果不丢失。ADCH 被读出后, ADC 即可再次访问ADCH 及ADCL 寄存器。

ADC转换结束可以触发中断。即使由于转换发生在读取ADCH与ADCL之间而造成ADC无

法访问数据寄存器,并因此丢失了转换数据,中断仍将触发。

3、启动一次转换

向 ADC 启动转换位ADSC 位写"1” 可以启动单次转换。在转换过程中此位保持为高,直

到转换结束,然后被硬件清零。如果在转换过程中选择了另一个通道,那么ADC 会在改

变通道前完成这一次转换。

ADC转换有不同的触发源。设置ADCSRA寄存器的ADC自动触发允许位ADATE可以使能

自动触发。设置ADCSRB 寄存器的ADC 触发选择位ADTS 可以选择触发源( 见触发源

列表中对ADTS 的描述)。当所选的触发信号产生上跳沿时, ADC 预分频器复位并开始

转换。这提供了一个在固定时间间隔下启动转换的方法。转换结束后即使触发信号仍然存

在,也不会启动一次新的转换。如果在转换过程中触发信号中又产生了一个上跳沿,这个

上跳沿将被忽略。即使特定的中断被禁止或全局中断使能位为0,中断标志仍将置位。这

样可以在不产生中断的情况下触发一次转换。但是为了在下次中断事件发生时触发新的

转换,必须将中断标志清零。

a4c26d1e5885305701be709a3d33442f.png

使用ADC 中断标志作为触发源,可以在正在进行的转换结束后即开始下一次ADC 转换。

之后ADC 便工作在连续转换模式,持续地进行采样并对ADC 数据寄存器进行更新。第

一次转换通过向ADCSRA 寄存器的ADSC 写1 来启动。在此模式下,后续的ADC 转换

不依赖于ADC 中断标志ADIF 是否置位。

如果使能了自动触发,置位ADCSRA 寄存器的ADSC 将启动单次转换。ADSC 标志还

可用来检测转换是否在进行之中。不论转换是如何启动的,在转换进行过程中ADSC 一

直为1。

4、预分频及ADC

转换时序

a4c26d1e5885305701be709a3d33442f.png

在默认条件下,逐次逼近电路需要一个从50 kHz到200 kHz的输入时钟以获得最大精度。

如果所需的转换精度低于10 比特,那么输入时钟频率可以高于200 kHz,以达到更高的

采样率。

ADC 模块包括一个预分频器,它可以由任何超过100 kHz 的CPU 时钟来产生可接受的

ADC 时钟。预分频器通过ADCSRA 寄存器的ADPS 进行设置。置位ADCSRA 寄存器的

ADEN 将使能ADC,预分频器开始计数。只要ADEN 为1,预分频器就持续计数,直到

ADEN 清零。

ADCSRA寄存器的ADSC置位后,单端转换在下一个ADC时钟周期的上升沿开始启动。差

分转换时序见P197“ 差分增益信道” 。

正常转换需要13 个ADC 时钟周期。为了初始化模拟电路,ADC 使能(ADCSRA 寄存器

的ADEN 置位) 后的第一次转换需要25 个ADC 时钟周期。

在普通的ADC 转换过程中,采样保持在转换启动之后的1.5 个ADC 时钟开始;而第一次

ADC转换的采样保持则发生在转换启动之后的13.5 个ADC时钟。转换结束后,ADC结果

被送入ADC 数据寄存器,且ADIF 标志置位。ADSC 同时清零( 单次转换模式)。之后软

件可以再次置位ADSC 标志,从而在ADC 的第一个上升沿启动一次新的转换。

使用自动触发时,触发事件发生将复位预分频器。这保证了触发事件和转换启动之间的延

时是固定的。在此模式下,采样保持在触发信号上升沿之后的2 个ADC 时钟发生。为了

实现同步逻辑需要额外的3 个CPU 时钟周期。如果使用差分模式,加上不是由ADC 转

换结束实现的自动触发,每次转换需要25 个ADC 时钟周期。因为每次转换结束后都要

关闭ADC 然后又启动它。

在连续转换模式下,当ADSC 为1 时,只要转换一结束,下一次转换马上开始。转换时

间请见 Table 81。

a4c26d1e5885305701be709a3d33442f.png

5、差分增益信道

当使用差分增益通道,需要考虑转换的确定特征。

差分转换与内部时钟CKADC2 同步等于ADC 时钟的一半。同步是当ADC 接口在CKADC2

边沿出现采样与保持时自动实现的。当CKADC2 为低时,通过用户启动转换( 即,所有的

单次转换与第一次连续转换) 将与单端转换使用的时间( 接着的预分频后的13 个 ADC 时

钟周期)。当 CKADC2 为高时,由于同步机制,将会使用14 个 ADC 时钟周期。在连续转

换模式时,一次转换结束后立即启动新的转换,而由于CKADC2 此时为高,所有的自动启

动( 即除第一次外) 将使用14 个 ADC 时钟周期。

在所有的增益设置中,当带宽为4 kHz 时增益级最优。更高的频率可能会造成非线性放

大。当输入信号包含高于增益级带宽的频率时,应在输入前加入低通滤波器。注意,ADC

时钟频率不受增益级带宽限制。比如,不管通道带宽是多少, ADC 时钟周期为6 μs,允

许通道采样率为12 kSPS。

如果使用差分增益通道且通过自动触发启动转换,在转换时ADC 必须关闭。当使用自动

触发时, ADC 预分频器在转换启动前复位。由于在转换前的增益级依靠稳定的ADC 时

钟,该转换无效。在每次转换( 在寄存器 ADCSRA 的ADEN 位中 写 “0” 接着为“1”),通

过禁用然后重使能ADC,只执行扩展转换。扩展转换结果有效。

6、改变通道和基准源

ADMUX寄存器中的MUXn及REFS1:0通过临时寄存器实现了单缓冲。CPU可对此临时寄

存器进行随机访问。这保证了在转换过程中通道和基准源的切换发生于安全的时刻。在转

换启动之前通道及基准源的选择可随时进行。一旦转换开始就不允许再选择通道和基准

源了,从而保证ADC 有充足的采样时间。在转换完成(ADCSRA 寄存器的ADIF 置位) 之

前的最后一个时钟周期,通道和基准源的选择又可以重新开始。转换的开始时刻为ADSC

置位后的下一个时钟的上升沿。因此,建议用户在置位ADSC 之后的一个ADC 时钟周期

里,不要操作ADMUX 以选择新的通道及基准源。

使用自动触发时,触发事件发生的时间是不确定的。为了控制新设置对转换的影响,在更

新ADMUX 寄存器时一定要特别小心。

若ADATE及ADEN都置位,则中断事件可以在任意时刻发生。如果在此期间改变ADMUX

寄存器的内容,那么用户就无法判别下一次转换是基于旧的设置还是最新的设置。在以下

时刻可以安全地对ADMUX 进行更新:

1. ADATE 或ADEN 为 0

2. 在转换过程中,但是在触发事件发生后至少一个ADC 时钟周期

3. 转换结束之后,但是在作为触发源的中断标志清零之前

如果在上面提到的任一种情况下更新ADMUX,那么新设置将在下一次ADC 时生效。

当改变差分通道时要特别注意。一旦选定差分通道,增益级要用125 μs 来稳定该值。因

此在选定新通道后的125 μs 内不应启动转换。或舍弃该时间段内的转换结果。

7、ADC

输入通道

选择模拟通道时请注意以下指导方针:

工作于单次转换模式时,总是在启动转换之前选定通道。在ADSC 置位后的一个ADC 时

钟周期就可以选择新的模拟输入通道了。但是最简单的办法是等待转换结束后再改变通

道。

在连续转换模式下,总是在第一次转换开始之前选定通道。在ADSC 置位后的一个ADC

时钟周期就可以选择新的模拟输入通道了。但是最简单的办法是等待转换结束后再改变

通道。然而,此时新一次转换已经自动开始了,下一次的转换结果反映的是以前选定的模

拟输入通道。以后的转换才是针对新通道的。

当切换到差分增益通道,由于自动偏移抵消电路需要沉积时间,第一次转换结果准确率很

低。用户最好舍弃第一次转换结果。

8、ADC

基准电压源

ADC的参考电压源(VREF)反映了ADC的转换范围。若单端通道电平超过了VREF,其结果将

接近0x3FF。VREF 可以是AVCC、内部2.56V 基准或外接于AREF 引脚的电压。

AVCC通过一个无源开关与ADC相连。片内的2.56V参考电压由能隙基准源(VBG)通过内部

放大器产生。无论是哪种情况,AREF 都直接与ADC 相连,通过在AREF 与地之间外加

电容可以提高参考电压的抗噪性。VREF 可通过高输入内阻的伏特表在AREF 引脚测得。

由于VREF 的阻抗很高,因此只能连接容性负载。

如果将一个固定电源接到AREF 引脚,那么用户就不能选择其他的基准源了,因为这会导

致片内基准源与外部参考源的短路。如果AREF 引脚没有联接任何外部参考源,用户可以

选择AVCC 或1.1V 作为基准源。参考源改变后的第一次ADC 转换结果可能不准确,建

议用户不要使用这一次的转换结果。

9、相关寄存器

1)ADMUX

a4c26d1e5885305701be709a3d33442f.png

• Bit 7:6 – REFS1:0: 参考电压选择

如Table 83 所示,通过这几位可以选择参考电压。如果在转换过程中改变了它们的设置,

只有等到当前转换结束(ADCSRA 寄存器的ADIF 置位) 之后改变才会起作用。如果在

AREF 引脚上施加了外部参考电压,内部参考电压就不能被选用了。

a4c26d1e5885305701be709a3d33442f.png

• Bit 5 – ADLAR: ADC 转换结果 左对齐

ADLAR影响ADC转换结果在ADC数据寄存器中的存放形式。ADLAR置位时转换结果为左

对齐,否则为右对齐。ADLAR 的改变将立即影响ADC 数据寄存器的内容,不论是否有

转换正在进行。

• Bits 4:0 – MUX4:0: 模拟通道与增益选择位

通过这几位的设置,可以对连接到ADC 的模拟输入进行选择。也可对差分通道增益进行

选择。细节见Table 84。如果在转换过程中改变这几位的值,那么只有到转换结束

(ADCSRA 寄存器的ADIF 置位) 后新的设置才有效。

a4c26d1e5885305701be709a3d33442f.png

a4c26d1e5885305701be709a3d33442f.png

a4c26d1e5885305701be709a3d33442f.png

2)ADC控制和状态寄存器—ADCSRA

a4c26d1e5885305701be709a3d33442f.png

• 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 – ADATE: ADC 自动触发使能

ADATE置位将启动ADC自动触发功能。触发信号的上跳沿启动ADC转换。触发信号源通

过SFIOR 寄存器的ADC 触发信号源选择位ADTS 设置。

• 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 预分频器选择位

由这几位来确定XTAL 与ADC 输入时钟之间的分频因子。

a4c26d1e5885305701be709a3d33442f.png

3)ADC 数据寄存器- ADCL 及ADCH

a4c26d1e5885305701be709a3d33442f.png

ADC 转换结束后,转换结果存于这两个寄存器之中。如果采用差分通道,结果由2 的补码

形式表示。

读取ADCL 之后,ADC 数据寄存器一直要等到ADCH 也被读出才可以进行数据更新。因

此,如果转换结果为左对齐,且要求的精度不高于8 比特,那么仅需读取ADCH 就足够

了。否则必须先读出ADCL 再读ADCH。

ADMUX 寄存器的 ADLAR 及MUXn 会影响转换结果在数据寄存器中的表示方式。如果

ADLAR 为1,那么结果为左对齐;反之( 系统缺省设置),结果为右对齐。

• ADC9:0: ADC 转换结果ADC 转换的结果。

4)特殊功能IO 寄存器- SFIOR

a4c26d1e5885305701be709a3d33442f.png

• Bit 7:5 – ADTS2:0: ADC 自动触发源

若ADCSRA 寄存器的ADATE 置位,ADTS 的值将确定触发ADC 转换的触发源;否则,

ADTS的设置没有意义。被选中的中断标志在其上升沿触发ADC转换。从一个中断标志清

零的触发源切换到中断标志置位的触发源会使触发信号产生一个上升沿。如果此时

ADCSRA 寄存器的ADEN 为1,ADC 转换即被启动。切换到连续运行模式(ADTS[2:0]=0)

时,即使ADC 中断标志已经置位也不会产生触发事件。

a4c26d1e5885305701be709a3d33442f.png

• Bit 4 – Res: 保留位

这一位保留。为了与以后的器件相兼容,在写SFIOR 时这一位应写0。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
#include #include #define uchar unsigned char #define uint unsigned int void main() { DDRA=0X00; DDRB=0XFF; DDRD|=0X30; TCCR1A=0x91; //8位相位修正PWM 8000000/(64*2*256)=244.14hz TCCR1B=0x03; //clk/64 OCR1A=250; //初值占空比100% while(1) { if(PINA==0xe7)//加速前进4、5灯 { OCR1A=202;//占空比100% turn();//居中 } if(PINA==0xcf)//速度稍减前进5、6灯 { OCR1A=202;//占空比90% turnL();//左转-15度 } if(PINA==0x9f)//速度再减前进6、7灯 { OCR1A=176;//占空比80% turnLL();//左转-30度 } if(PINA==0x3f)//速度减前进7、8灯 { OCR1A=176;//占空比70% turnLLL();//左转-45度 } if(PINA==0X7f)//速度稍减前进8灯 { OCR1A=176;//占空比70% turnLLL();//右转45度 } if(PINA==0xf3)//速度稍减前进3、4灯 { OCR1A=202;//占空比90% turnR();//右转15度 } if(PINA==0Xf9)//速度再减前进2、3灯 { OCR1A=176;//占空比80% turnRR();//右转30度 } if(PINA==0Xfc)//速度稍减前进1、2灯 { OCR1A=176;//占空比70% turnRRR();//右转45度 } if(PINA==0Xfe)//速度稍减前进1灯 { OCR1A=176;//占空比70% turnRRR();//右转45度 } } } /*-45度*/ void turnLLL() { uchar i; DDRB=0XFF; PORTB=0XFF; for(i=0;i<30;i++) { PORTB&=~BIT(0); delay(18); PORTB|=BIT(0); delay(4); } } /*-30度*/ void turnLL() { uchar i; DDRB=0XFF; PORTB=0XFF; for(i=0;i<30;i++) { PORTB&=~BIT(0); delay(18); PORTB|=BIT(0); delay(6); } } /*-15度*/ void turnL() { uchar i; DDRB=0XFF; PORTB=0XFF; for(i=0;i<30;i++) { PORTB&=~BIT(0); delay(18); PORTB|=BIT(0); delay(8); } } /*0度居中*/ void turn()//居中 { uchar i; DDRB=0XFF; PORTB=0XFF; for(i=0;i<30;i++) { PORTB&=~BIT(0); delay(18); PORTB|=BIT(0); delay(10); } } /*15度*/ void turnR() { uchar i; DDRB=0XFF; PORTB=0XFF; for(i=0;i<30;i++) { PORTB&=~BIT(0); delay(18); PORTB|=BIT(0); delay(12); } } /*30度*/ void turnRR() { uchar i; DDRB=0XFF; PORTB=0XFF; for(i=0;i<30;i++) { PORTB&=~BIT(0); delay(18); PORTB|=BIT(0); delay(14); } } /*45度*/ void turnRRR() { uchar i; DDRB=0XFF; PORTB=0XFF; for(i=0;i<30;i++) { PORTB&=~BIT(0); delay(18); PORTB|=BIT(0); delay(17); } } /*定时0.1MS*/ void delay(uint z) { uint i,j; for(i=0;i<z;i++) for(j=0;j<90;j++); }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值