当前课程知识点:ARM微控制器与嵌入式系统 > 第五章 ARM微控制器的各种外设 > 5.7.4 ARM微控制器外设:I2C编程实例—加速度传感器 > 5.7.4 ARM微控制器外设:I2C编程实例—加速度传感器
各位同学大家好
我是清华大学工程物理系的曾鸣老师
欢迎大家继续回到我们
ARM微控制器与嵌入式系统的MOOC课堂
继续进行I2C同步串行通讯的
最后一个单元的学习
前面三个单元里
我们学习了它的基本原理
电气特性 通讯协议 数据帧
特别是以运动传感器或者加速度传感器
这样一种芯片作为靶子
学习了它的函数如何封装
如何编程把一个I2C接口给用起来
那么这个单元
我们用很短的时间来给讲讲
怎么把它玩起来
它能怎么玩
那么我们用的加速度传感器
这样一种芯片
它是一个典型的I2C的通讯接口
它是一个数字芯片
所以我们通过I2C接口可以对它进行读写
读它内部的寄存器
写它内部的寄存器
分别获得数据和对它进行配置
那么我们知道它接到了
PORTE的一个I2C引脚上
那么我要考一考大家
一个I2C这个芯片
我们真正把它用起来
怎么才能用好呢
或者怎么才能真正掌握它呢
我建议大家学一个东西
就从它的原理学起
不要丢掉它的物理本质
我们把它芯片手册打开
看看它的基本原理
如果这是一门时间拉的更长
时间更冗余的课我就会考一考大家
说如果你是一个芯片设计人员
或者说你是一个创意人员
你来做一种创意创新
你会用什么样的结构
来使加速度或者运动这样一种量
变成一个电学量可以被你采集
那么很多同学就脑袋一片空白
说曾老师你这个脑洞好大
怎么突然问这样一个问题
其实不是的
很多这样的传感器背后都有它的道理
比如说我们说加速度或者我们的运动
我们会想到什么呢
我们会想到加速度会反映成什么样
可测量的物理量那大家会想想想
想了很多
其实有一个中学物理学过很多的东西
就是弹簧振子
对吧 我们有胡克定律
所以一个弹簧振子
在一个这个加速度体系里头
它的位移代表了这个它的加速度
那么有了一个弹簧振子的概念
也就说如果我们有一个类似于
弹簧振子的结构
我们可以通过这些振子的位置
来反映加速度大小
那如果我们有了几个振子
比如说像这样一张芯片的示意图里几个板
那大家能不能产生联想
它怎么变成电学量的
有的同学在这个时候就开始开窍了
就是说板跟板嘛
那我电容啊
这个面积一定距离变电容大小就变
这就慢慢就有道理了
所以我们加速度传感器芯片的高度抽象
它的内部结构是由Mask工艺实现的
用硅实现的
但是它的高度抽象就是这样一个
带有阻尼的这样的平行板
而这种板的位移变成了
随加速度可调的电容
这就是它的基本原理
所以当我们有一个可调电容的时候
我们可以通过这些电容值改变
带来在一定电压上它的电荷量的改变
或者一定电荷量上它电压的改变
这样一些电学量的关系
来实现对于加速度的电学表征
所以我们测量这些电压或者电荷量
我们就能实现对于加速度测量
如果有朝一日大家会深入的
进行电子学研究时候你会发现
你对这种电学量的测量的精度
就决定了你对于加速度测量的精度
和动态范围
所以我们就会理解我们能买到不同的
测量精度和动态范围的加速度传感器
这是第一个物理概念
第二个物理概念是我们使用了
是一种三轴加速度传感器
也就是我们测量的是沿芯片的
这个切向反向xyz三个轴的加速度的分量
那么实际上我们真正在物理世界里头
我们最最常见的加速度是什么呢
其实并不是我们运动起来加速度
而是无所不在的重力加速度g对吧
所以我们一个芯片放置的时候
总在某一个轴的方向上
会有一个g的加速度是可以测量到的
那么实际上我们这样一种芯片
大家另外一个联想是
它不仅是一个运动传感器
它也是一个姿态传感器
当我们以一个θ角放置这个芯片的时候
其实它沿这三个轴就会分别产生
比如说在两个轴上产生sinθ和cosθ的
重力加速度g的分量
所以我们对它进行三角函数的
拟合或者查表
其实是可以进行它所放置的姿态测量的
所以同样一个传感器
我在这个单元里
想给大家讲的是拓宽拓宽思路
理解它的原理就能领会
它一些额外的一些应用
放在智能车比赛里
它可以测加速度也可以测车的姿态
然后放在一些别的产业应用里
可以产生一些原来大家没有想到的idea
比如说精密仪器在运输过程当中
是否发生过倾覆
是否发生过颠簸等等等这样一些应用
那么我们这样一个芯片的电路抽象图
就是芯片手册里能够给大家这样一张图
我们在芯片手册第三页就能看到
它不仅是这样一种类似电容的传感器
内部还集成了
模拟电路 运算放大器 ADC采样
最后以I2C的方式能够为我们读写
那么我们对它进行读写
我们会发现我们有这么一个芯片
它的引脚、封装 它的电气特性
其实都给大家了
大家顺着一页一页
翻这个芯片手册就能翻到
那么在这个芯片手册里
我们如果仔细地阅读芯片手册呢
还能获得很多有用的信息
比如说我们用的这个型号
跟它的姊妹型号比
它的这个加速度测量的精度
是不是有点差异
那么又比方说我们都说I2C通讯的时候
每个设备都有它自己唯一的七比特地址
那我们现在板上这个芯片的
七比特地址是什么呢
曾老师刚才讲了一些函数
其实我没有提这个地址
这个地址到哪去找
我应该用哪个地址
才能跟这个芯片通讯上呢
都在我们的芯片手册里
大家就会发现在这张表格里的
最后一行写了我们这个芯片的地址
要么就是0XEC
要么就是0XED
这个芯片有一个引脚
这个引脚接高电平或者低电平
使这个芯片可以配置为两个不同的地址
那么我们在一个I2C总线里头
也就最多能接两个这样的芯片
他们彼此地址不一样
那么大家这个时候
再回过头去看看我们的电路图
这个芯片它的这个引脚
究竟是接了高电平还是接了低电平
我们刚才上节课讲的函数
对于我们板子上的加速度传感器
应该用EC这个地址访问
还是应该用ED这个地址访问
这是大家自己应该回答的问题
那么大家看看我们芯片手册上
也会给出这样一个I2C的通讯时序图
这种时序图跟我刚才的画法不一样
大家静下心来看一看
是不是跟我们刚才讲
I2C的基本概念的时候
时序图在本质上其实是一样的
我们编的函数是不是能跟它兼容
能够正确地完成通讯
这都是大家应该作为设计者的角色
应该琢磨的事情
然后最后一个要讲的内容呢
是这样一个芯片内部的寄存器表
你刚才讲这个芯片内部有寄存器
上节课也讲了
对它的内部的寄存器知道寄存器的地址
如何做个写操作
知道寄存器地址如何做个读操作
我们来看看有哪些寄存器
我们会发现这样一张表
最最简单的使用
只想知道加速度的值
我们要涉及到哪几个东西
就是红框里的这两组
最下面关于这个2A这个地址的
这个寄存器是一个控制寄存器
是配置我们这个加速度传感器开始工作
然后上面有这么几个寄存器呢
16比特 16比特
也就是两个寄存器一组呢
分别是xyz三个轴的加速度的值
所以我们对于这样一个
加速度传感器的编程
在上节课函数封装的基础上抽象下来
就是这个控制寄存器的
若干个比特我们要正确的配置它
进入一个正确的工作模式
也就是要对它进行一次写操作
对于0X2A这个子地址写操作
把它配置到工作模式
接着我们要对xyz三个轴的寄存器
分别进行读取
读取加速度这个测量芯片
当前测到的xyz轴的加速度的值
那么封装成函数就是这两句话
我们对我们这样一个
加速度传感器的芯片
进行一次寄存器的写操作
从时序上来讲
我给大家展开回忆
先要访问EC或者ED那个七比特的地址
在I2C总线上锁定是访问这个芯片
接着要写入2A这样一个
寄存器的子地址再写入01
这样一个我们要给这个寄存器赋的值
三个周期 三个时序
完成一次寄存器的配置
使这个芯片开始工作
然后我们以后
可以通过这个芯片的读取函数
每次来读取其中某一个轴的加速度的值
那么依次也是写入芯片的地址EC或者ED
然后写入这个寄存器的子地址
进行一下restart
再次写入这个芯片子地址读取
这个寄存器刚才我们要的这个地址的值
大家回忆一下这个时序
周而复始我们可以以不同的速度
不同的频率 时间间隔
去读这些加速度的值
从而获得我们这样一块开发板
它的姿态 它的运动的状态
然后来实现一些更加有趣的功能
比如以前有同学用这个板子
来测试老人有没有摔倒
有同学用这个板子来玩体感游戏晃一下
这个小鸟就飞一下
或者人物就跳一下
或者用这个板子的摇晃来控制一个赛车
这都是大家可以把它
风风火火的玩起来创意的内容
那么学完了这个内容
我们体会一下我们通过I2C这样一种
所谓的总线同步串行协议
扩充了一个我们KL25这样一种
ARM微控制器
不具有的加速度测量的功能
使我们能够测量加速度
以此类推在这个I2C总线上
在一个单一的接口上
我们以总线的方式
还能扩充很多别的外设模块
所以它称为Inter IC Bus
也就是I2C
也就是我们这个单元所学习的内容
那么大家可以在日后灵活的把I2C用起来
让我们这个板子
让我们所设计的系统 变得功能更加丰富
而在这个单元里
希望大家消化我刚才讲的内容
把你们的加速度传感器给玩起来吧
-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 嵌入式系统的实例