本教程是MSP430G2 LaunchPad系列教程的一部分,我们在其中学习如何使用德州仪器(TI)的MSP430G2 LaunchPad。到目前为止,我们已经学习了板子的基础知识,并介绍了如何读取模拟电压,与MSP430G2接口的LCD等。现在,我们继续进行有关MSP430G2中PWM的学习的下一步。我们将通过改变电位器来控制LED的亮度来做到这一点。因此,电位计将连接到MSP430的模拟引脚以读取其模拟电压,因此建议您在继续之前先了解一下ADC教程。
什么是PWM信号?
脉宽调制(PWM)是一种数字信号,最常用于控制电路中。该信号在预定义的时间和速度中设置为高(3.3v)和低(0v)。信号保持高电平的时间称为“开启时间”,信号保持低电平的时间称为“关闭时间”。如下所述,PWM有两个重要参数:
PWM的占空比:
PWM信号保持高电平(导通时间)的时间百分比称为占空比。如果信号始终为ON,则占空比为100%;如果信号始终为OFF,则占空比为0%。
占空比=打开时间/(打开时间+关闭时间)
PWM频率:
PWM信号的频率决定了PWM完成一个周期的速度。如上图所示,一个周期完成了PWM信号的ON和OFF。在我们的教程中,频率为500Hz,因为它是Energia IDE设置的默认值。
实时有许多PWM信号的应用程序,但给您一个想法,PWM信号可用于控制伺服电机,也可转换为模拟电压,以控制LED亮度。让我们学习一下如何做到这一点。
以下是其他微控制器的一些PWM示例:
- 使用带有MPLAB和XC8的PIC单片机生成PWM
- Raspberry Pi伺服电机控制
- 使用PWM的基于Arduino的LED调光器
在此处检查所有与PWM相关的项目。
如何将PWM信号转换为模拟电压?
要将PWM信号转换为模拟电压,可以使用称为RC滤波器的电路。这是一个简单且最常用的电路。该电路仅包括串联的电阻和电容器,如下电路所示。
因此,这里发生的基本上是当PWM信号为高电平时,电容器通过电阻充电,而当PWM信号为低电平时,电容器通过存储的电荷放电。这样,我们将始终在输出端具有恒定的电压,该电压与PWM占空比成正比。
在上图中,黄色是PWM信号,蓝色是输出模拟电压。如您所见,输出波将不是纯直流波,但对于我们的应用来说应该很好。如果您需要纯直流波用于其他类型的应用,则应设计一个开关电路。
电路原理图:
电路图非常简单;它只有一个电位计,一个电阻器和一个电容器来构成RC电路和LED本身。电位器用于提供模拟电压,基于该电压可以控制PWM信号占空比。电位计的输出连接到引脚P1.0,该引脚可以读取模拟电压。然后,我们必须产生一个PWM信号,可以通过使用引脚P1.2来完成,然后将该PWM信号发送到RC滤波电路,以将PWM信号转换为模拟电压,然后将其提供给LED。
重要的是要理解,并非MSP板上的所有引脚都可以读取模拟电压或可以生成PWM引脚。下图显示了可以完成特定任务的特定引脚。始终以此为指导来选择用于编程的引脚。
如上所示组装完整的电路,您可以使用面包板和少量跳线,并轻松进行连接。连接完成后,我的电路板如下图所示。
为MSP编程PWM信号:
硬件准备就绪后,我们就可以开始编程了。程序中的第一件事是声明我们将要使用的引脚。在这里,我们将使用引脚号4(P1.2)作为我们的输出引脚,因为它具有生成PWM的能力。因此,我们创建了一个变量并分配了引脚名称,以便以后在程序中轻松引用它。最后给出了完整的程序。
整数PWMpin = 4; //我们将MSP模块的第4引脚用作PWM引脚
接下来我们进入 设置 功能。无论此处写入的代码将只执行一次,在这里我们声明由于PWM是输出功能,因此将第4引脚用作输出引脚。请注意,我们在这里使用了变量 PWMpin 而不是数字4,因此代码看起来更有意义
void setup(){ pinMode(PWMpin,OUTPUT); //将PEMpin设置为Outptut }
最后,我们进入 循环 功能。无论我们在这里写什么,都会一次又一次地执行。在此程序中,我们必须读取模拟电压并相应地生成PWM信号,并且这必须反复发生。所以首先让我们从引脚A0读取模拟电压开始,因为我们已将其连接到电位计。
在这里,我们使用 AanalogRead 函数读取值,该函数将根据施加到引脚的电压值返回0-1024之间的值。然后,我们将该值存储到一个名为“ val”的变量中,如下所示
int val = AnalogRead(A0); //从引脚A0读取ADC值
我们必须将ADC的0到1024的值转换为0到255的值,以将其提供给PWM功能。我们为什么要转换它?我会很快告诉您,但现在请记住我们必须进行转换。要将一组值转换为另一组值,Energia具有类似于Arduino的 映射 功能。因此,我们将0-1204的值转换为0-255并将其保存回变量“ val”中。
val = map(val ,0,1023,0,255); // ADC的值为0-1023,将其转换为0-255
现在,根据电位计的位置,我们将变量值设置为0-255。我们要做的就是在PWM引脚上使用该值,可以使用以下代码行完成。
AnalogWrite(PWMpin,val ); //将该值写入PWM引脚。
让我们回到为什么将0-255写入PWM引脚的问题。该值0-255决定PWM信号的占空比。例如,如果信号的值为0,则表示占空比为127的占空比为0%,为50%,对于255的占空比为100%,就像本文顶部显示和说明的那样。
通过PWM控制LED的亮度:
一旦您了解了硬件和代码,就可以开始研究电路的工作了。将代码上传到MSP430G2开发板,然后旋转电位计旋钮。旋转旋钮时,引脚2上的电压将变化,微控制器将读取该电压,并根据电压在引脚4上生成PWM信号。电压越大,占空比越大,反之亦然。
然后,该PWM信号将转换为模拟电压以使LED发光。LED的亮度与PWM信号占空比成正比。除了面包板上的LED之外,您还可以注意到smd LED(红色)的亮度类似于面包板上的LED。该LED也连接到同一引脚,但是它没有RC网络,因此实际上闪烁非常快。您可以在黑暗的房间里摇动木板,以检查其闪烁的性质。完整的工作原理也可以在下面的视频中看到。
到此为止,我们已经学习了如何在MSP430G2板上使用PWM信号,在下一个教程中,我们将学习使用相同的PWM信号控制伺服电机有多么容易。如果您有任何疑问,请将它们发布在下面的评论部分或论坛上,以寻求技术帮助。