ATtiny88初体验(五):ADC

ADC模块介绍

ATtiny88单片机包含一个10bit分辨率的ADC模块,拥有8个通道,最大采样率15kSPS,转换时间14us。ATtiny88的ADC参考电压可以来自外部,也可以使用内部1.1V的电压源。支持自由运行模式和单次转换模式,支持多种自动触发源,在睡眠模式下拥有噪声消除器。

注意:为了使用ADC模块, PRR 寄存器的 PRADC 位必须设为0。

ADC转换结果保存在 ADCHADCL 寄存器中,可以通过 ADLAR 位来选择左对齐还是右对齐。为了防止在读取ADC结果时,ADC结果发生改变,必须先读取 ADCL 寄存器,然后再读取 ADCH 寄存器。因为在读取 ADCL 寄存器时,ADC转换的结果会被锁定,直到 ADCH 寄存器被读取为止。

ADC有两种模式:单次触发模式和自由运行模式。在单次触发模式下,向 ADSC 位写1启动转换,转换完成后该位会自动清零;在自由运行模式下, ADSC 位会一直维持1。

在睡眠模式下,ADC模块可以启用噪声消除器减少来自CPU内核和其他I/O外设的噪声,方法如下:

  1. 确保ADC使能并处于非忙状态,选择单次转换模式,使能ADC转换结束中断。
  2. 进入ADC噪声减少模式(或空闲模式),当CPU停止工作时,ADC会开始一次转换。
  3. 当转换结束时,ADC转换结束中断会唤醒CPU,除非再次使用睡眠命令,否则CPU会一直处于活跃状态。

注意:进入除空闲模式及ADC噪声减少模式外的其他睡眠模式时,不会自动关闭ADC,建议在进入这些睡眠模式时将 ADEN 位清零。

ADC转换结果与电压的关系如下式所示:

\[ADC=\frac{V_{IN} \times 1024}{V_{REF}}
\]

ATtiny88内部有一个温度传感器,它连接到ADC8通道,在测量温度时,必须选择内部1.1V参考电压。

ADC的测量电压与温度约为线性关系,灵敏度约为1LSB/℃,典型值如下:

为了获得更高的精度,可以使用如下公式进行软件校正:

\[T = k \times [(ADCH << 8) | ADCL] + T_{OS}
\]

其中, \(k\) 是斜率,是固定的,通常数值非常接近1, \(T_{OS}\) 是传感器偏移量。

相关寄存器

  • REFS0 :参考电压选择。

  • ADLAR :ADC结果左对齐,设为0右对齐,设为1左对齐。
  • MUX[3:0] :模拟通道选择。

  • ADEN :使能ADC。
  • ADSC :启动ADC转换,转换结束后自动清零。
  • ADATE :使能ADC自动触发。
  • ADIF :ADC中断标志位,中断程序执行结束后清零,或者也可以写1清零。
  • ADPS[2:0] :ADC分频选择,分频后的频率不要超过1MHz。

  • ADTS[2:0] :ADC自动触发源选择。

  • ADCnD :关闭对应ADC引脚的数字输入缓冲。

代码

下面的代码展示了如何使用ATtiny88的ADC模块读取ADC0通道(PC0引脚)的电压值,代码文件的整体组织结构如下:

.
├── Makefile
├── inc
│   ├── serial.h
│   └── serial_stdio.h
└── src
├── main.c
├── serial.c
└── serial_stdio.c

src/main.c 源文件的内容如下:

#include <stdint.h>
#include <stdio.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <serial_stdio.h> static void delay(void); int main(void)
{
cli();
stdio_setup(); // initialize stdio and redirect it to serial
ADMUX = _BV(REFS0); // external reference, align right, select channel ADC0(PC0)
ADCSRA = _BV(ADEN) | _BV(ADIF) | _BV(ADPS2) | _BV(ADPS1) | _BV(ADPS0);
// enable ADC, clear ADC interrupt flag, disable ADC interrupt, division factor = 128
DIDR0 = _BV(ADC0D); // disable digital input buffer of ADC0 pin
sei(); for (;;) {
ADCSRA |= _BV(ADSC); // start conversion
while (!(ADCSRA & _BV(ADIF))); // wait for completion
uint16_t value = ADCL; // read low byte first
value |= ADCH << 8; // then read the high
uint16_t voltage = (5000UL * value) >> 10; // convert digital value to voltage
printf("ADC0 value: 0x%04X, voltage: %dmV.\r\n", value, voltage);
ADCSRA |= _BV(ADIF); // clear flag
delay();
}
} static void delay(void)
{
for (volatile uint32_t i = 0; i < 0x8000; i++);
}

参考资料

  1. ATtiny88 Datasheet

ATtiny88初体验(五):ADC的更多相关文章

  1. Spring Cloud Alibaba 初体验(五) SkyWalking

    一.下载与运行 本文使用 SkyWalking 7.0.0:https://www.apache.org/dyn/closer.cgi/skywalking/7.0.0/apache-skywalki ...

  2. VSTO学习笔记(十五)Office 2013 初体验

    原文:VSTO学习笔记(十五)Office 2013 初体验 Office 2013 近期发布了首个面向消费者的预览版本,我也于第一时间进行了更新试用.从此开始VSTO系列全面转向Office 201 ...

  3. SpringCloud初体验:五、Sidecar 将 PHP 这类非 Java 生态语言的服务接入 Spring Cloud

    先起一个 Sidecar 服务,一个PHP服务一个应用,和PHP服务部署在同一台机子,通过 localhost 访问,这样就解决了网络开销,相当于本地进程间调用 Sidecar 服务比较简单, 1.这 ...

  4. 五、MyBatis缓存初体验

    缓存就是内存中的数据,常常来自对数据库查询结果的保存,使用缓存, 我们可以避免频繁的与数据库进行交互, 进而提高响应速度. 一级缓存初体验(session,默认打开) 同一查询执行两次以上:selec ...

  5. 在同一个硬盘上安装多个 Linux 发行版及 Fedora 21 、Fedora 22 初体验

    在同一个硬盘上安装多个 Linux 发行版 以前对多个 Linux 发行版的折腾主要是在虚拟机上完成.我的桌面电脑性能比较强大,玩玩虚拟机没啥问题,但是笔记本电脑就不行了.要在我的笔记本电脑上折腾多个 ...

  6. win7升win10,初体验

    跟宿舍哥们聊着聊着,聊到最近发布正式版的win10,听网上各种评论,吐槽,撒花的,想想,倒不如自己升级一下看看,反正不喜欢还可以还原.于是就开始了win10的初体验了,像之前装黑苹果双系统一样的兴奋, ...

  7. 【阿里云产品公测】结构化数据服务OTS之JavaSDK初体验

    [阿里云产品公测]结构化数据服务OTS之JavaSDK初体验 作者:阿里云用户蓝色之鹰 一.OTS简单介绍 OTS 是构建在阿里云飞天分布式系统之上的NoSQL数据库服务,提供海量结构化数据的存储和实 ...

  8. ASP.NET2.0组件控件开发视频 初体验

    原文:ASP.NET2.0组件控件开发视频 初体验 ASP.NET2.0组件控件开发视频 初体验 录了视频,质量不是很好,大家体验下.我会重新录制的 如果不清楚,可以看看http://v.youku. ...

  9. 屌丝就爱尝鲜头——java8初体验

    Java8已经推出,让我们看看他的魅力.让我们看看他改变较大的部分. 一.java8概述 Java8是由Oracle(甲骨文)公司与2014年3月27日正式推出的.Java8同时推出有3套语言系统,分 ...

  10. SpringCloud初体验:前言

    体验了一天 SpringCloud 后发现,人们所讲的微服务架构不是一门技术,而是一种风格. 感觉确实可以这么认同,因为一套 SpringCloud 玩下来(未深入.未完整「链路追踪.动态刷新配置…… ...

随机推荐

  1. Java JDK1.8环境变量配置

    Java JDK1.8.0_152下载地址:https://pan.baidu.com/s/1BRB2MRETPdWVL-IN2FRTEw   提取码:63jb 下载好后傻瓜式一键Next下载就好,默 ...

  2. 【工作随手记】deaklock排查

    生产环境当中还没真正遇到过死锁的问题.有些疑似死锁的问题,后来经过排查也只是其它问题导致的.所以通过jstack到底怎样排查死锁问题有点疏忽了.这里作个记录. 模拟一个死锁 顺便复习一下. 死锁的产生 ...

  3. Spring源码:Bean生命周期(终章)

    前言 本系列前面讲解了Spring的bean定义.bean实例化.bean初始化等生命周期.这些步骤使我们能够了解bean从创建到准备好使用所经历的过程.但是,除了这些步骤,bean的销毁也是非常重要 ...

  4. idea过期解决

    用作用作发现过期了,苦恼,好办直接 搞个code 就行 MNQ043JMTU-eyJsaWNlbnNlSWQiOiJNTlEwNDNKTVRVIiwibGljZW5zZWVOYW1lIjoiR1VPI ...

  5. C#/VB.NET:如何从 PowerPoint 演示文稿中提取文本

    在学习或者日常工作中,有时我们需要把幻灯片的东西整理成文字,而从 PowerPoint 演示文稿中一张一张的整理手动复制粘贴,整个过程会非常费精力且耗时.那么怎么样才能比较轻松且快速地提取PowerP ...

  6. 【lwip】15-NETCONN接口

    前言 终于到接口层了. 原文:李柱明博客:https://www.cnblogs.com/lizhuming/p/17442931.html ‍ 框架描述 前面我们已经学完了,都知道raw接口了,其实 ...

  7. const 使用

    宏定义与const的区别?(概念题是最容易丢分)1. 发生时机不一样: 宏定义发生在预处理时,const关键字发生编译时2. 宏定义仅仅只做了字符串的替换,没有类型检查; const关键字有类型检查, ...

  8. Go语言中的原子操作

    1. 引言 在并发编程中,多个协程同时访问和修改共享数据时,如果没有使用适当的机制来防止并发问题,这个时候可能导致不确定的结果.数据不一致性.逻辑错误等严重后果. 而原子操作是解决并发编程中共享数据访 ...

  9. 如何刷新 DNS 缓存 (macOS, Linux, Windows)

    如何刷新 DNS 缓存 (macOS, Linux, Windows) Unix Linux Windows 如何刷新 DNS 缓存 (macOS, FreeBSD, RHEL, CentOS, De ...

  10. React后台管理系统 03全局样式scss

    安装scss样式依赖,使用命令 npm i --save-dev sass  --dev 会将依赖安装在devDependencies=>开发环境的依赖. 我们在src目录下的assets下创建 ...