- 课程目录
- 相关资源
- 课程笔记
大家好,我是 John Valvano,在本模块中,
我们会将另一种工具添加到您的嵌入式系统工具箱中,
我们要使用的工具是输入捕获。
我们已经看到,定时器很重要,
我们将会在本模块中将其作为
一种测量的方法。
具体来说,我们要将其用于周期测量。
我们将使用码盘,
就是这个东西,附着在电机的侧面上,
当利用该码盘进行测量时,您将得到
此处的波形。
码盘波形的频率和周期
码盘波形的频率和周期
将直接反映电机的转速。
因此在本模块中,我们将实际测量
轮子的转速,那么让我们开始吧。
我们已经看到,定时器非常重要,
我们看过的其他两个定时器应用场景
是周期性中断,以及
脉宽调制输出。
在这两个应用中,
我们使用了包含该 16 位常数的常数寄存器
和该 16 位定时器,
这里是计数器。
在这两个应用中,为了使其工作,
我们取一个常数,并将其加载到计数器中。
但是对于输入捕获,
其工作方式有所不同。
另一个不同之处是,我们看到对于脉宽调制,
当我们希望生成 PWM 输出时,
我们会使用模块的子模块之一,
并使用该引脚作为输出。
但在本应用中,即输入捕获中,
我们实际上将使用该引脚作为输入。
在本视频中,我将使用模块 0 的子模块 0
在端口 7.3 上测量周期,
然后在本实验中,您将设置这两个引脚来测量周期 --
一个用于左轮,一个用于右轮。
精度测量将是 16 位,
因为我采用了16 位计数器,
周期和预分频将一起决定
我的输入捕获测量的分辨率。
一会儿我们将对其进行详细介绍。
我们将使用系统模块时钟 --
在本课程中,它以12MHz 的频率运行。
好,那么让我们开始吧。
现在,这是一个非常繁忙的寄存器,
顺便说一下,这是我们第三次看到它了。
我们在前面的视频中看到,这里是时钟选择,
这里的两位一起选择预分频。
这里是实际计数器值,
那里是计数器,这里是常数。
正如我说过的,在输入捕获中,在发生外部事件时,
计数器值会被加载 --
该 16 位计数器值会被加载到比较寄存器中。
这里的寄存器相当复杂,
因此如果您不打开数据手册,您无法
顺利地完成本次课程。
例如,您必须要做的是,
当您在我的启动代码
初始化过程中看到一行像这样的 C 语言代码时,
我希望您以二进制方式
把它写出来。
然后在这里对它进行整理,
确定将哪些位分配到哪一个,
在这里对它进行整理,并弄清
我为什么将 CM 设置为 1 并将 CIS 设置为 0,
这个,我要告诉您,这是输入捕获模式,
因此这个相当明显。
我要在这里,在第 8 位中将这设置为输入捕获模式。
我还希望您注意这一位,
这是触发器标志位,该寄存器中的 CCIFG
即第 0 位是中断触发器。
它将发出中断请求。
这里这一位显然是与该中断
关联的中断使能位。
我们将在下一张幻灯片中讨论其他位。
再说一次,不要害怕打开这些
MSP432 的数据手册,然后逐位查看
每个寄存器,以确定那里应该是什么值。
正如我提到过的,我们将使用系统
模块时钟,它将通过该时钟选择器提供时钟信号,
然后我们决定在设计中使用
这里的预分频 ID,
以及 TAIDEX 中的另一个分频,
这样,
您使用系统模块时钟的周期,
以及 ID 的预分频值,还有这里的定时器预分频,
可以计算得到一个数字。
它将是一个时间,实际上是我们的
时间分辨率。
换句话说,如果我测量
从一个边沿到另一个边沿的时间,我测量该时间,
分辨率表示最小时间变化。
因此,如果我从 T1 转到 T2 --
这是这里的周期的时间。
如果我将 T1 定义为这个波的周期,
将 T2 定义为那个波的周期,
分辨率是我的系统可以检测到的最小
周期变化。
因此,如果您查看这里的差值,它显然
是将我的计数器的
时钟周期。
但它是一种折衷的选择,
因为我有一个 16 位计数器,
因为我有一个 16 位计数器,
因此我可以测量的值的范围也是
该分辨率的函数,
我们稍后会看到这一点。
请记住,为了使它能够工作,
我们必须将输入连接到
这些定时器之一。
该输入的命名方式是,这(x)代表模块,
这(y)代表子模块。
有四个模块和五个子模块,
有四个模块和五个子模块,
都具有输入功能,因此我们有
多达 20 个可用于进行输入捕获的引脚。
这说明这个功能的重要性。
好,那么在这里,我们将选择
边沿,也就是 CM。
我将选择上升沿,
在这里,-- 上升沿,就在这里。
我要在输入的波形上进行捕获 --
那么问题是,我需要针对哪个事件进行捕获?
我将在外部器件上进行捕获。
这里是一个同步机,
我将进入捕获模式,使能中断。
再说一次,正如我说过的,该寄存器的第 0 位
将由硬件进行设置,
您将看到,将在软件中对其进行
清除或确认。
这是初始化的过程,
我们要令定时器停止,
然后设置时钟和预分频,
我们将设置上升沿捕获,并对其进行中断使能,
我们将在嵌套矢量中断控制器中设置
优先级,
再启用中断控制器,
然后我们要让定时器开始运行。
在一切都初始化之后,
我们要开启全局中断。
这里是一个示例。
我要测量这个电机的周期,
我在这里有一个码盘,
这是我的码盘。
那么,如果您希望搭建您自己的码盘,
可以使用这样的耦合器进行搭建。
那么,该波形 V2 产生了一个
方波,它是 --
它的周期是轮子转一圈
所需时间的函数,很显然,它是我的
轮子上槽的数量的函数。
因此,我要再次将其连接到
模块 0 子模块 0,它是端口 P7.3。
这是初始化的过程,
我们讨论了这里的常见问题。
该引脚是捕获输入,
它使用了引脚复用功能,
是复用功能之一。
我要将其设置为输入捕获定时器模式。
我将停止定时器。
我们以前曾讨论过这些位。
我要设置系统模块时钟,进行 1 分频,
我们将进行捕获。
我们将 -- 在上升沿,
我们将对输入进行捕获。
我们将使能中断,然后完成预分频
并将优先级设置为 2。
这里不需要很高的优先级,
因为实际的测量发生在硬件中,
因此,如果输入 --
升高,这里的时间
会锁存到常数寄存器。
因此,如果存在延迟,并且我
实际上以一定的延迟运行中断服务例程,
然后我测量该时间,那么这里的延迟
实际上无关紧要。
它只需足够短,以便我不会错过
下一个,因此在发生该下一个中断时,
我会再次测量它。
因此,我可以使其成为具有中等优先级的中断。
在我完成之后,我将启动这一切,
然后让计数器以向上模式进行计数,
计数器工作在向上计数模式。
那么,当中断发生时 --
那么让我们在这里,放大来看端口 3 (口误)--
端口 7.3。
这是输入捕获引脚。
这只是演示一个示例。
这里是我的计数器,
它正在计数,这是预期的行为。
然后,在边沿上,
它将获取该时刻计数器中的值,
并将其存入常数寄存器。
这就是捕获的含义。
然后它将置位中断标志位,
并导致中断。
那么我在这里可以做的是,在中断服务例程中,
中断将被认领,
这将导致中断标志位清除。
这仍然是该寄存器的第 0 位。
现在,我要做的是测量该中断
所发生的具体时间,
然后,我要将它减去 --
从其中减去前一个中断的时间。
由于它是递增计数器,
因此这两个时间之间的差值将是所选时钟
对应的周期。
那么,如果我 -- 在前一个例程中,我没有预分频,
因此这里的该变量的单位
将是系统模块时钟也就是 83.33 纳秒。
因此这将是它的分辨率,
因为时钟在 1 分频,
然后我将开启全局中断
以便响应下一个中断。
那么,本节内容就到此结束了。
您可能会说,嘿,John,定时器溢出时会发生什么情况?
有一点很重要,那就是
我将这个变量定义为无符号 16 位数字,
因为计数器值也是无符号 16 位,
因此当它执行该减法时,
它是无符号 16 位减法。
因此,在本例中,将存在确切的 --
在这里的示例代码中,它将是
确切的 375 个周期,具体到
本例为 31 微秒。
我在第一个中断中读取它一次,
读到的值是 FF01,然后在下一个中断,
我读到 78。
由于它是无符号 16 位减法,因此该差值
会是正常的 375。
现在,正如您知道的,分辨率和范围以及
精度都是相关的,因此这里一个
非常简单的等式是,我可以
测量的最大周期将等于
2^16 乘以测量的分辨率,
也就是所选时钟的周期。
因此,在本例中,我使用系统模块时钟,
没有分频,它可以测量最高为 5.4 毫秒的
任何周期。
如果测量的时间超过 5.4 毫秒,
将发生怪异的事情,您不会得到正确的结果。
再说一次,每个边沿都将发生中断。
总结一下,我们使用了输入捕获。
我们将一个引脚
连接到子模块之一,
然后我们对其进行设置,以便边沿出现时,
时间值会加载到该定时器中。
它的周期 --
所选时钟的周期
将决定测量的分辨率。
好,这就是输入捕获的基本思想,
输入捕获是一个很强大的工具,
因为在它允许我们
执行 16 位测量。
在下一个视频中,我们将具体讨论我如何
监控或处理机器人套件上的
码盘。
好的,祝您学得开心。
课程介绍
共计3课时,30分17秒
猜你喜欢
换一换
推荐帖子
- 堆栈指针寄存器 SP 详解
- 堆栈是一种具有“后进先出”(LIFO---Last In First Out)特殊访问属性的存储结构。堆栈一般使用RAM 物理资源作为存储体,再加上LIFO 访问接口实现。 堆栈的实现方法: &...
- Jacktang DSP 与 ARM 处理器
- 【米尔-TI AM62x开发板-试用评测】5.串口通信及网络测试
- # 【米尔-TI AM62x开发板-试用评测】5.串口通信及网络测试 因为 **MYD-6231** 板卡的图像化表现实在是差强人意……只能转而测试其他方向了。今天测试的是网络部分。 由于回老家,板子离路由器的位置太远,所以首先用串口连接,开启 **WiFi** 之后,再用 **SSH** 连接。 ## 串口通信 **COMTransmit** 是一款串口调试助手。以下是它的一些主要特性:...
- paope TI技术论坛
- LM3S1911如何读P口
- LM3S1911如何读P口,就是如何把P口,比如PF口的状态读到一个字符变量,初学,请各位不吝赐教,谢谢,在线等...
- yuanyc5877 微控制器 MCU
- DSP flash被锁
- 由于程序问题,程序写入了密码区,导致flash被锁然后查编码,解码刚开始两块板子都解码成功,但是在擦除是又被锁了一块板子解了两次终于擦除成功但另外一块再解码,擦除到一半又被锁又解码,擦除到一半被锁现在解码都解不了了求助高手是什么原因,两个板子都是一样到,密码也是一样到,之前都解开过 擦除的时候怎么会被锁呢,还锁得这么彻底啊。。。 [ 本帖最后由 morning206 于 2012-5-10 1...
- morning206 DSP 与 ARM 处理器