在所有的嵌入式应用中几乎都会用到的一个功能就是ADC模块(模数转换器)。这些模数转换器可以读取来自模拟传感器的电压,如温度传感器、倾斜传感器、电流传感器、柔性传感器等等。因此,在本教程中,我们将学习如何通过Energia IDE开发环境使用MSP430G2中的ADC来读取模拟电压。我们将一个小型电位器连接到MSP开发板,并在模拟引脚上施加一个变化的电压,然后读取电压并将其显示在串行监视器上。
ADC模块简介
连接以及编程MSP430G2以读取模拟电压的过程几乎不需要10分钟。但是,让我们先花点时间了解一下MSP开发板上的ADC模块,以便能够在其他的文章中高效使用它。
微控制器是一种数字式设备,也就意味着它只能识别1和0。但在现实世界中,温度、湿度、风速等几乎都是模拟量。为了与这些模拟量变化进行交互,微控制器使用一个称为ADC的模块。有许多不同类型的ADC模块可供选择,我们的MSP开发板中使用的模块是SAR 8通道10位ADC。
逐次逼近型(SAR)ADC:SAR ADC带有一个比较器和一些逻辑器件。这种类型的ADC使用参考电压(可变),并使用比较器将输入电压与参考电压进行比较,并将从最高位(MSB)保存为数字输出的差值。比较速度取决于MSP运行的时钟频率(Fosc)。
10位分辨率:该ADC是一个8通道10位ADC。这里8通道意味着有8个ADC引脚,我们可以用它来测量模拟电压。10位意味着ADC的分辨率。 10位表示2的10次幂,也就是1024。这是我们ADC的采样步数,所以我们的ADC值的范围将从0到1023。基于每步电压的值,该值将从0增加到1023,可以使用下面的公式计算
注意:默认情况下,在Energia中,参考电压将设置为Vcc(~3v),您可以使用analogReference()选项改变参考电压。
电路原理图
在我们之前的教程中,我们已经学会了如何将LCD与MSP430G2进行连接,现在我们只需要在MSP430上增加一个电位器,为其提供可变电压,然后在LCD上显示电压值。如果您不知道如何连接LCD,请点击上面的链接进行阅读。该项目的完整电路图如下。
如图所示,本文使用了两个电位器,一个用于设置LCD的对比度,另一个用于向电路板提供可变电压。在该电位器中,电位器的一端连接到Vcc,另一端连接到地。中心引脚(蓝线)连接到引脚P1.7。该引脚P1.7将提供从0V(地)到3.5V(Vcc)的可变电压。所以我们必须对引脚P1.7进行编程以读取这个可变电压并将其显示在LCD上。
在Energia中,我们需要知道引脚P1.7属于哪个模拟通道?这可以通过参考下面的图片找到
您可以在右侧看到P1.7引脚,该引脚属于A7(通道7)。同样,我们也可以找到其他引脚的相应通道号。您可以使用A0至A7的任何引脚来读取模拟电压,这里我选择了A7。
编程MSP430
对MSP430进行编程,以读取模拟电压,这非常简单。在这个程序中将读取数值的模拟值,并用该值计算电压,然后在LCD屏幕上显示。完整的程序列在本文末尾处,下面我会详细解释该程序,以帮助您更好地理解。
我们从定义LCD引脚开始。这些定义了LCD引脚连接到MSP430的哪个引脚。您可以参考您的连接以确保引脚分别连接
#define RS 2
#define EN 3
#define D4 4
#define D5 5
#define D6 6
#define D7 7
复制代码
接下来,我们包含LCD显示屏的头文件。这样将会调用包含MSP如何与LCD进行通信的代码库。这个库默认安装在Energia IDE中,所以你不需要添加它。还要确保是用上面定义的引脚名称调用的Liquid Crystal函数。
#include <LiquidCrystal.h> //This librarey is insatlled by default along with IDE
LiquidCrystal lcd(RS, EN, D4, D5, D6, D7); //Let the librarey know how we have connected the LCD
复制代码
在setup()函数中,我们只需在LCD屏上显示一个介绍消息。
lcd.begin(16, 2); //We are using a 16*2 LCD display
lcd.setCursor (0,0); //Place the cursor at 1st row 1st column
lcd.print("MSP430G2553"); //Display a intro message
lcd.setCursor(0, 1); // set the cursor to 1st column 2nd row
lcd.print("-CircuitDigest"); //Display a intro message
复制代码
最后,在loop()函数中,我们开始读取A7引脚的电压。正如我们上文所讲,微控制器是一个数字式设备,它不能直接读取电压电平。使用SAR技术,电压电平从0映射到1024。这些值称为ADC值,为了获得此ADC值,只需使用以下代码:
int val = analogRead(A7); // read the ADC value from pin A7
复制代码
这里使用analogRead()函数读取引脚的模拟值,由于我们已将可变电压连接到引脚P1.7,因此我们在其中指定了A7。最后我们将这个值保存在一个名为“val”的变量中。因为我们只能得到从0到1024的值来存储在这个变量中,因此定义这个变量的类型是整数。
下一步将是通过ADC值来计算电压值。要实现这一点,我们通过以下公式:
Voltage = (ADC Value / ADC Resolution) * Reference Voltage
复制代码
在本文中,我们已经知道微控制器的ADC分辨率是1024。ADC值也在上一行代码中找到并存储名为val的变量。参考电压等于微控制器工作时的电压。当MSP430开发板通过USB电缆供电时,工作电压为3.6V。您也可以通过在电路板上的Vcc和接地引脚上使用万用表来测量工作电压。所以上面的公式适合我们的情况,如下所示
float voltage = (float(val)/1024) * 3.6; //formulae to convert the ADC value to voltage
复制代码
你可能会不理解float(val)。这用于将变量“val”从int数据类型转换为“float”数据类型。这个转换是必须的,因为只有当我们得到val / 1024的结果在浮点数时,我们可以乘以3.6。如果该值以整数形式接收,它将始终为0,结果也将为零。一旦我们计算出了ADC值和电压,剩下的就是在LCD液晶屏上显示结果,这可以通过使用以下几行代码来实现:
lcd.setCursor(0, 0); // set the cursor to column 0, line 0
lcd.print("ADC Val:");
lcd.print(val); //Display ADC value
lcd.setCursor(0, 1); // set the cursor to column 0, line 1
lcd.print("Voltage:");
lcd.print(voltage); //Display voltage
复制代码
这里我们在第一行显示了ADC值,第二行显示电压值。最后我们延迟100毫秒,然后擦除LCD显示屏。每100毫秒刷新显示值。
测试你的结果!
最后,我们回到有趣的部分,对程序进行测试。按照电路图中所示进行连接。我使用了一个小型面包板来建立连接,并使用跳线将面包板连接到MSP430。连接完成后,如下所示。
然后通过Energia IDE将程序上传到MSP430开发板。您应该能够在液晶显示屏看到一段介绍信息,如果没有,请使用电位器调整液晶显示器的对比度,直到看到清晰的文字。或者,请尝试按下复位按钮。如果事情按预期工作,那么您应该可以看到以下界面。
现在改变电位器,你也应该看到LCD上显示的电压变化。 让我们来验证一下是否正确地测量到电压,请使用万用表来测量POT中心和地面之间的电压。万用表上显示的电压应接近LCD上显示的值,如下图所示。
这就是本文的全部内容,我们介绍了如何使用MSP430开发板的ADC来测量模拟电压。 现在我们可以将许多模拟传感器与开发板连接起来,并读取实时参数。
|