天南地北客
发表于: 2018-4-24 17:29:25 | 显示全部楼层

在所有的嵌入式应用中几乎都会用到的一个功能就是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,可以使用下面的公式计算

Formula-for-voltage-per-step.png


注意:默认情况下,在Energia中,参考电压将设置为Vcc(〜3v),您可以使用analogReference()选项改变参考电压。


电路原理图

在我们之前的教程中,我们已经学会了如何将LCD与MSP430G2进行连接,现在我们只需要在MSP430上增加一个电位器,为其提供可变电压,然后在LCD上显示电压值。如果您不知道如何连接LCD,请点击上面的链接进行阅读。该项目的完整电路图如下。

Circuit-diagrram-for-using-ADC-in-MSP430G2-Measuring-Analog-Voltage.png


如图所示,本文使用了两个电位器,一个用于设置LCD的对比度,另一个用于向电路板提供可变电压。在该电位器中,电位器的一端连接到Vcc,另一端连接到地。中心引脚(蓝线)连接到引脚P1.7。该引脚P1.7将提供从0V(地)到3.5V(Vcc)的可变电压。所以我们必须对引脚P1.7进行编程以读取这个可变电压并将其显示在LCD上。


在Energia中,我们需要知道引脚P1.7属于哪个模拟通道?这可以通过参考下面的图片找到

Blinking-an-LED-on-MSP430G2_0.jpg

您可以在右侧看到P1.7引脚,该引脚属于A7(通道7)。同样,我们也可以找到其他引脚的相应通道号。您可以使用A0至A7的任何引脚来读取模拟电压,这里我选择了A7。


编程MSP430

对MSP430进行编程,以读取模拟电压,这非常简单。在这个程序中将读取数值的模拟值,并用该值计算电压,然后在LCD屏幕上显示。完整的程序列在本文末尾处,下面我会详细解释该程序,以帮助您更好地理解。


我们从定义LCD引脚开始。这些定义了LCD引脚连接到MSP430的哪个引脚。您可以参考您的连接以确保引脚分别连接

  1. #define RS 2
  2. #define EN 3
  3. #define D4 4
  4. #define D5 5
  5. #define D6 6
  6. #define D7 7
复制代码

接下来,我们包含LCD显示屏的头文件。这样将会调用包含MSP如何与LCD进行通信的代码库。这个库默认安装在Energia IDE中,所以你不需要添加它。还要确保是用上面定义的引脚名称调用的Liquid Crystal函数。

  1. #include <LiquidCrystal.h> //This librarey is insatlled by default along with IDE
  2. LiquidCrystal lcd(RS, EN, D4, D5, D6, D7); //Let the librarey know how we have connected the LCD
复制代码

setup()函数中,我们只需在LCD屏上显示一个介绍消息。

  1.   lcd.begin(16, 2); //We are using a 16*2 LCD display
  2.   lcd.setCursor (0,0); //Place the cursor at 1st row 1st column
  3.   lcd.print("MSP430G2553"); //Display a intro message
  4.   lcd.setCursor(0, 1);   // set the cursor to 1st column 2nd row
  5.   lcd.print("-CircuitDigest"); //Display a intro message
复制代码

最后,在loop()函数中,我们开始读取A7引脚的电压。正如我们上文所讲,微控制器是一个数字式设备,它不能直接读取电压电平。使用SAR技术,电压电平从0映射到1024。这些值称为ADC值,为了获得此ADC值,只需使用以下代码:

  1.   int val = analogRead(A7);    // read the ADC value from pin A7
复制代码

这里使用analogRead()函数读取引脚的模拟值,由于我们已将可变电压连接到引脚P1.7,因此我们在其中指定了A7。最后我们将这个值保存在一个名为“val”的变量中。因为我们只能得到从0到1024的值来存储在这个变量中,因此定义这个变量的类型是整数。


下一步将是通过ADC值来计算电压值。要实现这一点,我们通过以下公式:

  1. Voltage = (ADC Value / ADC Resolution) * Reference Voltage
复制代码

在本文中,我们已经知道微控制器的ADC分辨率是1024。ADC值也在上一行代码中找到并存储名为val的变量。参考电压等于微控制器工作时的电压。当MSP430开发板通过USB电缆供电时,工作电压为3.6V。您也可以通过在电路板上的Vcc和接地引脚上使用万用表来测量工作电压。所以上面的公式适合我们的情况,如下所示

  1.   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液晶屏上显示结果,这可以通过使用以下几行代码来实现:

  1.   lcd.setCursor(0, 0);   // set the cursor to column 0, line 0
  2.   lcd.print("ADC Val:");
  3.   lcd.print(val); //Display ADC value
  4.   lcd.setCursor(0, 1);   // set the cursor to column 0, line 1
  5.   lcd.print("Voltage:");
  6.   lcd.print(voltage); //Display voltage
复制代码

这里我们在第一行显示了ADC值,第二行显示电压值。最后我们延迟100毫秒,然后擦除LCD显示屏。每100毫秒刷新显示值。


测试你的结果!

最后,我们回到有趣的部分,对程序进行测试。按照电路图中所示进行连接。我使用了一个小型面包板来建立连接,并使用跳线将面包板连接到MSP430。连接完成后,如下所示。

Circuit-Hardware-for-using-ADC-in-MSP430G2-Measuring-Analog-Voltage.jpg


然后通过Energia IDE将程序上传到MSP430开发板。您应该能够在液晶显示屏看到一段介绍信息,如果没有,请使用电位器调整液晶显示器的对比度,直到看到清晰的文字。或者,请尝试按下复位按钮。如果事情按预期工作,那么您应该可以看到以下界面。

How-to-use-ADC-in-MSP430G2-Measuring-Analog-Voltage.jpg


现在改变电位器,你也应该看到LCD上显示的电压变化。 让我们来验证一下是否正确地测量到电压,请使用万用表来测量POT中心和地面之间的电压。万用表上显示的电压应接近LCD上显示的值,如下图所示。

Using-ADC-in-MSP430G2-Measuring-Analog-Voltage.jpg


这就是本文的全部内容,我们介绍了如何使用MSP430开发板的ADC来测量模拟电压。 现在我们可以将许多模拟传感器与开发板连接起来,并读取实时参数。 希望您理解了本文的内容,如果您有任何问题,请在本文下面进行回复。


代码

本文使用的完整代码如下: main.rar (679 Bytes, 下载次数: 431)

跳转到指定楼层
青沉123
发表于: 2018-6-3 22:24:42 | 显示全部楼层

楼主,我想不接显示屏只用一个电位器实现AD转换,应该怎么做?求个具体编程,谢谢
回复

使用道具 举报

李轩昂
发表于: 2018-7-19 16:20:58 | 显示全部楼层

楼主是不是发错代码了
回复

使用道具 举报

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

李轩昂 发表于 2018-7-19 16:20
楼主是不是发错代码了

确实发错了,不好意思。 已更新代码部分
回复

使用道具 举报

李轩昂
发表于: 2018-7-19 20:54:26 | 显示全部楼层

楼主有这块板子12864B的代码吗
回复

使用道具 举报

天南地北客
发表于: 2018-7-19 21:38:23 | 显示全部楼层

李轩昂 发表于 2018-7-19 20:54
楼主有这块板子12864B的代码吗

暂时还没有用到
回复

使用道具 举报

李轩昂
发表于: 2018-7-20 10:09:20 | 显示全部楼层


检测频率的呢
回复

使用道具 举报

阿卓
发表于: 2019-5-23 04:16:44 | 显示全部楼层

楼主,请问如何要变成多通道依此采样需要如何修改呢
回复

使用道具 举报

clownyuy
发表于: 2019-8-9 22:49:06 | 显示全部楼层

天南地北客 发表于 2018-7-19 16:35
确实发错了,不好意思。 已更新代码部分

能重新发完整的代码吗?
回复

使用道具 举报

wakerjiang
发表于: 2020-2-21 11:22:52 | 显示全部楼层

用energia 跟着做了一些实验, 可是没看到有用MSP430 LPM 功能的, 如果不用LPM 使用MSP430 这样低功耗的片子,还有什么意思呢 ,求大神指路
我是应该继续使用Energia  还是回到IAE 从寄存器操作开始继续学习呢?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



手机版|

GMT+8, 2024-11-8 00:42 , Processed in 0.067857 second(s), 5 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

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

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