- 本课程为精品课,您可以登录eeworld继续观看:
- 讲座视频 - 脉宽调制
- 登录
- 课程目录
- 课程笔记
大家好,我是 John Valvano。
在本视频中,让我们讨论一下如何使用
定时器来生成脉宽调制输出。
如果您还记得,定时器可用于执行三件事情。
我们将在码盘实验中把它用作输入,
来测量频率或周期。
这将让我们了解轮子的真实转速有多快。
在本实验中,我们要把它用作脉宽调制输出,
来调节电机的功率。
定时器的另一个用途是
产生周期性中断,这样我们可以实现多线程。
在本视频中,我们将重点关注
PWM 以及如何用定时器产生它。
我们用 PWM 驱动电机的策略是
选择一个周期 --
选择一个周期 --
这个周期小于电机的时间常数。
这个周期小于电机的时间常数。
这样一来,电机会对平均值作出响应,
而不是对瞬时的高电平和低电平作出响应。
但是,我们要调节的是占空比,
也就是它处于高电平的时间百分比。
因此,如果我们要为电机提供很大的功率,
我们将需要很大的占空比。
您可以看到,这里的占空比的范围是 0 到 1。
再说一次,我们将使周期保持不变。
如果我们需要更小的功率,那么我们可以减小占空比,
同时保持周期不变。
如果我们需要更小 --
这是一个输出,因此我们可以考虑它的性能指标,
这是一个输出,因此我们可以考虑它的性能指标,
也就是调节范围是多大?
占空比的范围是 0% 到 100%。
占空比的范围是 0% 到 100%。
但有趣的是一个称为精度的概念。
换句话说,我可以产生多少种不同的占空比?
换句话说,我可以产生多少种不同的占空比?
那么,我的系统中有多少不同的占空比?
因为它是一个 16 位定时器,
因此实际上有大量的 --
理论上高达 65,000。
实际上,不会有这么多。
但我们还是可以获得大量不同的占空比,
我一会儿将向您展示具体是多少。
总之,我们在这里的任务是生成两个
脉宽调制输出来驱动电机。
这是对模块 12 的回顾,
这里是我们的电机 --
左侧电机,还有右侧电机。
电机由镍氢电池供电。
电机由镍氢电池供电。
那么,驱动器芯片,也就是这里的 H 桥
那么,驱动器芯片,也就是这里的 H 桥
可以驱动电流向下或向上流动,
我们可以让电流同时向上或向下流动,
或者一个向上、一个向下,
可以采用任一方式。
现在,端口 1 和端口 3 是常规 GPIO,
在这里看到,端口 1 将调节方向。
在这里看到,端口 1 将调节方向。
我们需要向前或向后移动?
端口 3 将是使能引脚或禁用引脚,
如果我想进入低功耗睡眠模式的话。
但本视频重点关注的是端口 2 ,
因为这里将产生脉宽调制输出,
通过它们可以独立驱动左侧和右侧电机。
通过它们可以独立驱动左侧和右侧电机。
这样,我可以为每个电机提供不同功率。
该功能的实现代码是在本课程的
配套例程包中,在其中您可以找到
在 P2.5 和 P2.4 上生成 PWM 的代码。
您在实验中的任务是进行代码移植,
将该功能从 P2.5 转移到 P2.7 ,
以及从 P2.4 转移到 P2.6 ,因为通过这种方式,
我们可以使用连接到电机的引脚来控制电机。
我们可以使用连接到电机的引脚来控制电机。
好,本幻灯片中需要注意的另一件事是 --
注意一下所有这些引脚,好吗?
请记住,本课程是关于输入/输出的,
处理器中有大量的输入/输出引脚。
本幻灯片,我要说的第二件事是 --
MSP432 中有很多定时器,对吧?
有四个定时器子模块,
每个定时器子模块可以连接
多至五个输入/输出引脚,因此 MSP432 上有 20 个引脚,
多至五个输入/输出引脚,因此 MSP432 上有 20 个引脚,
可以通过各种方式与定时器相关联。
以各种方式与定时器相关联。
在本示例中,
将生成两个 PWM 输出,
但您可以看到这个处理器能产生的 PWM
远远大于两个。
好的,那么正如我说过的,这里的目标是实现一个固定的周期。
在定时器内,
周期通过该 TA0CCR0 寄存器设置,
这是该定时器模块中的常量寄存器之一。
那么,我们把该寄存器设置为固定的周期,
接下来我们将调节子模块中的另一个常量,这个常量定义了占空比。
接下来我们将调节子模块中的另一个常量,这个常量定义了占空比。
接下来我们将调节子模块中的另一个常量,这个常量定义了占空比。
那么,这两个常量的比值就是占空比。
通过这种方法,我们可以生成 --
在一个定时器中,
我们可以生成多达四个 PWM 波形,
他们具有相同的频率,以及不同的占空比。
好的,这里的示波器波形展示了
波形的周期 -- 如果您从下降沿数到下降沿,
再看另一个波形的下降沿到下降沿 --
该示例中的两个波形周期是相等的。
一个周期在那里,一个周期在这里。
不同的是占空比。
这个占空比大,这个占空比小。
好的,让我们向您展示它是怎么工作的。
我们将在两个单独的引脚上生成 PWM 输出,
我们将在两个单独的引脚上生成 PWM 输出,
我将仅为您展示图中的这个。
我将使用的定时器模式称为向上/向下计数模式,
这意味着计数器将先向上计数,
然后再向下计数。
我将从 SMCLK 获取我的基本时序。
因此我将获取一个 12MHz 的时钟 --
这是系统模块时钟。
然后,我将选择一个预分频值。
就像产生周期性中断时一样,
我可以调节预分频,以获得更长的范围,
我也可以减小预分频,以获得更大的分辨率。
我将选择预分频 8,
该比率意味着,我的计数器实际上
该比率意味着,我的计数器实际上
该比率意味着,我的计数器实际上
将以 66.7 纳秒的周期进行计时。
那么,这就是它进行计时的方式。
从根本上说,我要做的是
从这里设置 CCR0 的值,
这个常量值将用于设置周期。
因此,这将确定我的 PWM 周期,
因此,这将确定我的 PWM 周期,
正如您知道的,该周期将是一个常数。
如果我想设置一个 10 毫秒的周期 --
该周期小于电机的时间常数,
但仍足够快,使我们有大量的
空间来处理其它任务 --
我将在这里选择一个计数器值
来设置该周期。
我一会儿将展示它如何实现。
向上/向下计数模式,顾名思义 --
在电机接口上,
我们将有一个大得多的计数器值,
但在本幻灯片中,
为了让您能看到所有计数器值,
我选择了一个很小的数字 -- 10。
我选择了一个很小的数字 -- 10。
它工作的方式是,它进行计数 --
10,9,8,7,6,5,4,3,2,1,0 -- 这是向下计数模式,
然后它继续计数 --
1,2,3,4,5,6,7,8,9,10 -- 这是向上计数模式,
9,8,7,6,5,4,3,2,1,0 -- 这是向下计数模式。
因此,向上/向下意味着它首先向上计数,
然后再向下计数,然后再向上,
然后再向下...
你可以看到,如果将波形的周期
与该计数机制相关联,
每个周期将消耗 2 乘以 CCR0 常量 --
您可以看到,这里不是 n 加 1,
而只是 n,因为 0 仅发生一次,
10 也仅发生一次,所有其他数字发生两次
-- 乘以所选的时钟
-- 乘以所选的时钟
预分频 8 除以 12MHz。
我将选择这里的常量,
从而使该周期值为 10 毫秒。
好的,那么现在我已经使时钟运行起来。
我的子模块 0 用于设置周期,
然后其他子模块 --
子模块 1、2、3 和 4 --
可用于生成脉宽调制输出。
我要向您展示其中的两个 --
一个在子模块 1 上,另一个在子模块 2 上。
一个在子模块 1 上,另一个在子模块 2 上。
我要采用的方法是,
使用定时器的 toggle/reset 模式,
它将做的是,它将重置引脚 --
P4.2 是一个输出引脚,它将在
计数器值与 CCR1 相等时变为 0。
但它在向上计数和向下计数时所做的事情不同。
但它在向上计数和向下计数时所做的事情不同。
在向上计数时,它将让引脚清零,
然后,当定时器在向下计数过程中发生匹配时,
它将让引脚置 1 。
好的,我在这里再次选择了一个简单的数字。
该 CCR1 与 CCR0 的比值 --
在该简单的例子中,它是 70% --
它将是我的占空比。
那么,这将是的占空比。
那么,再说一次,如果我向上计数 --
如果我向上计数,将要发生的是,
当它与 7 相匹配时,它将重置输出。
但在进行向下计数时,当它发生匹配时,
它将切换 --
在本例中,也就是将输出置 1 。
那么,再说一次,在向上计数时,它将清除它。
在向下计数时,它将设置它。
因此,通过这种方法,
占空比被设置为 CCR1 和 CCR0 的比值。
占空比被设置为 CCR1 和 CCR0 的比值。
占空比被设置为 CCR1 和 CCR0 的比值。
那么,如果我想调节占空比,
比如说我想从70% 降低到 50%,
我可以把 CCR1 设置成 5。
我可以把 CCR1 设置成 5。
现在将发生的是,当它与 5 匹配时,
它将被置 1 ,并且当它
再次与 5 匹配时将被置 0。
再次与 5 匹配时将被置 0。
再次与 5 匹配时将被置 0。
我所做的是,我在这里把占空比从 70%
更改为 50%。
由于这些是整型常量,
因此您能够看到我可以为 CCR1 选择的值 --
0、1、2、3、4、5、6、7、8 或 9,对吧?
现在,事实证明我无法使用 10,
但我可以选择这些中的任何一个。
那么您可以看到精度,
也就是不同占空比的数量 --
由 CCR0 的值确定 --
占空比的数量由我存储在
CCR0 中的值确定。
这就是精度。
好,那么这里是实际的代码。
这段代码将在 P2.4 和 P2.5 上设置占空比,
您需要把它移植到到 P2.6 和 P2.7。
好的,那么我们将通过函数传递占空比。
我将使用系统模块时钟(SMCLK),
它的频率是总线时钟除以 4。
然后,我将在这里使用预分频 8。
因此该 PWM 的分辨率
将小于 1 毫秒,
我为该占空比选择的周期
是这里的周期值的函数。
那么,占空比的周期
是 2 乘以该参数 --
乘以 8,这是因为我的预分频设置 --
再乘以 SMCLK 的分辨率。
这是替代函数之一。
我们已经清除了选择寄存器所在的位,
现在是时候设置它们了。
这些显然是输出引脚。
我将在 CCI0 上把这设置成切换模式。
这是我的周期。
这里是 1 分频,
我们还将在 ID 中实现预分频 8,
这两个分频一起,将为我产生周期。
我将使用的 PWM 模式称为 toggle/reset,
它向上计数时会将输出引脚置 1,
它向上计数时会将输出引脚置 1,
向下计数时则会做相反操作。
向下计数时则会做相反操作。
占空比由这里的常量确定。
由于有两个定时器,因此我必须执行该操作两次 --
一次针对一个定时器,一次针对子模块 1,
一次针对子模块 2。
在我全部完成之后,我把定时器打开。
我设置 SMCLK,
并进行 8 分频 -- 再说一次,这是向上向下模式,对吧?
那么,在代码里为了实现 1 毫秒周期,
我将把周期设置为 15,000。
那么,如果我乘以8 再除以 12MHz,
这就是我们的 66.7 纳秒。
乘以 2,因为是向上/向下计数模式。
把它乘以 15,000,也就是所传递
到这里的参数。
这将为我生成 10 毫秒的周期。
这是 CCR0。
我们要做的是,设置 CCR1 来确定占空比。
这意味着,CCR1 必须是0 到 15,000 之间的某个值。
这意味着,CCR1 必须是0 到 15,000 之间的某个值。
那么,这段代码所产生 PWM 的精度 --
因为有 15,000 个不同的占空比 --
所以,精度是 14 位。
因此,这是一种非常非常精密的方法
来调节输入到电机的功率。
这就是它为什么如此强大。
现在,这里是例程。
每当我想改变功率时,
我不必再次重写所有代码。
我要做的是,改变 CCR1 来控制一个电机,
然后改变 CCR2 来控制另一个电机。
CCR1 中的值
可以是 0 到 14,998 之间的任何值,
这将为我提供 15,000 的精度,
也就是大约 14 位的精度。
它具有 0% 到 100% 的范围,
这是一种非常非常强大的方法,
帮助我们来调节输入到电机的功率。
正如我先前提到的,
该代码在端口 P2.4 和 P2.5 上运行,
您的任务是把它移植到 P2.6 和 P2.7。
正如您看到的,这可以通过更改这些模块来实现。
该模块 1 和 2 可以更改为模块 3 和 4 --
子模块 3 和 4。
总而言之,PWM 是一种非常强大的技术,
我们可以使用它来调节和影响我们的世界。
在本例中,通过 H 桥,
我们可以调节向电机提供的功率。
我们有两个 H 桥,用于右侧电机和左侧电机。
我们将使波形的周期为常数。
我们将使用 toggle/reset 模式,
它将在一个边沿进行重置,并在另一个边沿进行切换。
这就是脉宽调制。
拿出您的示波器吧,
拿出您的逻辑分析仪,希望您喜欢本次实验。
课程介绍
共计4课时,37分36秒
猜你喜欢
换一换
推荐帖子