首页 > 应用与设计 > 电器 > Service Robots > 服务型机器人 > TI机器人系统学习套件(TI-RSLK) >

服务型机器人

最新课程

热门课程

TI-RSLK 模块 9 - 讲座视频 - SysTick 计时器 - PWM

大家好,我是 Jon Valvano。 在本模块中, 我们将讨论 SysTick 计时器。 SysTick 计时器是所有 ARM Cortex-M 都具有的 内置时钟。 我们将使用它来测量 运行时间或创建 软件延迟。 在这次的整个 课程中,您将 看到我们会在机器人中 频繁使用到它。 那么让我们开始吧。 那么,具体来说,我们 将在该模块中使用 该计时器来创建延迟, 或进行测量。 在后续实验中, 我们将使用该相同的 计时器来创建周期性 中断,以便我们能够 定期运行软件。 但我们将从使用 SysTick 实现时间延迟的简单 任务开始。 SysTick最基本的它有一个 24 位计数器。 它称为值,或 VAL, 它的宽度为 24 位。 它将以总线频率进行 递减 -- 因此该数字将以 每秒 4800 万次的 频率进行递减。 这一切过程的发生无需软件参与。 它是自动发生的。 我们的软件还将 设置另一个 24 位 常数,它称为 加载寄存器。 例如,如果您将加载 寄存器设置为 5, 将要发生的是, 计数器将进行 倒计数 -- 该值将进行 倒计数,5,4,3,2,1,0 -- 在达到 0 之后,它将 自动再次执行该过程 -- 5,4,3,2,1,0;5,4,3, 2,1,0 -- 不停地重复进行。 因此,如果您看到 加载寄存器的值 为 n,那么它其实是 一个模 n 加 1 计数器, 那么,让我们来 讨论一下软件 其实软件相当简单。 我们将把它 分为两个部分。 第一个部分 是初始化 -- 您将执行它一次。 那么,我们将看到, 仅有三个与 SysTick 相关联的寄存器。 控制寄存器 -- 它包含一些位, 我将在初始化 期间设置这些位。 具体而言, 由于我希望 它以 48MHz 的 频率进行计数, 因此我要把 源寄存器设置为 1。 由于我希望 它实际运行, 因此我要把这里的 使能位设置为 1, 把该位 0 设置为 1。 在这里,在实验 9 中, 我们还不需要中断, 因此我们要把 该位设置为 0。 您可以看到, 设置位 2、 声明位 0 和设置位 0 在这里,在将 5 写入 控制寄存器的初始化 代码中进行编码。 现在,控制寄存器中 还有另一个位,它称为 计数 -- 它是位 16 -- 我们 将在下一页中介绍。 但我们已经讨论了 其他两个寄存器。 再说一次,24 位计数器 本身位于该值寄存器中, 该 24 位常数重新加载值 位于加载寄存器中。 一种使用该计时器的 方法是向加载寄存器 全部写入 1。 再说一次,它是一个 24 位值。 因此,在您这么做之后, 它将变成一个模为 2 的 24 次方的计数器。 如果您看到,如果 我将 2 的 24 次方 乘以总线时钟的周期 -- 48MHz 的周期,即20.83 纳秒 -- 那么,我们将看到, 在使用该加载值 设置时,这个东西 将每 349 毫秒回滚重复 一次。 那么,换句换说, 我要说的是,加载值 是它开始执行的值。 这是我输入的 加载值。 20 纳秒之后, 它将递减, 20 纳秒之后, 它将递减。 然后它会一直运行下去, 直到它达到 3,2,1,0。 然后,在达到 0 之后, 它将重新回滚重复。 如果您愿意, 该整个周期 将花费 349 毫秒的时间。 那么这是它的 基本工作方式。 现在我们将通过两种方法 在该模块中使用它。 第一种方法与秒表类似。 某件事需要多长 时间才能发生? 那么,我有某个函数 -- 某个软件,我不知道 它的执行需要多长时间 -- 我需要测量 实际运行时间, 我可以使用 SysTick 计时器。 我再次使用了 该加载值 -- 该加载值,如果您还记得, 在前一张幻灯片中,它等于 FFFFFF 因此,它将对所有可能的 24 位值进行倒计数, 然后重新回滚重复。 那么,我将执行它的方法是, 在我感兴趣的函数执行之前, 我将捕获 计数器的值。 我将执行 该未知函数, 然后捕获第二个值, 并把这两者相减。 由于它在进行 倒计数,因此 我要用起始值 减去终止值。 例如,如果 我调用这个, 我得到数字 2,000 -- 它是介于 0 和 2 的 24 次方之间的某个随机数 -- 然后我再次调用它, 我得到 1,400,我知道 在这个时间和 那个时间之间 经历了 600 个 时钟周期。 因此我要把这两者 相减,我将得到 600。 我将知道,这意味着 600 乘以 20.83 纳秒, 那么,该测量, 如果您愿意, 具有 20 纳秒的 分辨率。 这意味着, 任何大于 20 纳秒的 差异 -- 任何 时间变化 -- 都将导致不同的计数。 因此,我能够以低至 20 纳秒的分辨率解析 经历的时间测量。 我曾提到过, 它需要经过 349 毫秒才会 发生回滚,只要 这里经历的时间 小于 349 毫秒,该系统 就能正常工作。 那么,这是我可以 经历的最大时间 -- 最大的可能值 是340毫秒。 如果您看看它, 将有 2 的 24 次方 -- 16,000,000 -- 个 互不相同的 可能测量值, 因此,有 2 的 24 次方个 我能够 加以区别的 不同测量值。 我们要将这 定义为 24 位 精度测量。 您会说,嘿,John, 这是怎么回事? 好的,这正是我执行 24 位减法的方法。 那么,让我在这里 执行一个示例, 如果起始值碰巧 是某个较小的数 -- 比如所它碰巧是 4 -- 然后它进行计数,1 次, 2 次,3 次,4 次, 5 次 -- FFFFFF -- 6 次 -- FFFFFE -- 这是 我的终止时间, 您已经知道答案了。 答案是 6,对吧? 1,2,3,4,5,6 -- 您知道答案将是 6。 但如果我获取起始值, 然后用它减去终止值, 我得到的 将是 FF0 0000 -- 又是这样 -- 1,2,3,4,5,6,对吧? 这是当我用起始值减去 终止值时将得到的结果。 但是,如果我丢弃 该测量值的顶部 8 位, 那么我将得到正确的答案。 因此,这里使用 24 位 掩码来结束它的神秘技巧 是一种执行 24 位减法的方法。 那么,这只是 24 位。 再说一次,这就是 我测量经历的时间的方法。 我可以使用它做的 另一件事是时间延迟。 现在,您应该记得, 控制寄存器中还有 另一个位, 它称为计数位 它碰巧在那里,在位 16 中。 它的有趣之处在于, 当它回滚时 -- 让我们在这里执行一个示例。 比如说 n 等于 让我们假设 n 等于 5。 好的,那么我将设置 n 等于 5。 那么,当我把 4 存储到 加载寄存器中时, 计数器将变为 -- 它将成为这里的 值计数器。 计数器将变为 4, 然后它将进行计数 -- 4,3,2,1,0。 事实上,只要 计数器从 1 变为 0,这就会设置 计数标志 现在,正如您知道的,它将回滚重复 并反复不断地进行计数。 但是,我在这里 要做的是,把我 希望等待的时间 设置到加载寄存器中。 我将减去 1,因为它会 在这里从该 1 递减为 0 然后我将清除 计数值 我将清除计数值, 通过写入 -- 我写入 计数器的任何值 都将清除计数。 然后我将等待 计数位被设置。 再说一次,只要 n 不是太小, 对于任何不大于 2 的 24 次方的值,这都会正常工作。 或者最大为 349 毫秒。 现在,如果您希望等待的 时间大于 349 毫秒,我将做的是, 我将把这个放在 另一个的内部 例如,如果我把 480,000 发送到 前一个函数中, 这里的函数 将等待 10 毫秒, 因为,再说一次, 如果我等待 48, 这将是 1 微秒。 如果我等待 48,000, 这将是 1 毫秒。 因此,如果我等待 480,000,这将是 10 毫秒。 好的,然后我使用该另一个 参数把它放入一个循环中。 现在,如果我调用 该参数 -- 比如, 使用数字 100-- 这里的函数 将等待 1 秒。 现在,它不是很高效。 它不是很高效,但它是 一种实现时间延迟的 简单方法。 总之,我们看到了 SysTick 具有 24 位, 此外,我们使用它实现了两种功能 -- 测量经历的时间 和创建延迟。 在本课程的稍后 部分中,我们将 使用它来创建中断,这将是 一种用于实现延迟的方法, 一种很高效的方法。 但到目前为止, 以这种方式 使用 SysTick 实际上非常 低效,因为它在等待, 它呆在那里,什么也没做。 但这对于实验 9 而言是可以的。 好的,祝您愉快! 218

大家好,我是 Jon Valvano。

在本模块中, 我们将讨论

SysTick 计时器。

SysTick 计时器是所有 ARM Cortex-M 都具有的

内置时钟。

我们将使用它来测量 运行时间或创建

软件延迟。

在这次的整个 课程中,您将

看到我们会在机器人中 频繁使用到它。

那么让我们开始吧。

那么,具体来说,我们 将在该模块中使用

该计时器来创建延迟, 或进行测量。

在后续实验中, 我们将使用该相同的

计时器来创建周期性 中断,以便我们能够

定期运行软件。

但我们将从使用 SysTick 实现时间延迟的简单

任务开始。

SysTick最基本的它有一个 24 位计数器。

它称为值,或 VAL, 它的宽度为 24 位。

它将以总线频率进行 递减 -- 因此该数字将以

每秒 4800 万次的 频率进行递减。

这一切过程的发生无需软件参与。

它是自动发生的。

我们的软件还将 设置另一个 24 位

常数,它称为 加载寄存器。

例如,如果您将加载 寄存器设置为 5,

将要发生的是, 计数器将进行

倒计数 -- 该值将进行 倒计数,5,4,3,2,1,0 --

在达到 0 之后,它将 自动再次执行该过程 --

5,4,3,2,1,0;5,4,3, 2,1,0 -- 不停地重复进行。

因此,如果您看到 加载寄存器的值

为 n,那么它其实是 一个模 n 加 1 计数器,

那么,让我们来 讨论一下软件

其实软件相当简单。

我们将把它 分为两个部分。

第一个部分 是初始化 --

您将执行它一次。

那么,我们将看到, 仅有三个与 SysTick

相关联的寄存器。

控制寄存器 -- 它包含一些位,

我将在初始化 期间设置这些位。

具体而言, 由于我希望

它以 48MHz 的 频率进行计数,

因此我要把 源寄存器设置为 1。

由于我希望 它实际运行,

因此我要把这里的 使能位设置为 1,

把该位 0 设置为 1。

在这里,在实验 9 中, 我们还不需要中断,

因此我们要把 该位设置为 0。

您可以看到, 设置位 2、

声明位 0 和设置位 0

在这里,在将 5 写入 控制寄存器的初始化

代码中进行编码。

现在,控制寄存器中 还有另一个位,它称为

计数 -- 它是位 16 -- 我们 将在下一页中介绍。

但我们已经讨论了 其他两个寄存器。

再说一次,24 位计数器 本身位于该值寄存器中,

该 24 位常数重新加载值 位于加载寄存器中。

一种使用该计时器的 方法是向加载寄存器

全部写入 1。

再说一次,它是一个 24 位值。

因此,在您这么做之后, 它将变成一个模为 2 的

24 次方的计数器。

如果您看到,如果 我将 2 的 24 次方

乘以总线时钟的周期 --

48MHz 的周期,即20.83 纳秒 --

那么,我们将看到, 在使用该加载值

设置时,这个东西 将每 349 毫秒回滚重复

一次。

那么,换句换说, 我要说的是,加载值

是它开始执行的值。

这是我输入的 加载值。

20 纳秒之后, 它将递减,

20 纳秒之后, 它将递减。

然后它会一直运行下去, 直到它达到 3,2,1,0。

然后,在达到 0 之后, 它将重新回滚重复。

如果您愿意, 该整个周期

将花费 349 毫秒的时间。

那么这是它的 基本工作方式。

现在我们将通过两种方法 在该模块中使用它。

第一种方法与秒表类似。

某件事需要多长 时间才能发生?

那么,我有某个函数 -- 某个软件,我不知道

它的执行需要多长时间 --

我需要测量 实际运行时间,

我可以使用 SysTick 计时器。

我再次使用了 该加载值 --

该加载值,如果您还记得, 在前一张幻灯片中,它等于

FFFFFF

因此,它将对所有可能的 24 位值进行倒计数,

然后重新回滚重复。

那么,我将执行它的方法是, 在我感兴趣的函数执行之前,

我将捕获 计数器的值。

我将执行 该未知函数,

然后捕获第二个值, 并把这两者相减。

由于它在进行 倒计数,因此

我要用起始值 减去终止值。

例如,如果 我调用这个,

我得到数字 2,000 --

它是介于 0 和 2 的 24 次方之间的某个随机数 --

然后我再次调用它, 我得到 1,400,我知道

在这个时间和 那个时间之间

经历了 600 个 时钟周期。

因此我要把这两者 相减,我将得到 600。

我将知道,这意味着 600 乘以 20.83 纳秒,

那么,该测量, 如果您愿意,

具有 20 纳秒的 分辨率。

这意味着, 任何大于

20 纳秒的

差异 -- 任何 时间变化 --

都将导致不同的计数。

因此,我能够以低至 20 纳秒的分辨率解析

经历的时间测量。

我曾提到过, 它需要经过

349 毫秒才会 发生回滚,只要

这里经历的时间 小于 349 毫秒,该系统

就能正常工作。

那么,这是我可以 经历的最大时间 --

最大的可能值 是340毫秒。

如果您看看它,

将有 2 的 24 次方 --

16,000,000 -- 个 互不相同的

可能测量值,

因此,有 2 的 24 次方个 我能够

加以区别的 不同测量值。

我们要将这 定义为 24 位

精度测量。

您会说,嘿,John, 这是怎么回事?

好的,这正是我执行 24 位减法的方法。

那么,让我在这里 执行一个示例,

如果起始值碰巧 是某个较小的数 --

比如所它碰巧是 4 --

然后它进行计数,1 次, 2 次,3 次,4 次,

5 次 --

FFFFFF -- 6 次 --

FFFFFE -- 这是 我的终止时间,

您已经知道答案了。

答案是 6,对吧?

1,2,3,4,5,6 -- 您知道答案将是 6。

但如果我获取起始值, 然后用它减去终止值,

我得到的 将是 FF0 0000 --

又是这样 --

1,2,3,4,5,6,对吧?

这是当我用起始值减去 终止值时将得到的结果。

但是,如果我丢弃 该测量值的顶部 8 位,

那么我将得到正确的答案。

因此,这里使用 24 位 掩码来结束它的神秘技巧

是一种执行 24 位减法的方法。

那么,这只是 24 位。

再说一次,这就是 我测量经历的时间的方法。

我可以使用它做的 另一件事是时间延迟。

现在,您应该记得, 控制寄存器中还有

另一个位, 它称为计数位

它碰巧在那里,在位 16 中。

它的有趣之处在于, 当它回滚时 --

让我们在这里执行一个示例。

比如说 n 等于

让我们假设 n 等于 5。

好的,那么我将设置 n 等于 5。

那么,当我把 4 存储到 加载寄存器中时,

计数器将变为 --

它将成为这里的 值计数器。

计数器将变为 4, 然后它将进行计数 --

4,3,2,1,0。

事实上,只要 计数器从 1

变为 0,这就会设置 计数标志

现在,正如您知道的,它将回滚重复 并反复不断地进行计数。

但是,我在这里 要做的是,把我

希望等待的时间 设置到加载寄存器中。

我将减去 1,因为它会 在这里从该 1 递减为

0

然后我将清除 计数值

我将清除计数值, 通过写入 -- 我写入

计数器的任何值 都将清除计数。

然后我将等待 计数位被设置。

再说一次,只要 n 不是太小,

对于任何不大于 2 的 24 次方的值,这都会正常工作。

或者最大为 349 毫秒。

现在,如果您希望等待的 时间大于 349 毫秒,我将做的是,

我将把这个放在 另一个的内部

例如,如果我把 480,000 发送到

前一个函数中, 这里的函数

将等待 10 毫秒, 因为,再说一次,

如果我等待 48, 这将是 1 微秒。

如果我等待 48,000, 这将是 1 毫秒。

因此,如果我等待 480,000,这将是 10 毫秒。

好的,然后我使用该另一个 参数把它放入一个循环中。

现在,如果我调用 该参数 -- 比如,

使用数字 100--

这里的函数 将等待 1 秒。

现在,它不是很高效。

它不是很高效,但它是 一种实现时间延迟的

简单方法。

总之,我们看到了 SysTick 具有 24 位,

此外,我们使用它实现了两种功能 --

测量经历的时间 和创建延迟。

在本课程的稍后 部分中,我们将

使用它来创建中断,这将是 一种用于实现延迟的方法,

一种很高效的方法。

但到目前为止, 以这种方式

使用 SysTick 实际上非常 低效,因为它在等待,

它呆在那里,什么也没做。

但这对于实验 9 而言是可以的。

好的,祝您愉快! 218

视频报错
手机看
扫码用手机观看
收藏本课程

相关下载

查看全部

视频简介

TI-RSLK 模块 9 - 讲座视频 - SysTick 计时器 - PWM

所属课程:TI机器人系统学习套件(TI-RSLK) 发布时间:2018.08.27 视频集数:69 本节视频时长:11:34
你将学习脉冲宽度调制(PWM)和占空比的概念。
已有7人参与了讨论去论坛跟帖交流
new
关闭广告