没有合适的资源?快使用搜索试试~ 我知道了~
马伟力AVR笔记:六、模拟比较器和ADC实验.docx
1 下载量 58 浏览量
2022-10-24
17:06:56
上传
评论
收藏 131KB DOCX 举报
温馨提示
试读
29页
模拟比较器和ADC实验
资源推荐
资源详情
资源评论
AVR 学习笔记六、模拟比较器和 ADC 实验
-------基于 LT_Mini_M16
6.1 模拟比较器实验
6.1.1 实例功能
模拟比较器和模数转换 ADC 是单片机内部最常见的两种支持模拟信号输入的功能接口。大
部分 AVR 都具备这两种类型的接口。本实例将以 ATmage16 芯片为例,介绍模拟比较器的使用方
法,在下一个实例中介绍模数转换 ADC。
使用模拟比较器可以实现单片机系统电源电压的检测,更巧妙的应用是利用模拟比较器和
一些简单的外围电路,设计简单的模数转换 ADC。
本实例实现利用模拟比较器比较某一点电压与内部模拟比较器参考电压的高低。共有 3 个
功能模块,分别描述如下:
● 单片机系统:使用 ATmega16 单片机的模拟比较器比较某一点的电压与参考电压的关系。
● 外围电路:利用电阻设计的分压电路。
● 软件程序:熟悉掌握 ATmega16 单片机的模拟比较器的使用。
通过本实例的学习,掌握相关电路设计,并掌握以下知识点:
● 了解单片机的模拟比较器。
● 了解单片机的模拟比较器的使用。
● 掌握单片机模拟比较器的编程。
6.1.2、器件和原理
1、模拟比较器的介绍
ATmega16 的模拟比较器可以实现对两个输入端:正极 AIN0 和负极 AIN1(分别对应于
ATmage16 的引脚 PB2、PB3)的模拟输入电压进行比较。当 AIN0 上的电压高于 AIN1 的电压
时,模拟比较器输出 ACO 被设为“1”。比较器的输出还可以被设置作为定时计数器 1 输入捕
获功能的触发信号。此外,比较器的输出可以触发一个独立的模拟比较器中断。用户可以选
择使用比较器输出的上升沿、下降沿或事件触发作为模拟比较器中断的触发信号。
2、与模拟比较器相关的寄存器
与模拟比较器相关的寄存器是 SFIOR、ACSR。用户通过这两个寄存器的相关位实现对模
拟比较器的设置和控制。
1) 特殊功能 IO 寄存器—SFIOR
寄存器 SFIOR 中的第 3 位 ACME 为模拟比较器多路使能控制位。当该位为逻辑“1”,同
时模数转换(ADC)功能被关闭(ADCSRA 寄存器中的 ADEN 使能位为“0”)时,允许使用 ADC
多路复用器选择 ADC 的模拟输入端口作为模拟比较器反向端的输入信号源。当该位为零时,
AIN1 引脚的信号将加到模拟比较器反向端。
本实例中我们使用 ADC 的模拟输入端口作为模拟比较器反向端的输入信号源,所以需
位
7
6
5
4
3
2
1
0
$30($0050)
ADTS2
ADTS1-
ADTS0-
-
ACME
PUD
PSR2
PSR10
SFIOR
读/写
R/W
R/W
R/W
R
R/W
R/W
R/W
R/W
复位值
0
0
0
0
0
0
0
0
要设置第 3 位 ACME 为 1.
2) 模拟比较器控制和状态寄存器—ACSR
位
7
6
5
4
3
2
1
0
$08
(
$0028
)
ACD
ACBG
ACO
ACI
ACIE
ACIC
ACIS1
ACIS0
ACSR
读
/
写
R/W
R/W
R
R/W
R/W
R/W
R/W
R/W
复位值
0
0
N/A
0
0
0
0
0
ACSR 是模拟比较器主要的控制寄存器,其中各个位的作用如下:
1. 位 7—ACD:模拟比较器禁止
当该位设为“1”时,提供给模拟比较器的电源关闭。该位可以在任何时候被置位,从而关
闭模拟比较器。在 MCU 闲置模式,且无需将模拟比较器作为唤醒源的情况下,关闭模拟比较器可
以减少电源的消耗。要改变 ACD 位的设置时,应该先将寄存器 ACSR 中的 ACIE 位清零,把模拟比
较器中断禁止掉。否则,在改变 ADC 位设置时会产生一个中断。
2. 位 6—ACBG:模拟比较器的能隙参考源选择
当该位为“1”时,芯片内部一个固定的能隙(Bandgap)参考电源 1.22V 将代替 AIN0 的输
入,作为模拟比较器的正极输入端。当该位被清零时,AIN0 的输入仍然作为模拟比较器的正极
输入端。
3. 位 5—ACO:模拟比较器输出
模拟比较器的输出信号经过同步处理后直接与 ACO 相连。由于经过同步处理,ACO 与模拟比
较器的输出之间,会有 1~2 个时钟的延时。
4. 位 4—ACI:模拟比较器中断标志位
当模拟比较器的输出事件符合中断触发条件时(中断触发条件由 ACIS1 和 ACIS0 定义),
ACI 由硬件置“1”。若 ACIE 位置“1”,且状态寄存器中的 I 位为“1”时,MCU 响应模拟比较
器中断。当转入模拟比较中断处理向量时,ACI 被硬件自动清空。此外,也可使用软件方式清零
ACI:对 ACI 标志位写入逻辑“1”来清零该位。
5. 位 3—ACIE:模拟比较器中断允许
当 ACIE 位设为“1”,且状态寄存器中的 I 位被设为“1”时,允许模拟比较器中断触发。
当 ACIE 被清“0”时,模拟比较器中断被禁止。
6. 位 2—ACIC:模拟比较器输入捕获允许
当该位设置为“1”时,定时计数器 1 的输入捕获功能将由模拟比较器的输出来触发。在这
种情况下,模拟比较器的输出直接连到输入捕获前端逻辑电路,从而能利用定时器/计数器 1 输
入捕获中断的噪声消除和边缘选择的特性。当该位被清零时,模拟比较器和输入捕获功能之间没
有联系。要使能比较器触发定时器/计数器 1 的输入捕获中断,定时器中断屏蔽寄存器(TIMSK)
中 的 TICIE1 位必须被设置。
7. 位 1、0—ACIS1、ACIS0:模拟比较器中断模式选择
这 2 个位决定哪种模拟比较器的输出事件可以触发模拟比较器的中断。不同的设置参见表
6.1.1。
表 6.1.1 模拟比较器中断模式选择
ACIS1
ACIS0
中 断 模 式
0
0
比较器输出的上升沿和下降沿都触发中断
0
1
保留
1
0
比较器输出的下降沿触发中断
1
1
比较器输出的上升沿触发中断
注意:当要改变 ACIS1、ACIS0 时,必须先清除 ACSR 寄存器中的中断允许位,以禁止模拟
比较器中断;否则,当这些位被改变时,会发生中断。
在本实例中,我们要使用模拟比较器,所以应当允许模拟比较器,即 ACD 应为 0,选择芯
片内部的固定能隙参考电源。即 ACBG 设置为 1,我们不使用中断和捕获,所以不必理会与此相
关的各位。
3) 模拟比较器的多路输入
用户可以选择 ADC7..0 引脚中的任一路的模拟信号代替 AIN1 引脚,作为模拟比较器的反向
输入端。模数转换的 ADC 多路复用器提供这种选择的能力,但此时必须关闭芯片的 ADC 功能。当
模拟比较器的多路选择使能位(SFIOR 中的 ACME 位)置“1”,同时 ADC 被关闭时(ADCSRA 中的
ADEN 位置“0”),由寄存器 ADMUX 中的 MUX[2:0]位所确定的引脚将代替 AIN1 作为模拟比较器
的反向输入端,如表 6.1.2 所示。如果 ACME 被清零,或 ADEN 被置 1,则 AIN1 仍将为模拟比较
器的反向输入端。
本实例中我们采用 ADC0 作为模拟比较器的反向输入端,所以选择 ADMUX 寄存器中的 MUX2:
0=0;
6.1.3、电路
本实例的电路包含分压电路,下面的电路是电阻分压电路,如下图所示。
1、电路原理
在本实例中利用电位器(即可调电阻)组成分压电路,单片机的 PA0 连接在电位器的动片
引脚上,这个电路实际上相当于两个电阻组成的串联电路,只不过这两个电阻的阻值是可变的,
改变动片的位置,就可以改变 PA0 与地之间的电阻值,根据串联电路分压的原理,当动片移动
时,PA0 处的电压就会发生变化。
2、电路连接
表 6.1.2 模拟比较器多路输入选择
ACME
ADEN
MUX2..0
模拟比较器反向输入端
0
x
xxx
AIN1
1
1
xxx
AIN1
1
0
000
ADC0
1
0
001
ADC1
1
0
010
ADC2
1
0
011
ADC3
1
0
100
ADC4
1
0
101
ADC5
1
0
110
ADC6
1
0
111
ADC7
电路电位器的动片引脚连接到单片机的 PA0 口,作为模拟比较器的反向输入端。
6.1.4、程序设计
1、程序功能
程序的功能是使用单片机的模拟比较器比较 PA0 口的电压与单片机内部的固定能隙电
压(1.22V)之间的高低,如果 PA0 的电压低于 1.22V,则 D1 灯点亮,否则 D2 灯点亮。
2 函数说明
本程序有两个功能函数,分别是:
● 端口初始化函数,设置连接 D1、D2 两个 LED 的端口 PB0、PB1 为输出口,输出低电平,
使两个 LED 都处于熄灭状态。
● 模拟比较器初始化函数
设置与模拟比较器相关的寄存器,使模拟器按照一定的方式工作。
3、使用 WINAVR 开发环境,我们使用的是外部 12M 的晶振,所以需要将 makefile 文件中
的时钟频率修改为 12M。另外在程序烧录到单片机的时候,熔丝位也要选择为外部 12M 晶振(注
意是晶振,不是外部振荡器,一定不要选择错了,否则会导致单片机不能再烧写程序)。
4、程序代码
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h> //中断函数头文件
//函数声明
void Port_Init(void); //端口初始化配置
void Compare_Init(void); //模拟比较器初始化设置
int main(void)
{
Port_Init();
Compare_Init();
sei(); //使能全局中断
while(1)
{
if(ACSR & (1 << ACO)) //判断 ADC0 的电压是否大于 1.22V
{
PORTB = 0X01; //低于 1.22V,D1 点亮,
}
else
{
PORTB = 0X02; //高于 1.22V,D2 点亮,
}
}
}
//端口状态初始化设置函数
void Port_Init()
{
PORTB = 0X00; //
DDRB |= (1 << PB0) | (1 << PB1); //PB0、PB1 设置为输出
}
//模拟比较器初始化函数
void Compare_Init()
{
SFIOR |= (1 << ACME); //使用 ADC 多路复用器选择 ADC 的模拟输入端口
//作为模拟比较器反向输入端的信号源。
//同时选择 ADC 的 ADC0 作为输入端,并且关闭 AD 转换的使能
ACSR |= (1 << ACBG); //允许模拟比较器,AIN0 设置为内部固定能隙参考电源 1.22V
}
6.2 模数转换的 ADC 实验
6.2.1、实例功能
AVR 的模数转换器 ADC 具有下列特点:
10 位精度;
0.5LSB 积分非线形误差
±2LSB 的绝对精度;
13µs~260µs 的转换时间;
在最大精度下可达到每秒 15kSPS 的采样速率;
8 路可选的单端输入通道;
7 路差分输入通道;
2 路差分输入通道带有可选的 10×和 200×增益;
ADC 转换结果的读取可设置为左端对齐(LEFT ADJUSTMENT);
ADC 的电压输入范围 0~Vcc;
可选择的内部 2.56V 的 ADC 参考电压源;
自由连续转换模式和单次转换模式;
ADC 自动转换触发模式选择;
ADC 转换完成中断;
休眠模式下的噪声抑制器(NOISE CANCELER)。
在本实例中,我们将编写程序实现将模数转换后获得的电压值通过单片机的串口发送到计
算机,然后通过计算机上的串口助手显示测量的电压值。
本实例共有 3 个功能模块,分别描述如下:
● 单片机系统:使用单片机的串口实现将模数转换后获得的电压值通过串口发送到计算机。
剩余28页未读,继续阅读
资源评论
猫一样的女子245
- 粉丝: 93
- 资源: 2万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 基于matlab实现滑动去趋势波动分析
- 基于matlab实现计算区域分布指数,Moran指数,主要用于一国区域分布描述与分析.rar
- 基于matlab实现可实现脉冲编码调制,模拟信号的数字传输:抽样、量化、编码.rar
- 基于matlab实现麦克风阵列SRP-PHAT算法的二级空间快速声源定位,含模拟环境 .rar
- 基于matlab实现麦克风阵列的声源定位,四元十字阵的matlab仿真.rar
- 基于matlab实现麦克风阵列的声源定位一维music算法源代码.rar
- 基于matlab实现脉动风速模拟程序Tubsim计算结果可视化程序.rar
- 基于matlab实现脉动风速时程模拟,谐波合成法,用于各种分析方式的试验模拟.rar
- 基于matlab实现蒙特卡洛算法的仿真源代码 介绍了蒙特卡洛仿真的基本思想 并附带了一些具体例子.rar
- 代码.zip代码.zip代码数据分析代码.zip代码.zip代码数据分析
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功