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等于十的幂(2 10),即1024的幂。这是ADC的采样步数,因此ADC值的范围是0到1023。该值将从0增加到1023基于每步的电压值,可以使用以下公式计算得出
注意:默认情况下,在Energia中,参考电压将设置为Vcc(〜3v),您可以使用 analogReference() 选项更改参考电压。
还要检查如何将ADC与其他微控制器接口:
- 如何在Arduino Uno中使用ADC?
- ADC0808与8051单片机的接口
- 使用PIC单片机的ADC模块
- Raspberry Pi ADC教程
电路原理图:
在之前的教程中,我们已经学习了如何将LCD与MSP430G2接口,现在我们将向MSP430添加一个电位计以为其提供可变电压并在LCD上显示电压值。如果您不知道如何连接LCD,请退回到上面的链接并通读它,因为我将跳过该信息以避免re悔。该项目的完整电路图如下。
如您所见,这里使用了两个电位器,一个用于设置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中,因此您无需费心添加它。还要确保使用上面刚刚定义的引脚名称调用液晶功能。
#包括
在 setup() 函数内部,我们只给出一个介绍性消息,该消息将显示在LCD屏幕上。由于我们已经学习了如何在MSP430G2上使用LCD,因此我不会太深入。
lcd.begin(16,2); //我们使用的是16 * 2 LCD显示屏 lcd.setCursor(0,0); //将光标 置于 第一行第一列lcd.print(“ MSP430G2553”); //显示介绍性消息lcd.setCursor(0,1); //将光标设置为第一列第二行 lcd.print(“-CircuitDigest”); //显示介绍性消息
最后,在无限 循环() 函数内部,我们开始读取提供给A7引脚的电压。正如我们已经讨论的那样,微控制器是数字设备,它不能直接读取电压电平。使用SAR技术,电压电平从0映射到1024。这些值称为ADC值,只需使用以下行即可获得该ADC值
int val = AnalogRead(A7); //从引脚A7读取ADC值
此处,函数 AnalogRead() 用于读取引脚的模拟值,由于已将可变电压连接到引脚P1.7,因此在其中指定了A7。最后,我们将此值保存在一个名为“ val ”的变量中。此变量的类型为整数,因为我们只会获取0到1024之间的值以存储在此变量中。
下一步将是根据ADC值计算电压值。为此,我们有以下公式
电压=(ADC值/ ADC分辨率)*参考电压
在我们的案例中,我们已经知道微控制器的ADC分辨率为1024。在上一行中也找到了ADC值,并存储了名为val的变量。所述参考电压等于在该微控制器正在操作的电压。当MSP430板通过USB电缆供电时,工作电压为3.6V。您还可以使用万用表在板上的Vcc和接地引脚上测量工作电压。所以上面的公式适合我们的情况,如下所示
浮动电压=(float(val)/ 1024)* 3.6; //将ADC值转换为电压的公式
您可能对 float(val) 行感到困惑 。 这用于将变量“ val”从int数据类型转换为“ float”数据类型。这种转换是必需的,因为只有当我们在float中获得val / 1024的结果时,我们才能将其乘以3.6。如果以整数形式接收到该值,则该值将始终为0,结果也将为零。计算完ADC值和电压后,剩下的就是在LCD屏幕上显示结果,可以使用以下几行代码完成
lcd.setCursor(0,0); //将光标设置到第0列第0行 lcd.print(“ ADC Val:”); lcd.print(val); //显示ADC值 lcd.setCursor(0,1); //将光标设置到第0列第1行 lcd.print(“ Voltage:”); lcd.print(电压); //显示电压
在这里,我们在第一行显示了ADC的值,在第二行显示了Voltage的值。最后,我们将延迟100毫秒,并清除LCD屏幕。该值每100密耳将更新一次。
测试您的结果!
最后,我们进入有趣的部分,该部分是测试我们的程序并进行试用。只需按照电路图所示进行连接即可。我使用了一块小型面包板进行连接,并使用跳线将面包板连接至MSP430。一旦连接完成,我的如下所示。
然后通过Energia IDE将下面给出的程序上载到MSP430板上。如果未使用电位计调节LCD的对比度,直到您看到清晰的文字,您都应该能够在LCD上看到介绍性文字。另外,尝试按重设按钮。如果一切正常,那么您应该可以看到以下屏幕。
现在改变电位器,您还应该看到LCD上显示的电压发生变化。让我们验证是否正确测量了电压,使用万用表测量POT中心和地面之间的电压。如下图所示,万用表上显示的电压应接近LCD上显示的值。
就是这样,我们已经学会了如何使用MSP430板的ADC测量模拟电压。现在,我们可以将许多模拟传感器与我们的板连接起来,以读取实时参数。希望您理解并喜欢本教程,如果有任何问题,请通过下面的评论部分或通过论坛与我们联系。让我们通过另一个新主题来了解MSP430的另一个教程。