什么是PWM信号?
脉宽调制(PWM)是控制电路中最常用的数字信号。该信号以预定的时间和速度设置为高电平(3.3v)和低电平(0v)。信号保持高电平的时间称为“开启时间”,信号保持低电平的时间称为“关闭时间”。如下所述,PWM有两个重要参数:
PWM的占空比:
PWM信号保持高电平的时间百分比称为占空比。如果信号始终处于开启状态,则占空比为100%,如果处于始终关闭状态,则占空比为0%。
占空比=开启时间/(开启时间+关闭时间)
PWM信号的频率决定了PWM完成一个周期的速度。如上图所示,一个周期内完成PWM信号的ON和OFF状态。在本篇文章中,频率为500Hz,该值是Energia IDE设置的默认值。
PWM信号的实时应用有很多,PWM信号可以用来控制伺服电机,也可以转换为模拟电压,这样就可以通过电压控制LED的亮度。让我们来了解一下如何实现。
如何将PWM信号转换为模拟电压?
要将PWM信号转换为模拟电压,我们可以使用称为RC滤波器的电路。这是一个简单且最常用的电路。该电路只包括一个电阻和一个电容串联,如下图所示。、
该电路主要实现的功能是,当PWM信号为高时,电容器通过电阻器充电,当PWM信号变低时,电容器通过存储的电荷放电。通过这种方式,我们将始终在输出端具有恒定的电压,这将与PWM占空比成正比。
在上面显示的图形中,黄色的一个是PWM信号,蓝色的一个是输出模拟电压。正如你所看到的,输出波形不会是一个纯粹的直流波形,但它应该很适合我们的应用。如果您需要纯粹的直流波来处理其他类型的应用,您应该设计一个开关电路。
电路原理图:
使用MSP430G2生成脉宽调制(PWM)和控制LED亮度的电路图
电路图非常简单:它只有一个电位器和一个电阻和电容来组成一个RC电路和Led本身。电位器用于提供模拟电压,根据该电压可以控制PWM信号占空比。该电位器的输出连接到模拟电压的引脚P1.0。然后我们必须产生一个PWM信号,这可以通过使用引脚P1.2来完成,然后这个PWM信号被发送到RC滤波器电路,以将PWM信号转换成模拟电压,然后将其提供给LED。
我们应该注意到,并非MSP开发板上的所有引脚都可以读取模拟电压或可以产生PWM引脚,这一点非常重要。下图显示了可以完成特定任务的具体引脚。始终以此为指导来选择您的引脚进行编程。
如上所示组装完整的电路,您可以使用面包板和少量跳线,并轻松实现连接。
编程MSP430G2 LaunchPad:
一旦硬件准备就绪,我们就可以开始编程。程序中的第一件事是声明我们要使用的引脚。这里我们将使用引脚4(P1.2)作为输出引脚,因为它能够产生PWM。因此,我们创建一个变量并分配引脚名称,以便稍后在程序中引用它。
int PWMpin = 4; //我们将MSP模块的第4个引脚用作PWM引脚
复制代码
接下来我们介绍setup函数。写在这里的任何代码都会只执行一次,这里我们声明使用这个第4引脚作为输出引脚,因为PWM是输出功能。请注意,我们在此使用了变量PWMpin而不是数字4,这样代码看起来更有意义:
void setup() {
pinMode(PWMpin,OUTPUT); //The PEMpin is set as Outptut
}
复制代码
最后我们介绍loop函数。这里写的任何代码都会一次又一次的执行。在这个程序中,我们必须读取模拟电压,并相应地产生一个PWM信号。所以首先让我们先从引脚A0读取模拟电压开始,因为我们已连接到电位器。
在这里,我们使用AanalogRead函数来读取该值,该函数将基于施加到该引脚的电压值从0-1024返回一个值。然后我们将这个值存储到一个名为“val”的变量,如下所示
int val = analogRead(A0); //读取引脚A0的ADC值
复制代码
我们必须将0到1024之间的值从ADC转换为0到255之间的值,以将其赋给PWM功能。将一组数值转换为另一组数值,Energia具有类似于Arduino的map函数。因此,我们将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,则表示占空比为0%,127为50%,255为100%。
用PWM控制LED的亮度:
一旦你了解了硬件和代码,现在是时候对电路的工作有一些乐趣了。将代码上传到MSP430G2开发板并转动电位器旋钮。当您旋转旋钮时,引脚2上的电压将发生变化,将由微控制器读取,并根据该电压,在引脚4上产生PWM信号。电压越高,占空比越大,反之亦然。
然后该PWM信号被转换为模拟电压来发光LED。 LED的亮度与PWM信号占空比成正比。除了面包板上的LED之外,您还可以注意到smd LED(红色)的亮度与面包板LED相似。这是LED也连接到相同的引脚,但它没有RC网络,所以它实际上闪烁非常快。你可以在黑暗的房间里摇动电路板来检查闪烁的频率。
代码:
int PWMpin = 4; //We are using the 4th pin on the MSP module as PWM pin
void setup() {
pinMode(PWMpin,OUTPUT); //The PEMpin is set as Outptut
}
void loop() {
int val = analogRead(A0); // read the ADC value from pin A0
val = map(val, 0, 1023, 0, 255); //The ADC will give a value of 0-1023 convert it to 0-255
analogWrite(PWMpin,val); //Write that value to the PWM pin.
}
复制代码