当前课程知识点:ARM微控制器与嵌入式系统 > 第五章 ARM微控制器的各种外设 > E5 实验五 ADC编程实操 > E5 实验五 ADC编程实操
各位同学大家好
我是清华大学工程物理系的曾鸣老师
欢迎大家继续回到我们
ARM微控制器与嵌入式系统的MOOC课程
那么这个单元呢
是我们的第五次实验
那么我们前面做了很多次实验
在这一次的实验里
我们要把我们学习的
ADC模数变换这个模块
给灵活的用起来和玩起来
那么跟我们的前面的要求一样
我们做每一次实验
做每一次实践操作
我鼓励大家一定学会找对应的内容
在芯片手册上哪里
特别是ADC这个模块
在芯片手册的第28章
因为ADC模块相对来讲
是一个非常非常重要
又相当复杂的模块
所以这个章节的信息量
远远比老师讲的内容要多
我们ADC模块
可以有各种各样的速度 工作模式
有十几个通道几十个引脚
所以日后大家要做一个
高性能的高精度的或者特别低功耗的
特殊的系统的时候
这个模块我觉得大家
还有很多需要吃透的东西
所以推荐大家一定要学会阅读芯片手册
那么在我们这门课前面讲过的
知识内容的情况下
我们来看一看
我们这一个实验的基本的思想 概念
和以及编程怎么把一个一个的任务完成
我们都建立了
我们的ADC系统是帮助我们微控制器
对一个连续变化的自然的物理量
或者我们称为模拟量
按一定的时间间隔和精度进行采样
得到一组数据的序列
从而能够被我们的微控制器计算机系统
进行处理这样一种思想
那么我们同时也建立了我们ADC模块
可能有很多个通道
但是每一个通道
它都可以在一定的速率和精度下得到平衡
来进行设置和采样
所以在我们前面例程里
给了大家一些范例的代码
给大家一个推荐工作模式
希望大家在这个实验过程当中
如果你觉得结果不理想
精度不理想
往这些方面自己多做尝试和探索
那么第一个任务就是我们课上面
最后一个思考题
我们有这么一个电位器
跟一个固定值的电阻构成了一个分压电路
当我们调整定位器的时候
也就改变组织的时候
中间这个节点上的电压会发生变化
而我们的微控制器的PortC0这个引脚
对应的是ADC的单端第14号通道
它会采集这个点的电压值
那么我们的问题是
能不能采集这个电压值
使我们LED小灯闪烁的速度
可以被电位器的旋钮来加以调节
那么在这样一个第五次实验里
我不会再给出大家这些代码
我能够提示大家是两件事
第一呢跟着我们之前讲过的课间回忆
这样一个把ADC用起来的这三个步骤
看一看老师给的ADC的Init
这样一个初始化函数
以及ADC这个READ_DATA
这样一个读取数据的函数
如何把它用起来
但是光有这么两个函数封装是不够的
我们作为编程
作为第五次实验的这种任务
开始要考验大家把不同的模块
不同的量用C语言的编程关联起来
你会拿到一个ADC读出的寄存器的值
这个值又是与ADC模块的电压值是关联的
对不对
与旋钮转的角度是关联的
那么这个值我们怎么用
能够影响LED的闪烁速度呢
其实大家稍微动动脑筋
如果我们用的是轮询方式来阐述LED
是不是我们应该把这个变量的值
通过加减乘除的一些运算
最后体现到改变我们那个
delay函数的延迟时间长短的
这样我们的闪烁速度就变了
如果我们是用的前面学过的
这个SysTick的时钟来驱动LED的闪烁
我们是不是应该通过反复的调用
这个ADC采样的值
然后在一个机制下
不断把这个值
来更新我们这个时钟的
中断的时间间隔
或者是固定时间间隔里
每多少次来让灯闪一次这个变量
所以我们要把两个不同的量关联起来
用程序的语言
用数学的关系把它们表达出来
来实现编程
那么如果这个任务大家胜任
理清了编程的思想
第二个任务就与它有点类似
调一调我们电位器的旋钮
来改变一下我们前面玩过的音乐
PWM放音乐的那个蜂鸣器
声音的频率
也就是音高 对不对
那么同样还是PTC0
还是通道14这个引脚得到的电压值
反映了旋钮的位置
那么我们是要通过C语言的编程
把拿到的这个值来改变什么
来改变PWM模块的频率
PWM模块的频率被什么设置
是被PWM模块里头的Modulo
那个寄存器的值大家记得吧
它数数数到多少
是一个周期
那个周期的值
就是那个计数器的目标值 对不对
我们要把这两个量关联起来
而如果ADC采样到的量
是个12比特的数
这个数对于那个周期值大了或者小了
我们是不是对它进行一些成熟运算
让它缩放到这个范围里 对吧
这是大家感觉到的
那么第三个任务呢
第三个任务
不再是读刚才这一个旋钮的通道了
是我给大家提到的
我们在这个板子上面是有光线传感器
我们的光线传感器是一个光敏二极管
那么这个光敏二极管串联了一个电阻
那么在这个电阻这个端点上的电压值
又经过了运算放大器的放大
最后我们得到了一个可以测量的电压
这个时候我们使用了另外一个引脚
PTC2的这个引脚
对应的是ADC的通道11
来采集这个点的电压值
那么我们如何编程改改我们的代码
是读这个通道11的电压值
并且如何把这个电压值
跟这个光敏传感器测到光线的大小
关联起来呢
这可能有点难度 对不对
那么大家需要读懂这个电路
读懂这个模拟电路
读懂这个器件
然后读懂你测到的电压值
与光线之间的关系
然后再把它通过编程反映出来
那么任务三是要根据环境光线的强弱
来改变你的LED这个小灯的亮度
大家想想这个东西怎么变
我们什么时候能让LED感觉是常亮
就它闪的非常快
那么什么时候能改变这个LED的亮度呢
其实我们可以改变它闪烁的占空比
我不知道前面我给大家说过
做呼吸灯做各种任务
大家有没有去多尝试一步
如果多尝试一步
在这个地方 你应该想办法
用你测到的环境的光线的亮度
这样一个模数转换以后得到的数字值
来作为变量
去改变你这个LED灯闪烁的占空比
大家想想是是不这么一个关系
那么很多同学对这个电路读不懂
运算的放大电路那个部分我不再重复讲
我只讲讲这个器件
当我们读不懂的时候学会看芯片手册
如果我们把电路图上
看到这样光敏二极管的型号
谷歌一下 百度一下
或者用bing搜索一下
都能找到这样一个(06:52)公司的
光敏二极管的芯片手册
那么这个芯片手册有若干页
很多同学一看满目英文
头就晕了就开始躲
不是的 我们要找到它有用信息
比如说在这个课范畴里
我非常简单给大家看两张图
大家就能理解这张电路
那么这张图一张是光线的这个叫流明
这个亮度
与这个二极管上流过的电流的关系
而这个参数在图里头写着是二极管
加着5伏偏压的时候
那么另外一张图是这个二极管
在不同的偏压下它这个饱和曲线的关系
所以大家会发现这个二极管
在不同的亮度不同的环境光下面
偏压只要在一个0点几伏到1伏以上
就基本饱和了
流过的电流就基本上是一个定值不再变
而流过的这样一个定值
不再变的这个稳定电流呢
又与环境的光是有一个很好的线性的
所以电流与光线的强度
有一个很好的线性关系
而电流流进下面电阻在电阻上
形成的电压值压降
就与电流是线性的关系
所以这样一种电路上的转化我们最终知道
我们从这个节点上测到的电压值
是环境光线这个亮度的反映
而如果大家精确的刻度和定标你的ADC
知道你测到电压值除了那个数字量以外
究竟对应几伏
你其实可以反算这个电流究竟是多少
然后你再来估一估
你甚至可以做一个带有一定精度的
这个流明计 这个亮度计
那么这一点提示就讲到这儿
更多的原理大家自己来加以理解
用编程把它实现
然后最后一个任务实验5
又往前进一步
是我们用这个板子上加的温度传感器
来测一测环境的温度值
这一次呢要求大家把这个值
刻度一下算一算
然后用我们之前做实验做过的
不管是数码管也好
还是OLED显示屏也好
在你这个板子的小屏幕上把温度显示出来
那么如果要做这件事
我们会发现我们的参考电路
实际上在板子上
是有一个比较高精度的参考电压源
然后使热敏电阻一个标准的
千分之一电阻之间形成一个分压
然后我们可以不停的测这两个电阻之间
这个分压点的电压值的变化
知道了这个点的电压值
我们就可以反算
当前这个热敏电阻的电阻值是多少
对不对
而这个点接的是PTC3
也就是我们的ADC0的通道15
所以我们还要改改我们代码
去读通道15上的电压值
一旦我们读到了这个电压值
算出了这个电阻值怎么算温度呢
问题又来了
根据我们所使用这个10K的热敏电阻
我们可以在网上搜一下它的型号
10K的NTC
你会发现电阻与温度
有一个可以查表的对应关系
而这个关系还不是简单线性的
大家可能要分段查表
或者想办法用数组
用编程来加以实现
所以有很多同学会把这张表用Excle画出来
看看它的变化趋势
尝试用若干段直线来近似它
来做 拟合出一些计算公式
这都是有良好的
数学概念和物理概念的同学
会去做的事
那么我鼓励大家也尝试尝试
于是你可以用你的微控制器
测到这样一个模拟电压值
算出电阻值
再用电阻值算出温度值
在你的屏幕上显示出来
所以这一次实验的内容都不是那么的难
但是有两个非常有意思的特点
就是首先大家开始跟物理世界打交道了
你可以测量身边的温度也好
光线也好
这些物理量
不再是局限在计算机的领域里头
你给我个0 我给你个1
此外呢
因为与周围的物理量发生了关系
大家可以拿这些量算一算了
可以决策一下这些量用来以后干嘛
比如说我们简简单单一个光线的测量
来调LED的亮度
这难道不是一个自适应光线的LED的原形吗
那么还有好多同学做智能车
你有考虑过让你的车有更好的温度适应性
更好的环境光线适应性吗
那么一旦你有了这些想法
你独特的嵌入式系统
就可以上手一点点往前做了
所以希望这一次实验
能够让大家体会到我所说的那句话
ADC和DAC是微控制器嵌入式系统
与物理世界发生关联的
最最重要的两个桥梁和纽带
那么大家自己把它玩起来吧
-1.1 课程概览
--1.1 课程概览
-1.2 如何学好嵌入式系统
-2.1 计算机的基本概念、发展历史
-2.2 从晶体管到CPU
-2.3 概念CPU、微控制器MCU和嵌入式系统
-2.4 八卦计算机史
-2.5 不同领域、不同系列的嵌入式系统
-2.6 ARM历史与MKL25Z128 MCU
--2.6 ARM历史与MKL25Z128 MCU【习题】
-3.1 CPU的基本结构和运行机制
-3.2.1 堆栈的概念
--3.2.1 堆栈的概念【习题】
-3.2.2 堆栈的概念-头脑体操
-3.3.1 ARM的体系结构
--3.3.1 ARM的体系结构【习题】
-3.3.2 ARM的体系结构-头脑体操
-3.4.1 中断的概念和机制
-3.4.2 中断子程的概念和编程
-3.5 复位、时钟、存储器和总线
--3.5 复位、时钟、存储器和总线【习题】
-3.6 小结:MCU的总体结构和程序运行机制
--3.6 小结:MCU的总体结构和程序运行机制【习题】
-4.1 第一种外设:IO
-4.2 IO外设的编程实操-点亮LED
-4.3 IO外设的进阶知识
-4.4 嵌入式开发的基本概念与工具链
-4.5 嵌入式开发的进阶知识
-4.6 嵌入式开发中的C语言(上)
--4.6 嵌入式开发中的C语言(上)【习题】
-4.7 嵌入式开发中的C语言(下)
--4.7 嵌入式开发中的C语言(下)【习题】
-E0.1 实验零 开发板的初步认识与工具链的安装
-E0.2 实验零 体验一个例程的编译与下载
-E0.3 实验零 编写第一个程序:点亮核心板LED
-E1 实验一 点灯秘籍
-5.1 ARM微控制器外设学习概述
-5.2.1 ARM微控制器外设:通讯
-5.2.2 ARM微控制器外设:异步串行通讯UART的原理(上)
--5.2.2 ARM微控制器外设:异步串行通讯UART的原理(上)
--5.2.2 ARM微控制器外设:异步串行通讯UART的原理(上)【习题】
-5.2.3 ARM微控制器外设:异步串行通讯UART的原理(下)
--5.2.3 ARM微控制器的外设:异步串行通讯UART的原理(下)
--5.2.3 ARM微控制器外设:异步串行通讯UART的原理(下)【习题】
-5.2.4 ARM微控制器外设:RS-232串口与USB虚拟串口
--5.2.4 ARM微控制器外设:RS-232串口与USB虚拟串口
-5.2.5 ARM微控制器外设:UART的寄存器编程(上)
--5.2.5 ARM微控制器外设:UART的寄存器编程(上)
-5.2.6 ARM微控制器外设:UART的寄存器编程(下)
--5.2.6 ARM微控制器外设:UART的寄存器编程(下)
--5.2.6 ARM微控制器外设:UART的寄存器编程(下)【习题】
-E2 实验二 UART编程实操
-5.3.1 ARM微控制器外设:IO的中断编程(上)
-5.3.2 ARM微控制器外设:IO的中断编程(下)
-5.4.1 ARM微控制器外设:定时器的原理
-5.4.2 ARM微控制器外设:定时器的编程
--5.4.2 ARM微控制器外设:定时器的编程【习题】
-E3 实验三 定时器中断编程实操
-5.5.1 ARM微控制器外设:PWM的原理
-5.5.2 ARM微控制器外设:PWM寄存器与编程
-5.5.3 ARM微控制器外设:PWM编程实例—电子音乐
--5.5.3 ARM微控制器外设:PWM编程实例—电子音乐
-E4 实验四 数码管显示编程实操
-5.6.1 ARM微控制器外设:SPI通讯简介
--5.6.1 ARM微控制器外设:SPI通讯简介【习题】
-5.6.2 ARM微控制器外设:SPI寄存器与编程
-5.6.3 ARM微控制器外设:SPI编程实例—OLED显示屏驱动
--5.6.3 ARM微控制器外设:SPI编程实例—OLED显示屏驱动
-5.7.1 ARM微控制器外设:I2C通讯简介
-5.7.2 ARM微控制器外设:I2C的通讯协议
-5.7.3 ARM微控制器外设:I2C寄存器与编程
--5.7.3 ARM微控制器外设:I2C寄存器与编程【习题】
-5.7.4 ARM微控制器外设:I2C编程实例—加速度传感器
--5.7.4 ARM微控制器外设:I2C编程实例—加速度传感器
-5.8.1 ARM微控制器外设:ADC简介
-5.8.2 ARM微控制器外设:ADC基础
-5.8.3 ARM微控制器外设:ADC寄存器与编程
-E5 实验五 ADC编程实操
-E6 挑战实验
--E6 挑战实验
-6.1 嵌入式系统的接口与设计
-6.2 嵌入式系统的实例