单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 686|回复: 0
收起左侧

AVR单片机ATmega16之ADC学习方法详解

[复制链接]
放轻菘 发表于 2019-6-13 21:51 | 显示全部楼层 |阅读模式
ADC(模/数转换器ADC):顾名思义就是一个起转换功能的器件了喽。
一.首先了解一下对应的管脚:
      我先直接用大白话说说我自己的理解吧,就是AVR上设了相应接口来接收外部输进来的模拟信号量,但是MCU只会处理10010101这样的数字量,所以需要ADC这样一个东西进行中间的转换(ATmega16内部是集成了一个10位逐次比较的ADC电路),然后你需要转换些什么就把需要转换的东西接在内个事先安排好的管脚上(PORTA上0~7都被安排了) ADC1.jpg (图片的书上有一些详细的说明)

二.实际使用
  在实际学习使用中,我还没用到那么多功能,只用了最基础的8路单端输入电压采样中的其中一路(单端电压输入以0V:GND为参考)
ADC2.jpg ADC3.jpg (如图就是我使用的学校的板子的原理图)

实验目的:
目的时使用PA7这一路的输入(在按下不同按钮是产生不同的电压)通过ADC转化,交给MCU进行处理,实现这部分按键的定位
如图(KEY1:0    KEY2:(1/4)vcc     KEY4:(2/5)vcc     KEY3:(1/2)vcc     KEY6:(4/7)vcc   KEY5:(5/8)vcc  )    VCC=3.3V
转换数据处理: ADC4.jpg ADC5.jpg
(如图,ADC多路复用器选择寄存器ADMUX中的第5位ADLAR默认状态时为0,所以默认就是右对齐喽,这样也好看一些,随意吐槽一下,为什么还要设置左对齐这种东西,哈哈哈哈哈)

       既然是10位,那么将二进制转换为十进制的话,最大就是1024,如果只要定位按键的话可以不用得到具体的电压值,直接获得该电压值下对应的一个十位二进制数就好了。就好比((你按下按键产生的压值/参考的总电压)==(该电压下转换后的十位数/1024))。然后通过获取的是十位数所在的区间就可以定位按键了(这里之所以说区间,是因为总会有些误差的嘛)。
ADC7.JPG ADC6.JPG (如图是ADC使用初始化代码,和按键定位的代码,误差我选择了20)

关于转换结果:我有两种写法
①     result=ADCL;        result=ADCH*256+result;   //转换结果

②     result=ADCL;
        result=(ADCH<<8)  |  result;   //转换结果

(result是自己定义的一个过渡变量)





评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|单片机论坛 |51黑电子论坛技术交流 QQ 管理员QQ:125739409;技术交流QQ群636986012

Powered by 单片机教程网

快速回复 返回顶部 返回列表