如何在MSP430G2中使用ADC使用Energia IDE读取模拟电压

描述

几乎所有嵌入式应用中使用的一个共同特性是ADC模块(模数转换器)。这些模数转换器可以从温度传感器、倾斜传感器、电流传感器、柔性传感器等模拟传感器读取电压。因此,在本教程中,我们将学习如何在MSP430G2中使用ADC使用Energia IDE读取模拟电压。我们将一个小电位计连接到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 次方 (210) 即 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。

针对 ADC 对 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中,因此您无需费心添加它。还要确保使用我们上面刚刚定义的引脚名称调用函数液晶。

#include //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与MSP430G2一起使用。

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

最后,在我们的无限循环()函数中,我们开始读取提供给A7引脚的电压。正如我们已经讨论过的,微控制器是一个数字设备,它不能直接读取电压电平。使用SAR技术,电压电平从0映射到1024。这些值称为 ADC 值,要获取此 ADC 值,只需使用以下行

int val = analogRead(A7);    // read the ADC value from pin A7

这里函数analogRead()用于读取引脚的模拟值,我们在它里面指定了 A7,因为我们已将可变电压连接到引脚 P1.7。最后,我们将此值保存在名为“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

您可能会对线浮点数 (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上看到介绍文字,如果不使用电位计调整LCD的对比度,直到看到清晰的文字。另外,请尝试按下重置按钮。如果一切按预期工作,那么您应该能够看到以下屏幕。

模拟电压

现在改变电位计,您还应该看到LCD中显示的电压发生变化。让我们验证一下是否正确测量了电压 为此,请使用万用表测量 POT 中心和地面上的电压。万用表上显示的电压应接近LCD上显示的值,如下图所示。

模拟电压

就是这样,我们已经学会了如何使用MSP430板的ADC测量模拟电压。现在,我们可以将许多模拟传感器与我们的电路板连接,以读取实时参数。

/*

* Reading Analog Voltage with MSP430 using Energia 

*/


#define RS 2

#define EN 3

#define D4 4

#define D5 5

#define D6 6

#define D7 7





#include //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


void setup() {

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




delay(2000); //Wait for display to show info

lcd.clear(); //Then clean it


}



void loop() {

int val = analogRead(A7); // read the ADC value from pin A7

Voltage = (ADC Value / ADC Resolution) * Reference Voltage

float voltage = (float(val)/1024) * 3.6; //formulae to convert the ADC value to voltage



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



}


 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分