ATmega16 ADC简单实验
这篇博客的主要内容是讲解常用的 AVR 单片机的 ADC 功能,知识比较基础,代码也很简单,适合新手快速掌握单片机 ADC 的操作,本篇使用的单片机是 ATmega16。
最近由于课程需要,学习了一段时间的 AVR 单片机,对于一些简单的端口操作、控制 LED 灯之类的就不另做篇幅去讲解了,因为就跟 Hello, world 一样简单,对于我来说,单片机控制得最多的是各种各样的传感器,而传感器是模拟器件,传到单片机的数据时模拟信号,但是单片机等芯片是数字芯片呀,数字芯片只能处理数字信号,也就是高电平和低电平,所以就需要一个模块来将这两种信号进行转换,就是今天要讲到的 AD 转换,中文是模数转换,作用就是讲模拟信号转化成数字信号,在大部分文档中也会称为 ADC (Analog/Digital Convert),今天就以一个实例来展示 AVR 的 ADC。
新手入门单片机大都是学习的 51 单片机,用的最多的芯片是 STC89C52 (或 C51),但是 51 单片机片上资源很少,只有少数够用的功能,其他的一些高级模块都没有,而 AVR 虽然跟 51 单片机都是 8 位的微控制器,但是 AVR 单片机的片上资源多很多,诸如 ADC, I2C 等等,有了这些外设,使用起来就简单很多了,不用自己重新编写复杂的程序,也不用花钱给电路增加额外的硬件。
先来看看本次实验的电路图:

其中图片左上角部分连接着 RESET, XTAL1, XTAL2 引脚的那一部分电路是组成单片机最小系统的电路,也是使单片机正常工作的必要条件。我们在 PA0 脚上连接一个电位器,给单片机提供模拟信号的就是这个电位器了,电位器通过改变阻值来改变输入到单片机的电压。右下角有两个引脚 AREF 和 AVCC,其中 AREF 是单片机基准电压外部输入引脚,AVCC 是模拟电源,要使用 ADC 功能这两个引脚就必不可少了。还有最后一部分是连接到 PD 口的 8 个 LED 灯,用来显示单片机 AD 转换后的结果,虽然用 LED 来表示结果不直观,但是是操作最简单的方法了。
代码比电路更简单,直接贴上代码:
1 |
|
每一句的作用在代码中的注释都已经很清晰了,要特别讲解的是 ADCSRA 寄存器,事实上关于这个寄存器的操作以及每一位的作用都不需要特别讲解,因为在官方文档都已经说得很清楚了,我就只贴出文档的截图吧


以上的代码在 ATmel Studio 7.0 中已经验证通过,在 AT Studio 中编译生成 hex 文件之后,电路按照第一张图片的接法,然后将程序写入单片机中运行就能看到接 LED 灯的结果了,AD 转换的结果是 8 位的,每次转换的结果都会存在 ADCH 寄存器中,所以代码中就直接将 ADCH 的值写入 PD 口中,当你改变电位器阻值的时候你就会看到 LED 灯也在变化。
YouTube 上的演示视频: