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. Python-3.10安装步骤

    下载地址: https://www.python.org/ftp/python/3.10.4/python-3.10.4-amd64.exe 安装:   C:\Users\liujun>pyth ...

  2. ent M2M模型在pxc集群中的一个大坑

    ent M2M模型在pxc集群中的一个大坑 事故简要分析 PXC集群3个节点,在插入数据时,如果使用数据库自己生成的主键,一般顺序为1,4,7,10- 这里就是坑的源头,在ent底层代码中,在做M2M ...

  3. 如何从命令行启动 CST 软件?

    众所周知,CST 一贯以优良的界面友好性而著称,用户可以方便快捷的在其 windows 式的界面下进行建模.仿真及结果查看和处理等操作.然而,在某些特定情况下,也需要 CST 进行后台式的运行,比如需 ...

  4. linux DHCP

    目录 一.DHCP概念 二.DHCP工作过程 三.DHCP实验 一.DHCP概念 概念:动态主机配置协议,自动为计算机分配tcp/ip参数 DHCP的优点:1.减少管理员的工作难度 2.避免错误的可能 ...

  5. Vue 路由router

    简单案例: App.vue是核心组件,其中的<router-link>相当于a标签,to相当于href,export是暴露函数,这样某组件才能被其他组件识别到 代码: <templa ...

  6. vue-router几大坑

    如今vue使用率很高,踩坑这就是很平常的了,使用了几年坑都依然没踩完,纠结呀 一.router.js配置要点 大家都知道vue 是组件化开发,页面很多路由难免, 这里是路由配置router.js 最外 ...

  7. Hackathon 代码黑客马拉松采访复盘

    AIGC Hackathon 2023 北京站 我参加了选手采访提纲,这里我感觉有些点可以分享给大家.之前复盘的链接: 下面是采访我的回答内容: 1. 请向大家简单介绍一下自己吧? 子木,社区名称为程 ...

  8. SpringBoot定义优雅全局统一Restful API 响应框架五

    闲话不多说,继续优化 全局统一Restful API 响应框架 做到项目通用 接口可扩展. 如果没有看前面几篇文章请先看前面几篇 SpringBoot定义优雅全局统一Restful API 响应框架 ...

  9. 手把手实践丨基于STM32+华为云设计的智慧烟感系统

    摘要:当前基于STM32和华为云,设计了一种智慧烟感系统,该系统可以检测烟雾,同时将检测到的数据上传到云端进行处理和分析. 本文分享自华为云社区<基于STM32+华为云设计的智慧烟感系统> ...

  10. 快上车,搭乘HUAWEI HiCar驶向未来

    HUAWEI HiCar(以下简称HiCar)是华为提供的人-车-家全场景智慧互联解决方案,连接手机与车辆,充分发挥各自的优势属性,将手机的应用/服务生态延伸进车辆,实现以手机为核心的全场景体验.消费 ...