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

服务型机器人

最新课程

热门课程

TI-RSLK 模块 13 - 讲座视频 - 脉宽调制

大家好,我是 John Valvano, 在本视频中, 让我们讨论定时器。 时间是嵌入式系统 的重要参数, 我们将看到,在本课程中, 我们实际上要在三件 事情中使用时间。 在本视频中,我们 将讨论如何把它们 用于周期性中断, 换句话说, 定期执行一段软件指令。 在码盘模块中,我们将 使用定时器作为输入 来测量周期或频率。 这将告诉我们电机的 旋转速度有多快。 然后,在与该模块 关联的实验中, 我们将使用定时器 作为输出来生成 脉宽调制输出(PWM)。 您可以在这里的图中看到, 定时器是如此重要,以至于 处理器中有很多定时器。 它们分为两级。 第一级是模块,那么我们 有一、二、三、四个模块。 第二级是子模块, 我们将看到,每个 模块具有多个子模块。 好,让我们继续。 请注意,定时器 类似于 Systick, 但定时器的模式 和配置方法远远 多于 Systick。 请注意,它之所以 类似于 Systick, 是因为它有这里的 常量,并且它 还有那里的 计数器值。 然后,如果您愿意, 可以把该常量 加载到计数器中。 它们的不同之处有很多, 其中一个不同之处是它 只有16 位宽, 所以这里的定时器 A 上的 定时器只有 16 位宽。 正如我说过的,我们 将在整个课程中使用它。 我们将在码盘的实验中 把它用于输入, 在本实验中把它用于输出, 并且我们将在本视频中 把它用于周期性中断。 现在,为了简化问题, 我们将选择系统模块时钟(SMCLK), 它的频率是总线时钟除以 4, 因此我们在本章中执行的所有操作 -- 或者我们在机器人中执行的所有操作 将具有设置为 12MHz 的 SMCLK 时钟。 因此,我们的所有时钟分辨率, 是 1/12MHz, 也就是大约83 纳秒。 好,正如我说过的, 这里有大量的寄存器。 它比 Systick 更复杂。 让我们为您指出其中的几点。 首先是这里的计数器本身, 您可以看到计数器。 它是一个 16 位计数器。 我们将看到,我们可以 向上计数或向下计数, 这就是我们的计数器。 这些全部是常量寄存器。 这些是常量。 我们可以看出这是一整个模块 -- 在本例中,我们可以 看到这是模块 0 -- 以及所有子模块。 对于每个模块,有 五个关联的引脚, 但对于每个模块, 实际上有七个 关联的子模块。 我们将看到其中有很多位。 我们将看到其中有很多位。 我们将看到其中有很多位。 在本章中,我们将看到这里的触发位, 这就是触发位。 这将 -- 换句话说, 该位会被置为 1 , 从而导致我们在本章中 所看到的中断。 还有与特定的子模块 0 中断 相关联的 ARM 位, 还有与特定的子模块 0 中断 相关联的 ARM 位, 我们将看到 时钟选择位。 另外当我们指定设备时, 将看到这里的其他位。 另外当我们指定设备时, 将看到这里的其他位。 现在,当我们转到下一个模块时, 将讨论这些引脚,但在此模块中, 我们只讨论上面这些引脚。 好,让我们开始吧。 首先,我们将通过时钟子模块 来选择定时器的时钟。 首先,我们将通过时钟子模块 来选择定时器的时钟。 我们要用的是 12MHz 的时钟, 设置它的方法是,设置 这里的 TA Select , 即定时器 A 时钟选择寄存器为 10, 以选择该 12MHz 时钟。 下面我们要做的是, 在我们选择 12MHz 时钟之后, 我们现在可以使它运行得更慢,因为 如果我们以更慢的速度进行计数, 我们可以计量更长的时间。 因此,最基本的取舍关系存在于 时钟分辨率 -- 也就是定时器输入/输出或者周期性 中断时可以设置的最小时间 -- 也就是定时器输入/输出或者周期性 中断时可以设置的最小时间 -- 和计时范围,也就是最大计时时间之间。 这实际上很容易看出来, 这是一个 16 位计数器, 最大计数值是 65535 。 那么,我们将看到, 选择这里的预分频、 ID 和 TAIDEX 寄存器位, 允许我们实现时钟分辨率 和最大计时范围的折衷, 允许我们实现时钟分辨率 和最大计时范围的折衷, 无论是作为输入进行测量、作为输出, 或产生周期性中断。 因此,举例来说, 如果我想在那里产生 500KHz 的时钟, 那么我可以做下面几件事情。 我可以设置 ID 位,将时钟 除以 4 进行预分频, 然后选择这里(TAIDEX)的预分频值为 5。 现在,我将采用我的 1/12MHz 时钟, 进行 4 预分频和 6 预分频, 这将生成在我下面的示例中 使用的 2 us 分辨率。 那么,这就是该折衷的过程。 现在,我们有许多计数模式。 我们将在本视频中使用的是 向上计数模式。基本来说, 计数器将向上计数,0,1,2,3。 当它达到该溢出值, 也就是这里的结束值之后, 它将重新回到 0、1、2、3。 因此您现在可以看到,如果 我把该常量设置为 n , 那么就设置了一个触发器, 这里就是我的触发器。 当计数值归零时,它会设置 触发器,因此我们可以看到, 在采用我们前一张幻灯片 所设置的预分频情况下, 在采用我们前一张幻灯片 所设置的预分频情况下, 2 微秒乘以 (n+1), 这将是该置位信号的周期, 或是中断的周期。 很显然,我们可以看到 n 是一个 16 位数字, 因此,这再次说明了时间分辨率与 最大中断时间间隔的比率。 在下一个视频中,我们 将使用向上/向下模式, 并使用其他这些输出位, 但在本视频中, 我们仅会生成一个周期性控制中断。 下面是产生周期性中断的步骤。 下面是产生周期性中断的步骤。 我们必须选择一个时钟, 并且必须选择一个预分频。 正如我在示例中说过的, 我将选择 500kHz、2 微秒 周期的预分频。 我需要对中断进行使能, 我将使能 TA0CCR0 的中断。 然后,我把这里的值 设置成任何周期减 1, 其中周期乘以 2 微秒是 我想要设置的中断周期。 其中周期乘以 2 微秒是 我想要设置的中断周期。 其中周期乘以 2 微秒是 我想要设置的中断周期。 现在,它是一个中断, 因此它具有优先级。 我们将设置嵌套向量中断优先级寄存器。 我们将设置嵌套向量中断优先级寄存器。 还有一个步骤, 我们必须在嵌套向量中断 控制器中开启该中断, 我们必须在嵌套向量中断 控制器中开启该中断, 我们要开启该中断。 在所有初始化完成之后, 我们要在处理器中, 在 primask 中设置 i=0, 这是在 primask 中, 它是处理器中的一个寄存器, 在 C 语言中,我们通过调用 该函数 EnableInterrupts 来执行它。 但要再次强调的是,这个操作 是在所有初始化完成之后。 但要再次强调的是,这个操作 是在所有初始化完成之后。 这里是中断向量表, 正如我说过的, 我们将使用定时器中断, 共有四个定时器模块, 其中每个定时器模块有七个子模块, 因此您在 MSP432 上 可以有多达 28 个 不同的周期性中断。 我们只是将执行其中的一个, 我将使用定时器 2 的子模块 0, 下面将对它进行说明, 如果您查看该文件中的代码, 您将看到中断服务例程的标准定义。 您将看到中断服务例程的标准定义。 您还可以看到,对于这个特定中断, 这是定义中断优先级的 三个 bit 所在的位置。 它位于 NVIC_IPR3 寄存器的 7、6 和 5 中, 它是第 12 个中断 -- 我是说 IRQ 12 和中断 28。 因此,我们一会儿将在 代码中看到这个 12。 这里是实际的代码, 这是摘取出来的部分代码, 因此您看到, 它实际上具有一个函数指针。 这个 32 位的变量指向一个 用户函数,该函数以一个函数返回值结束, 然后,当我们调用该函数时, 我们将把这里的用户代码传递过去。 我们将传递该周期, 正如我在前一张幻灯片中所说的, 该周期将具有 2 微秒的单位。 我使这一切工作的方法是, 设置 SMCLK 为 12MHz 时钟, 并在那里选择 4 预分频, 在这里选择 6 预分频, 这将生成我的 2 微秒周期。 之前说过,我将使用向上计数模式, 因此我要在这里将定时器设置为 以向上计数模式运行。 我将 -- 周期性中断是另一个名称 -- 使用比较模式。 我将 -- 周期性中断是另一个名称 -- 使用比较模式。 我将 -- 周期性中断是另一个名称 -- 使用比较模式。 在比较模式下,换句话说, 当计数器达到这里的值之后, 它会把重载标志位置 0 并继续计数。 这里是中断优先级寄存器 3 的位 7-5 , 这里是中断优先级寄存器 3 的位 7-5 , 它将设置中断优先级, 我告诉过您它是中断 12。 我通过设置嵌套向量中断控制器 的设置位 12 来使能该中断。 我通过设置嵌套向量中断控制器 的设置位 12 来使能该中断。 正如我说过的,我们要 首先初始化所有设备,然后再 启用中断。 这是中断服务例程 看起来的样子。 您应该记得, 对于 Systick, 引发 Systick 的标志 在 Systick 中断运行时 自动清除。 而对于定时器来说不是这样。 这里是我们说过的触发标志位, 它位于 CCTL 的位 0 中。 这是导致该中断发生的标志位, 因此为了能识别该中断, 需要将该标志位清除, 我将在这里清除该标志位。 然后,我将调用本例中特定的用户函数。 然后,我将调用本例中特定的用户函数。 然后,我将调用本例中特定的用户函数。 现在,这是定时器 A2 子模块 0。 对于实验,您必须做的是, 在定时器 A 子模块 0 上 创建一个周期性中断 -- 我是说定时器 A0 子模块 0。 因此,有几项 内容必须改变。 在这里,所有您 看到 2 的位置 -- 它们必须变为 0。 在这里,这是 中断 12 -- 这 必须变为中断 10。 在这里,这是 中断优先级 3 寄存器 位 7、6、5 -- 它必须是中断 优先级 2 寄存器。 这里的位,23、22 和 21。 这里的位,23、22 和 21。 这些是基本的差异。 除此之外,这全部 四个模块具有非常 类似的工作方式。 总之,我们讨论了 定时器,它具有输入、输出功能和 周期性中断。 本节中我们特别讨论了使用定时器 来创建其它周期性运行的线程。 来创建其它周期性运行的线程。 正如我提到过的,您的 系统上有四个定时器 -- 定时器 A0、A1、A2、A3。 在本视频中的代码向您展示了 如何控制定时器 A1, 在本视频中的代码向您展示了 如何使用定时器 A1, 您的任务是使用定时器 A0 , 并根据需要使用定时器 A2 和 A3。 希望您喜欢本实验。 在下一个视频中, 我们将扩展定时器的功能, 以生成脉宽调制输出。 好,希望您喜欢本次实验。 256

大家好,我是 John Valvano, 在本视频中,

让我们讨论定时器。

时间是嵌入式系统 的重要参数,

我们将看到,在本课程中,

我们实际上要在三件 事情中使用时间。

在本视频中,我们 将讨论如何把它们

用于周期性中断, 换句话说,

定期执行一段软件指令。

在码盘模块中,我们将 使用定时器作为输入

来测量周期或频率。

这将告诉我们电机的 旋转速度有多快。

然后,在与该模块 关联的实验中,

我们将使用定时器 作为输出来生成

脉宽调制输出(PWM)。

您可以在这里的图中看到,

定时器是如此重要,以至于 处理器中有很多定时器。

它们分为两级。

第一级是模块,那么我们 有一、二、三、四个模块。

第二级是子模块, 我们将看到,每个

模块具有多个子模块。

好,让我们继续。

请注意,定时器 类似于 Systick,

但定时器的模式 和配置方法远远

多于 Systick。

请注意,它之所以 类似于 Systick,

是因为它有这里的 常量,并且它

还有那里的 计数器值。

然后,如果您愿意, 可以把该常量

加载到计数器中。

它们的不同之处有很多,

其中一个不同之处是它 只有16 位宽,

所以这里的定时器 A 上的 定时器只有 16 位宽。

正如我说过的,我们 将在整个课程中使用它。

我们将在码盘的实验中 把它用于输入,

在本实验中把它用于输出,

并且我们将在本视频中

把它用于周期性中断。

现在,为了简化问题,

我们将选择系统模块时钟(SMCLK),

它的频率是总线时钟除以 4,

因此我们在本章中执行的所有操作 --

或者我们在机器人中执行的所有操作

将具有设置为 12MHz 的 SMCLK 时钟。

因此,我们的所有时钟分辨率,

是 1/12MHz,

也就是大约83 纳秒。

好,正如我说过的, 这里有大量的寄存器。

它比 Systick 更复杂。

让我们为您指出其中的几点。

首先是这里的计数器本身,

您可以看到计数器。

它是一个 16 位计数器。

我们将看到,我们可以 向上计数或向下计数,

这就是我们的计数器。

这些全部是常量寄存器。

这些是常量。

我们可以看出这是一整个模块 --

在本例中,我们可以 看到这是模块 0 --

以及所有子模块。

对于每个模块,有 五个关联的引脚,

但对于每个模块, 实际上有七个

关联的子模块。

我们将看到其中有很多位。

我们将看到其中有很多位。

我们将看到其中有很多位。

在本章中,我们将看到这里的触发位,

这就是触发位。

这将 -- 换句话说, 该位会被置为 1 ,

从而导致我们在本章中

所看到的中断。

还有与特定的子模块 0 中断 相关联的 ARM 位,

还有与特定的子模块 0 中断 相关联的 ARM 位,

我们将看到 时钟选择位。

另外当我们指定设备时, 将看到这里的其他位。

另外当我们指定设备时, 将看到这里的其他位。

现在,当我们转到下一个模块时,

将讨论这些引脚,但在此模块中,

我们只讨论上面这些引脚。

好,让我们开始吧。

首先,我们将通过时钟子模块 来选择定时器的时钟。

首先,我们将通过时钟子模块 来选择定时器的时钟。

我们要用的是 12MHz 的时钟,

设置它的方法是,设置 这里的 TA Select ,

即定时器 A 时钟选择寄存器为 10,

以选择该 12MHz 时钟。

下面我们要做的是,

在我们选择 12MHz 时钟之后,

我们现在可以使它运行得更慢,因为 如果我们以更慢的速度进行计数,

我们可以计量更长的时间。

因此,最基本的取舍关系存在于

时钟分辨率 --

也就是定时器输入/输出或者周期性 中断时可以设置的最小时间 --

也就是定时器输入/输出或者周期性 中断时可以设置的最小时间 --

和计时范围,也就是最大计时时间之间。

这实际上很容易看出来,

这是一个 16 位计数器, 最大计数值是 65535 。

那么,我们将看到, 选择这里的预分频、

ID 和 TAIDEX 寄存器位,

允许我们实现时钟分辨率 和最大计时范围的折衷,

允许我们实现时钟分辨率 和最大计时范围的折衷,

无论是作为输入进行测量、作为输出,

或产生周期性中断。

因此,举例来说,

如果我想在那里产生 500KHz 的时钟,

那么我可以做下面几件事情。

我可以设置 ID 位,将时钟 除以 4 进行预分频,

然后选择这里(TAIDEX)的预分频值为 5。

现在,我将采用我的 1/12MHz 时钟,

进行 4 预分频和 6 预分频,

这将生成在我下面的示例中

使用的 2 us 分辨率。

那么,这就是该折衷的过程。

现在,我们有许多计数模式。

我们将在本视频中使用的是

向上计数模式。基本来说,

计数器将向上计数,0,1,2,3。

当它达到该溢出值,

也就是这里的结束值之后, 它将重新回到 0、1、2、3。

因此您现在可以看到,如果 我把该常量设置为 n ,

那么就设置了一个触发器,

这里就是我的触发器。

当计数值归零时,它会设置 触发器,因此我们可以看到,

在采用我们前一张幻灯片 所设置的预分频情况下,

在采用我们前一张幻灯片 所设置的预分频情况下,

2 微秒乘以 (n+1),

这将是该置位信号的周期,

或是中断的周期。

很显然,我们可以看到 n 是一个 16 位数字,

因此,这再次说明了时间分辨率与

最大中断时间间隔的比率。

在下一个视频中,我们 将使用向上/向下模式,

并使用其他这些输出位, 但在本视频中,

我们仅会生成一个周期性控制中断。

下面是产生周期性中断的步骤。

下面是产生周期性中断的步骤。

我们必须选择一个时钟, 并且必须选择一个预分频。

正如我在示例中说过的,

我将选择 500kHz、2 微秒 周期的预分频。

我需要对中断进行使能,

我将使能 TA0CCR0 的中断。

然后,我把这里的值 设置成任何周期减 1,

其中周期乘以 2 微秒是 我想要设置的中断周期。

其中周期乘以 2 微秒是 我想要设置的中断周期。

其中周期乘以 2 微秒是 我想要设置的中断周期。

现在,它是一个中断, 因此它具有优先级。

我们将设置嵌套向量中断优先级寄存器。

我们将设置嵌套向量中断优先级寄存器。

还有一个步骤,

我们必须在嵌套向量中断 控制器中开启该中断,

我们必须在嵌套向量中断 控制器中开启该中断,

我们要开启该中断。

在所有初始化完成之后, 我们要在处理器中,

在 primask 中设置 i=0,

这是在 primask 中,

它是处理器中的一个寄存器,

在 C 语言中,我们通过调用 该函数 EnableInterrupts 来执行它。

但要再次强调的是,这个操作 是在所有初始化完成之后。

但要再次强调的是,这个操作 是在所有初始化完成之后。

这里是中断向量表,

正如我说过的, 我们将使用定时器中断,

共有四个定时器模块,

其中每个定时器模块有七个子模块,

因此您在 MSP432 上 可以有多达 28 个

不同的周期性中断。

我们只是将执行其中的一个,

我将使用定时器 2 的子模块 0,

下面将对它进行说明,

如果您查看该文件中的代码,

您将看到中断服务例程的标准定义。

您将看到中断服务例程的标准定义。

您还可以看到,对于这个特定中断,

这是定义中断优先级的 三个 bit 所在的位置。

它位于 NVIC_IPR3 寄存器的 7、6 和 5 中,

它是第 12 个中断 --

我是说 IRQ 12 和中断 28。

因此,我们一会儿将在 代码中看到这个 12。

这里是实际的代码,

这是摘取出来的部分代码, 因此您看到,

它实际上具有一个函数指针。

这个 32 位的变量指向一个

用户函数,该函数以一个函数返回值结束,

然后,当我们调用该函数时,

我们将把这里的用户代码传递过去。

我们将传递该周期,

正如我在前一张幻灯片中所说的,

该周期将具有 2 微秒的单位。

我使这一切工作的方法是,

设置 SMCLK 为 12MHz 时钟,

并在那里选择 4 预分频, 在这里选择 6 预分频,

这将生成我的 2 微秒周期。

之前说过,我将使用向上计数模式,

因此我要在这里将定时器设置为 以向上计数模式运行。

我将 -- 周期性中断是另一个名称 -- 使用比较模式。

我将 -- 周期性中断是另一个名称 -- 使用比较模式。

我将 -- 周期性中断是另一个名称 -- 使用比较模式。

在比较模式下,换句话说, 当计数器达到这里的值之后,

它会把重载标志位置 0 并继续计数。

这里是中断优先级寄存器 3 的位 7-5 ,

这里是中断优先级寄存器 3 的位 7-5 ,

它将设置中断优先级,

我告诉过您它是中断 12。

我通过设置嵌套向量中断控制器 的设置位 12 来使能该中断。

我通过设置嵌套向量中断控制器 的设置位 12 来使能该中断。

正如我说过的,我们要

首先初始化所有设备,然后再

启用中断。

这是中断服务例程 看起来的样子。

您应该记得, 对于 Systick,

引发 Systick 的标志 在 Systick 中断运行时

自动清除。

而对于定时器来说不是这样。

这里是我们说过的触发标志位, 它位于 CCTL 的位 0 中。

这是导致该中断发生的标志位,

因此为了能识别该中断,

需要将该标志位清除,

我将在这里清除该标志位。

然后,我将调用本例中特定的用户函数。

然后,我将调用本例中特定的用户函数。

然后,我将调用本例中特定的用户函数。

现在,这是定时器 A2 子模块 0。

对于实验,您必须做的是, 在定时器 A 子模块 0 上

创建一个周期性中断 --

我是说定时器 A0 子模块 0。

因此,有几项 内容必须改变。

在这里,所有您 看到 2 的位置 --

它们必须变为 0。

在这里,这是 中断 12 -- 这

必须变为中断 10。

在这里,这是 中断优先级

3 寄存器 位 7、6、5 --

它必须是中断 优先级 2 寄存器。

这里的位,23、22 和 21。

这里的位,23、22 和 21。

这些是基本的差异。

除此之外,这全部 四个模块具有非常

类似的工作方式。

总之,我们讨论了

定时器,它具有输入、输出功能和

周期性中断。

本节中我们特别讨论了使用定时器

来创建其它周期性运行的线程。

来创建其它周期性运行的线程。

正如我提到过的,您的 系统上有四个定时器 --

定时器 A0、A1、A2、A3。

在本视频中的代码向您展示了 如何控制定时器 A1,

在本视频中的代码向您展示了 如何使用定时器 A1,

您的任务是使用定时器 A0 , 并根据需要使用定时器 A2 和 A3。

希望您喜欢本实验。

在下一个视频中,

我们将扩展定时器的功能,

以生成脉宽调制输出。

好,希望您喜欢本次实验。 256

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

相关下载

查看全部

视频简介

TI-RSLK 模块 13 - 讲座视频 - 脉宽调制

所属课程:TI机器人系统学习套件(TI-RSLK) 发布时间:2018.08.27 视频集数:69 本节视频时长:18:36
在该模块中,你将学习如何通过硬件PWM将直流电机进行连接。
已有6人参与了讨论去论坛跟帖交流