天南地北客
发表于: 2018-5-15 16:30:35 | 显示全部楼层

本篇文章是MSP430G2 LaunchPad系列教程的一部分,我们正在学习使用德州仪器的MSP430G2 LaunchPad开发板。到目前为止,我们已经学习了开发板的基础知识,并介绍了如何读取模拟电压以及使用MSP430G2进行连接LCD等。现在我们继续了解MSP430G2单片机中的PWM模块。我们将通过改变电位器来控制LED的亮度,因此,将电位器连接到MSP430的模拟引脚,然后读取其模拟电压,因此建议在继续学习之前先了解ADC的文章


什么是PWM信号?

脉宽调制(PWM)是控制电路中最常用的数字信号。该信号以预定的时间和速度设置为高电平(3.3v)和低电平(0v)。信号保持高电平的时间称为“开启时间”,信号保持低电平的时间称为“关闭时间”。如下所述,PWM有两个重要参数:


PWM的占空比:

PWM信号保持高电平的时间百分比称为占空比。如果信号始终处于开启状态,则占空比为100%,如果处于始终关闭状态,则占空比为0%。

占空比=开启时间/(开启时间+关闭时间)

Duty-cycle-of-the-PWM.png


PWM的频率:

PWM信号的频率决定了PWM完成一个周期的速度。如上图所示,一个周期内完成PWM信号的ON和OFF状态。在本篇文章中,频率为500Hz,该值是Energia IDE设置的默认值。

PWM信号的实时应用有很多,PWM信号可以用来控制伺服电机,也可以转换为模拟电压,这样就可以通过电压控制LED的亮度。让我们来了解一下如何实现。


如何将PWM信号转换为模拟电压?

要将PWM信号转换为模拟电压,我们可以使用称为RC滤波器的电路。这是一个简单且最常用的电路。该电路只包括一个电阻和一个电容串联,如下图所示。、

How-to-convert-PWM-signal-to-Analog-voltage.png

该电路主要实现的功能是,当PWM信号为高时,电容器通过电阻器充电,当PWM信号变低时,电容器通过存储的电荷放电。通过这种方式,我们将始终在输出端具有恒定的电压,这将与PWM占空比成正比。


在上面显示的图形中,黄色的一个是PWM信号,蓝色的一个是输出模拟电压。正如你所看到的,输出波形不会是一个纯粹的直流波形,但它应该很适合我们的应用。如果您需要纯粹的直流波来处理其他类型的应用,您应该设计一个开关电路。


电路原理图:

使用MSP430G2生成脉宽调制(PWM)和控制LED亮度的电路图

Circuit-diagram for-generating-Pulse-width-Modulation-(PWM)-using-MSP430G2-and-C.png


电路图非常简单:它只有一个电位器和一个电阻和电容来组成一个RC电路和Led本身。电位器用于提供模拟电压,根据该电压可以控制PWM信号占空比。该电位器的输出连接到模拟电压的引脚P1.0。然后我们必须产生一个PWM信号,这可以通过使用引脚P1.2来完成,然后这个PWM信号被发送到RC滤波器电路,以将PWM信号转换成模拟电压,然后将其提供给LED。


我们应该注意到,并非MSP开发板上的所有引脚都可以读取模拟电压或可以产生PWM引脚,这一点非常重要。下图显示了可以完成特定任务的具体引脚。始终以此为指导来选择您的引脚进行编程。


Blinking-an-LED-on-MSP430G2_0.jpg

如上所示组装完整的电路,您可以使用面包板和少量跳线,并轻松实现连接。


编程MSP430G2 LaunchPad:

一旦硬件准备就绪,我们就可以开始编程。程序中的第一件事是声明我们要使用的引脚。这里我们将使用引脚4(P1.2)作为输出引脚,因为它能够产生PWM。因此,我们创建一个变量并分配引脚名称,以便稍后在程序中引用它。

  1. int PWMpin = 4; //我们将MSP模块的第4个引脚用作PWM引脚
复制代码

接下来我们介绍setup函数。写在这里的任何代码都会只执行一次,这里我们声明使用这个第4引脚作为输出引脚,因为PWM是输出功能。请注意,我们在此使用了变量PWMpin而不是数字4,这样代码看起来更有意义:

  1. void setup() {
  2. pinMode(PWMpin,OUTPUT); //The PEMpin is set as Outptut
  3. }
复制代码

最后我们介绍loop函数。这里写的任何代码都会一次又一次的执行。在这个程序中,我们必须读取模拟电压,并相应地产生一个PWM信号。所以首先让我们先从引脚A0读取模拟电压开始,因为我们已连接到电位器。

在这里,我们使用AanalogRead函数来读取该值,该函数将基于施加到该引脚的电压值从0-1024返回一个值。然后我们将这个值存储到一个名为“val”的变量,如下所示

  1. int val = analogRead(A0); //读取引脚A0的ADC值
复制代码

我们必须将0到1024之间的值从ADC转换为0到255之间的值,以将其赋给PWM功能。将一组数值转换为另一组数值,Energia具有类似于Arduino的map函数。因此,我们将0-1204的值转换为0-255并将其保存回变量“val”中。

  1. val = map(val,0,1023,0,255); // ADC将给出0-1023的值,将其转换为0-255
复制代码

现在我们根据电位器的位置得到一个0-255的变量值。我们所要做的就是在PWM引脚上使用这个值,这可以使用下面的行来完成。

  1. analogWrite(PWMPIN,VAL); //将该值写入PWM引脚。
复制代码

让我们回到为什么0-255被写入PWM引脚的问题。该值0-255决定了PWM信号的占空比。例如,如果信号的值为0,则表示占空比为0%,127为50%,255为100%。


用PWM控制LED的亮度:

一旦你了解了硬件和代码,现在是时候对电路的工作有一些乐趣了。将代码上传到MSP430G2开发板并转动电位器旋钮。当您旋转旋钮时,引脚2上的电压将发生变化,将由微控制器读取,并根据该电压,在引脚4上产生PWM信号。电压越高,占空比越大,反之亦然。

Pulse-width-Modulation-(PWM)-using-MSP430G2-Controlling-Brightness-of-LED.jpg

然后该PWM信号被转换为模拟电压来发光LED。 LED的亮度与PWM信号占空比成正比。除了面包板上的LED之外,您还可以注意到smd LED(红色)的亮度与面包板LED相似。这是LED也连接到相同的引脚,但它没有RC网络,所以它实际上闪烁非常快。你可以在黑暗的房间里摇动电路板来检查闪烁的频率。


代码:

  1. int PWMpin = 4; //We are using the 4th pin on the MSP module as PWM pin

  2. void setup() {
  3. pinMode(PWMpin,OUTPUT); //The PEMpin is set as Outptut
  4. }

  5. void loop() {
  6. int val = analogRead(A0);    // read the ADC value from pin A0
  7. val = map(val, 0, 1023, 0, 255);  //The ADC will give a value of 0-1023 convert it to 0-255
  8. analogWrite(PWMpin,val);  //Write that value to the PWM pin.
  9. }
复制代码

跳转到指定楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 26 | 回复: 45



手机版|

GMT+8, 2024-4-19 08:42 , Processed in 0.148065 second(s), 8 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表